ios - Facebook SDK 3.1 - 验证访问 token 时出错

标签 ios facebook ios6 facebook-ios-sdk facebook-sdk-3.1

我正在尝试将我的应用程序转换到新的 Facebook SDK 3.1(支持 iOS6 身份验证)。

我让它工作得很好,所以我决定从 FB 网站上的授权应用列表中删除该应用,以测试 iOS 是否会再次请求许可。

现在我第一次调用 [FBRequest requestForMe] 导致了这个错误:

响应:

{
  "error": {
    "message": "Error validating access token: Session does not match current stored session. This may be because the user changed the password since the time the session was created or Facebook has changed the session for security reasons.",
    "type":"OAuthException",
    "code":190,
    "error_subcode":460
  }
}

一些细节:

我正在尝试按如下方式打开 session :

   [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

                                           switch (state) {
                                               case FBSessionStateOpen:
                                                   [self presentPostOptions];
                                                   break;

                                               case FBSessionStateClosed:
                                               case FBSessionStateClosedLoginFailed:
                                                   [FBSession.activeSession closeAndClearTokenInformation];
                                                   break;

                                               default:
                                                   break;
                                           }

然后我在 FBSessionStateOpen 状态下被回调(此时 iOS 还没有显示请求对话框,这是可以预料的)? Facebook 记录此:

2012-09-26 13:43:43.768 MyApp[2177:907] FBSDKLog: FBSession INVALID transition from FBSessionStateCreated to FBSessionStateClosed
2012-09-26 13:43:43.769 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
2012-09-26 13:43:43.837 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateOpen 

session 打开后,在 presentPostOptions 中我这样做:

- (void)presentPostOptions
{    
    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
        if (!error) {
            self.usersName = user.name;
            self.usersID = user.id;

            [self getPages];
        }
        else
        {
            [self didFailWithError:error];
        }
    }];
}

在回调上述完成 block 之前,我的主状态处理程序 block 以 FBSessionStateClosed 状态调用。同时,Facebook SDK 记录了上述错误。

我找不到重置系统的方法;我也不太明白原因。

任何人都可以解释一下吗?

最佳答案

设备上的 Facebook 帐户已与服务器以及应用程序/SDK 的缓存不同步。这可以通过调用 ACAccountStore 方法 renewCredentialsForAccount 来解决,这将更新操作系统对 token 状态的理解。

SDK下次更新时,SDK会在收到服务端token失效响应时自动调用该接口(interface)。对于 SDK 的 3.1.0 版本,应用程序将需要显式调用此 API。这是一个代码示例:

ACAccountStore *accountStore;
ACAccountType *accountTypeFB;
if ((accountStore = [[ACAccountStore alloc] init]) &&
    (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
    id account;
    if (fbAccounts && [fbAccounts count] > 0 &&
        (account = [fbAccounts objectAtIndex:0])){

        [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
            //we don't actually need to inspect renewResult or error.
            if (error){

            }
        }];
    }
}

调用 API 的位置/时间有多种选择。最简单的地方是在应用程序启动或 View 加载时机会性地进行调用。这种方法的一个问题是它会导致通常不必要的网络往返。另一种选择是在 session 更改通知发生时调用它,表明 session 已关闭。此外,许多应用程序会在应用程序启动时获取一些基本信息,例如 graph.facebook.com/me,如果是这样的话——在出现错误响应时调用此方法可能是要求 iOS 更新其 token 的合理位置地位。

希望这对您有所帮助!

关于ios - Facebook SDK 3.1 - 验证访问 token 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12648844/

相关文章:

iphone - 如何编程 UITextField 的键盘以在 viewDidLoad 上打开?

ios - iPhone map 方向

ios - 类型 'AuthDataResult' 的 Firebase 错误值没有成员 'displayName'

iphone - 在 iPhone 应用程序中设置货币

ios - 我怎样才能实现在 Wunderlist iOS 应用程序中使用的这种类型的 View ?

java - XMPP - Facebook - 我的客户端实现如何接收其他客户端实现发送的消息?

c# - 在 C# 中读取 Facebook 提要

facebook - CakePHP 1.3:视频插件

ios - 子类化 iOS 控件 - 代码与 Storyboard

iphone - iOS6 中的自动旋转