10

一些背景:用户之前安装了应用程序,授权 FB,一切正常,然后他们更改了他们的 FB 密码(通过 facebook.com),删除了应用程序,现在重新安装并再次运行它重新安装。

我正在打电话[FBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler]allowLoginUI: YES读取权限是“email、user_about_me、user_birthday、user_interests、user_location”。

FBSessionState我进入的completionHandlerFBSessionStateClosedLoginFailed。错误的 NSLog 是这样的:

错误域=com.facebook.sdk 代码=2“操作无法完成。(com.facebook.sdk 错误 2。)”UserInfo=0x1cd68c00 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:ErrorLoginFailedReason , com.facebook.sdk:ErrorInnerErrorKey=Error Domain=com.apple.accounts Code=7 "Facebook 服务器无法完成此访问请求:验证访问令牌时出错:由于用户更改了密码,会话已失效。" UserInfo=0x1cd5b970 {NSLocalizedDescription=Facebook 服务器无法完成此访问请求:验证访问令牌时出错:由于用户更改了密码,会话已失效。}}

那个内部错误域是ACErrorDomain和错误代码ACErrorPermissionDenied。那么,如何让用户重新授权应用呢?

我已经尝试openActiveSessionWithReadPermissions再次调用,但只是不断输出相同的错误。我也尝试过[FBSession.activeSession closeAndClearTokenInformation],但这似乎没有任何作用(大概是因为没有activeSession)。

4

2 回答 2

12

使用 3.2.1 Facebook SDK 遇到了非常相似的错误。就我而言,我进入了 FBSessionStateOpen 但获得了无效的访问令牌。正如问题所述,正常的 closeAndClearTokenInformation 甚至删除应用程序都无法修复它。在这种情况下,我能够重新加入的唯一方法是让用户在设置应用程序中更改他们的密码。所以这就是我所做的。

// In my completion handler FBSessionStateOpen is called BUT an
// invalid accessToken was detected.

[session closeAndClearTokenInformation];
[FBSession renewSystemCredentials:^(ACAccountCredentialRenewResult result, 
                                    NSError *error) 
  {
     if (result == ACAccountCredentialRenewResultFailed ||
         result == ACAccountCredentialRenewResultRejected)
     {
       [self showErrorMessage:NSLocalizedString(@"You may need to re-enter your Facebook password in the iPhone Settings App.\n", nil)];
     }
     else 
     {
        // attempt opening a session again  (after they have updated their account 
        // settings I end up here)

        [self facebookLogin];  // Performs openActiveSessionWithReadPermissions, 
                               // but this time around the token issued should be good.
     }
 }];

这是我能想到的唯一务实的解决方案。

于 2013-04-03T19:33:21.833 回答
0

我认为您需要使用这样的代码获取新的访问令牌...

[FBSession.activeSession closeAndClearTokenInformation];
[[FBSession class] performSelector:@selector(renewSystemAuthorization)];
[FBSession openActiveSessionWithReadPermissions:nil
                               allowLoginUI:YES
                          completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

}
于 2013-02-03T02:11:38.263 回答