处理无效的accessToken在Facebook上的iOS 3.1.1 SDK FBSession

2019-08-03 14:12发布

任何事情之前,我曾经读过这和这个问题解决的下方,前问这个问题。

我的问题是,当得到的accessToken过期(因为到期日通过,或者通过手动删除从我的Facebook的应用中心应用程序)下面的代码:

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
            }
          }
       }];
     }

获取else块与FBSession.activeSession开放,但在“做一些事情”执行的accessToken是无效的,因此要求得到错误:HTTP状态代码:400。当我尝试做整个过程两次立即FBSession询问许可(无论是对于UIAlertView中集成iOS6的脸谱,Facebook应用或Facebook网站在Safari),其余的顺利进行。

我关心的是为什么我做的一切两次运作良好,为什么Facebook的SDK可以在第一时间将activeSession和的accessToken无效无法察觉。

谢谢大家!

Answer 1:

您所连结的问题是相关的,尤其是Facebook的SDK 3.1 -错误验证访问令牌这也解释了在设备上的Facebook帐户是不同步的服务器(即,如果您删除了应用中心应用程序)的问题。 由于有提到,在3.1.1 SDK将调用令牌更新设备,只有当它得到来自服务器的响应无效。 这是不太往返到服务器的便利关闭交易。

假设你的代码块上的applicationDidFinishLaunching或类似的东西执行,因为该应用程序使用一个新的会话启动时,它会去else块。 当它调用openActiveSessionWithReadPermissions,在iOS 6的设备认为令牌是有效的,并让国家去开,所以那么你的“有所作为”得到执行。 只有这样,它的SDK获得来自服务器的无效响应和无效装置凭证。 其结果是,下一次的程序被调用时,它将适当地提示用户重新授权。

这是故意的。 现在,你可以,如果错误代码描述了一个无效的令牌考虑您的应用程序自动重试。 例如,参见美味的样品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");
                        }
                    }];
                }
            }];
        }
    }];
}


文章来源: Handle invalid accessToken with FBSession openActiveSessionWithReadPermissions in Facebook iOS 3.1.1 SDK