【问题标题】:Handle invalid accessToken with FBSession openActiveSessionWithReadPermissions in Facebook iOS 3.1.1 SDK在 Facebook iOS 3.1.1 SDK 中使用 FBSession openActiveSessionWithReadPermissions 处理无效 accessToken
【发布时间】:2012-09-26 13:11:46
【问题描述】:

在任何事情之前,我已经阅读了this 和this 的问题来解决下面的问题,然后再提问。

我的问题是,当 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
            }
          }
       }];
     }

在 FBSession.activeSession 打开的情况下进入 else 块,但是当执行“做某事”时,accessToken 无效,因此请求出现错误:HTTP 状态代码:400。 当我尝试立即执行整个过程两次时,FBSession 会请求许可(iOS6 的 UIAlertView 集成 facebook、Facebook 应用程序或 Safari 中的 Facebook 网站),其余的运行顺利。

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

提前谢谢大家!

【问题讨论】:

    标签: objective-c ios facebook facebook-ios-sdk


    【解决方案1】:

    您链接的问题是相关的,尤其是Facebook SDK 3.1 - Error validating access token,它解释了设备上的 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");
                            }
                        }];
                    }
                }];
            }
        }];
    }
    

    【讨论】:

    • 非常感谢克里斯!它似乎有效,尽管不是第二次重试,而是第四次重试。我认为它会在下一次 SDK 更新中得到修复。
    • 获取错误代码的方法似乎并不可靠。我认为 JSON 格式不一致: Error Domain=com.facebook.sdk Code=5 "The operation could not be completed. (com.facebook.sdk error 5.)" UserInfo=0x12c81710 {com.facebook.sdk :ParsedJSONResponseKey=( { body = { error = { code = 190; message = "设备上的访问令牌无效。"; type = OAuthException; }; }; code = 400; } ), com.facebook.sdk: HTTPStatusCode=400}
    • -[__NSArrayM objectForKeyedSubscript:]:无法识别的选择器发送到实例
    猜你喜欢
    • 2013-05-17
    • 2012-10-25
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多