2

Facebookを統合するXcode 4.5のアプリケーションがあります。ARCを使用しています。アプリケーションはネイティブ ダイアログを使用するため、非推奨のヘッダー (つまり、Facebook.h) を使用します。どうやらそうすると、アクティブなセッションを閉じる/クリーニングするときに次のエラーが発生します。

「クラス FBSessionManualTokenCachingStrategy のインスタンス 0xa089350 は、キー値オブザーバーがまだ登録されている間に割り当てが解除されました。観測情報が漏洩し、他のオブジェクトに誤ってアタッチされる可能性さえあります。」

このエラーを調査したところ、アプリ デリゲートで self.Facebook のインスタンスを初期化すると、Facebook が 1 つではなく 2 つのオブザーバーを追加し、ログアウト時に 1 つだけがクリーンアップされることが問題であると想定しています。この非常にエラーに関するこのページのすべての解決策を含め、両方のインスタンスを削除するために何度も試みました: facebook ios sdk log : strange message

これらの解決策はどれもうまくいきませんでした。これには、ARC を使用しているため使用できない割り当て解除を含む 1 つの解決策が含まれていました。参照用にセッションを開いたり閉じたりするための私のコードは次のとおりです。

- (void)sessionStateChanged:(FBSession *)session
                  state:(FBSessionState) state
                  error:(NSError *)error
{
switch (state) {
    case FBSessionStateOpen:
        if (!error) {
            // We have a valid session

            // Initiate a Facebook instance

            self.facebook = [[Facebook alloc]
                             initWithAppId:FBSession.activeSession.appID
                             andDelegate:nil];

            // Store the Facebook session information
             self.facebook.accessToken = FBSession.activeSession.accessToken;
            self.facebook.expirationDate = FBSession.activeSession.expirationDate;

        }
        break;
    case FBSessionStateClosed:
    case FBSessionStateClosedLoginFailed:
        [FBSession.activeSession closeAndClearTokenInformation];
        // Clear out the Facebook instance
        self.facebook = nil;
        break;
    default:
        break;
}

[[NSNotificationCenter defaultCenter]
 postNotificationName:FBSessionStateChangedNotification
 object:session];

 if (error) {
    UIAlertView *alertView = [[UIAlertView alloc]
                              initWithTitle:@"Error"
                              message:error.localizedDescription
                              delegate:nil
                              cancelButtonTitle:@"OK"
                              otherButtonTitles:nil];
    [alertView show];
 }
}

/*
 * Opens a Facebook session and optionally shows the login UX.
 */

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI //do I need this method?
{
NSArray *permissions = [[NSArray alloc] initWithObjects:
                        @"user_about_me",
                        @"read_friendlists",
                        @"read_stream",
                        @"friends_likes",
                        @"user_likes",
                        @"friends_photos",
                        @"user_photos",
                        nil];

return [FBSession openActiveSessionWithReadPermissions:permissions
                                          allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session,    
                                                    FBSessionState state,
                                                         NSError *error) {
                                         [self sessionStateChanged:session state:state
                                                             error:error]; }];
}

/*
 * If we have a valid session at the time of openURL call, we handle
* Facebook transitions by passing the url argument to handleOpenURL
*/

- (BOOL)application:(UIApplication *)application
        openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
     annotation:(id)annotation {
// attempt to extract a token from the url
return [FBSession.activeSession handleOpenURL:url];
}

- (void) closeSession {
[FBSession.activeSession closeAndClearTokenInformation];
}

誰かがこれを解決する方法について何かガイダンスを提供できるなら、私はそれを大いに感謝します.

4

0 に答える 0