Facebook SDK 3.1 - 验证访问令牌时出错

tar*_*mes 37 facebook ios facebook-ios-sdk ios6 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
  }
}
Run Code Online (Sandbox Code Playgroud)

一些细节:

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

   [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;
                                           }
Run Code Online (Sandbox Code Playgroud)

然后我被召回状态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 
Run Code Online (Sandbox Code Playgroud)

会话打开后,在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];
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)

在回调上述完成块之前,我的主状态处理程序块被调用FBSessionStateClosed状态.与此同时,Facebook SDK记录了上述错误.

我找不到任何重置系统的方法; 我也不了解原因.

任何人都可以请一些亮点?

Jas*_*ark 76

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

在SDK的下一次更新中,SDK会在收到服务器的响应时自动调用此API,表明令牌已失效.对于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){

            }
        }];
    }
}
Run Code Online (Sandbox Code Playgroud)

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

希望这有帮助!

  • 我们正在开发一个点发行版,其中包含有限数量的错误修复程序.它不应该太远. (2认同)
  • 嗨,杰森.我已经安装了3.1.1并删除了上面的临时修复程序.不幸的是,新的SDK无法解决问题.我已经找到了问题 - 我们可以在某处讨论这个问题吗? (2认同)

sno*_*gon 7

我只想做一件事情来检查是否会导致我浪费3个小时:如果您尝试使用非应用程序开发人员FB用户登录,请确保您的FB应用程序设置没有"沙盒"选项......可能很明显,但希望可以节省几个小时.