使用Facebook iOS 3.1.1 SDK中的FBSession openActiveSessionWithReadPermissions处理无效的accessToken

ozz*_*tto 15 facebook objective-c ios facebook-ios-sdk

在此之前,我已经阅读了这个这个问题,以解决下面的问题,然后再询问.

我的问题是,当accessToken过期时(或者因为过期日期过去,或者通过从我的Facebook的App Center中删除应用程序而手动操作),以下代码:

if ([[FBSession activeSession] isOpen]) {
        //do something
    }
else {
        [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
            if(FB_ISSESSIONOPENWITHSTATE(status)) {
                //do something
            }
          }
       }];
     }
Run Code Online (Sandbox Code Playgroud)

在FBSession.activeSession打开的情况下进入else块,但是当执行'do something'时,accessToken无效,因此请求获得错误:HTTP状态代码:400.当我尝试立即执行整个过程两次时,FBSession请求权限(UIAlertView for iOS6集成了facebook,Facebook App或Safari网站),其余的运行顺畅.

我担心的是为什么我必须做两次才能正常工作以及为什么Facebook SDK第一次无法检测到activeSession和accessToken无效.

谢谢大家!

小智 23

您链接的问题是相关的,尤其是Facebook SDK 3.1 - 验证访问令牌时出错,这解释了设备上的Facebook帐户与服务器不同步的问题(即,如果您从App Center删除了应用程序).如上所述,在3.1.1中,只有当服务器收到无效响应时,SDK才会调用更新设备令牌.这是为了减少往返服务器的便利性而进行的折衷.

假设您的代码块在applicationDidFinishLaunching或类似的东西上执行,它将转到else块,因为应用程序以新会话开始.当它调用openActiveSessionWithReadPermissions时,iOS 6设备认为令牌有效并且让状态变为Open,那么你的"做某事"就会被执行.只有这样,SDK才会从服务器获得无效响应并使设备令牌无效.结果,下次调用该过程时,它将相应地提示用户进行授权.

这是故意的.目前,如果错误代码描述了无效令牌,您可以考虑在应用程序中自动重试.例如,请参阅Scrumptious示例postOpenGraph重试代码.在你的情况下,它可能看起来更接近(我使用requestForMe作为"做某事"用于演示目的):

else {
    [FBSessionopenActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
        if(FB_ISSESSIONOPENWITHSTATE(status)) {
            //do something
            [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error) {
                if (!error){
                    NSLog(@"success on first try");
                } else if ([[error userInfo][FBErrorParsedJSONResponseKey][@"body"][@"error"][@"code"] compare:@190] == NSOrderedSame) {
                    //requestForMe failed due to error validating access token (code 190), so retry login
                    [FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                        if (!error){
                            //do something again, or consider recursive call with a max retry count.
                            NSLog(@"success on retry");
                        }
                    }];
                }
            }];
        }
    }];
}
Run Code Online (Sandbox Code Playgroud)