3

私はFacebookiOSSDK(バージョン3.2)を使用していますが、ユーザーがFacebookにアクセスして、承認済みアプリのリストからアプリを削除するまで、すべてが正常に機能します。その時点では、実際にはもう有効ではありませんが、キャッシュされたセッションでログインしています。アクセストークンを強制的にクリアして再度ログインすると、同じ古いアクセストークンが使用されます。

現在application:didFinishLaunchingWithOptions:、セッションをテストするための次のコードがあります。

// Relogin with cached session
if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded) {
    NSLog(@"We're logged in to Facebook!");

    [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:NO completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
        NSLog(@"accessToken: %@", session.accessTokenData.accessToken);
        NSLog(@"status: %i", status);
        NSLog(@"error: %@", error);

        switch (status) {
            case FBSessionStateOpen:
                NSLog(@"FBSessionStateOpen");
                NSLog(@"permissions: %@", session.permissions);
                break;

            case FBSessionStateClosed:
            case FBSessionStateClosedLoginFailed:
                [session closeAndClearTokenInformation];
                [Utilities presentMessage:@"Facebook login failed" withTitle:@"Error" level:MessageLevelError];
                break;

            default:
                break;
        }
    }];
}

アプリを起動するたびに、user_birthdayとメールのアクセス許可でログインしていると表示されます。ただし、取得したaccessTokenを使用してhttps://graph.facebook.com/me?access_token=xxxを開こうとすると、「アクセストークンの検証エラー:ユーザー123がアプリケーション123を承認していません」と返されます。

でトークンをクリアし[FBSession.activeSession closeAndClearTokenInformation];て新しいログインを強制しても効果はありません。私は常にまったく同じ古いaccessTokenになってしまいます。

同様の質問があります(Facebook SDK 3.1 iOS:ユーザーがFacebook設定からアプリを削除した場合はログインを処理します)が、「ユーザーはiOSアプリを閉じて再起動します...この再起動により、iOSアプリは」と表示されます。修正済み」であり、ユーザーがログインしなくなったことを検出します。」私にはこのような振る舞いはまったくありません。

これが私が最初にセッションを開く方法です:

- (void)openFBSession {
    NSArray *perm = @[ @"user_birthday", @"email" ];

    [FBSession openActiveSessionWithReadPermissions:perm allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
        DLog(@"accessToken: %@", session.accessTokenData.accessToken);
        DLog(@"status: %i", status);
        DLog(@"error: %@", error);

        switch (status) {
            case FBSessionStateOpen:
                DLog(@"FBSessionStateOpen");
                // this is where I need to use session.accessTokenData.accessToken, which is stale
                break;

            case FBSessionStateClosed:
            case FBSessionStateClosedLoginFailed:
                [FBSession.activeSession closeAndClearTokenInformation];
                [Utilities presentMessage:@"Facebook login failed" withTitle:@"Error" level:MessageLevelError];
                break;

            default:
                break;
        }
    }];
}
4

1 に答える 1

1

Facebook グラフ API 要求を独自に実行しているときにトークンが無効であることを Facebook SDK が検出しない場合は、iOS にそのトークンをチェックさせる必要があります。

これは、独自のサーバー API を呼び出して (そしてそれにトークンを渡して)、そこでユーザーに代わって呼び出しを行う場合に便利です。そこでトークンが無効であることがわかった場合、トークンが無効であることを iOS 6 に伝える唯一の方法は、次のようにすることです。

// Only do this if there is native Facebook Account support (iOS 6+)
BOOL isFacebookAccountsAvailable = (&ACAccountTypeIdentifierFacebook != NULL);
if (isFacebookAccountsAvailable) {
    ACAccountStore *accountStore = [ACAccountStore new];
    ACAccountType *accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];

    for (ACAccount *fbAccount in fbAccounts)
        [accountStore renewCredentialsForAccount:fbAccount completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
            DLog(@"Renew account error: %@", error.localizedDescription)
        }];
}
于 2013-03-27T22:26:56.490 に答える