【问题标题】:Facebook iOS SDK 3.2, problems when user removed app from facebook.comFacebook iOS SDK 3.2,当用户从 facebook.com 删除应用程序时出现问题
【发布时间】:2013-02-18 08:39:23
【问题描述】:

我正在使用 Facebook iOS SDK(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: Handle login if user remove app from Facebook Settings),但它指出“然后,用户关闭 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;
        }
    }];
}

【问题讨论】:

  • 在这种情况下,您会收到错误吗?你能检查一下是否设置了完成处理程序的错误吗?

标签: ios facebook


【解决方案1】:

如果 Facebook SDK 在自己进行 Facebook 图形 api 请求时没有发现令牌无效,则需要强制 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)
        }];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多