objective-c - 在 Facebook iOS 3.1.1 SDK 中使用 FBSession openActiveSessionWithReadPermissions 处理无效的 accessToken

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

在任何事情之前,我都阅读了 thisthis在提问之前解决下面的问题。

我的问题是,当 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 block ,但是当执行“做某事”时,accessToken 无效,因此请求获得错误:HTTP 状态代码:400。 当我尝试立即执行整个过程两次时,FBSession 请求许可(iOS6 的 UIAlertView 集成 facebook、Facebook 应用程序或 Safari 中的 Facebook 网站),其余运行顺利。

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

提前谢谢大家!

最佳答案

您链接的问题很相关,尤其是 Facebook SDK 3.1 - Error validating access token这解释了设备上的 Facebook 帐户与服务器不同步的问题(即,如果您从 App Center 删除了该应用程序)。正如那里提到的,在 3.1.1 中,只有当它从服务器收到无效响应时,SDK 才会调用更新设备 token 。这是为了减少往返服务器的便利性而做出的权衡。

假设您的代码块是在 applicationDidFinishLaunching 或类似的东西上执行的,它将转到 else block ,因为应用程序从一个新 session 开始。当它调用 openActiveSessionWithReadPermissions 时,iOS 6 设备认为 token 有效并会让状态进入打开状态,然后您的“做某事”就会被执行。只有这样,SDK 才会从服务器收到无效响应并使设备 token 无效。因此,下次调用该过程时,它会适本地提示用户再次授权。

这是故意的。现在,如果错误代码描述了无效 token ,您可以考虑在您的应用程序中自动重试。例如,请参阅 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");
                        }
                    }];
                }
            }];
        }
    }];
}

关于objective-c - 在 Facebook iOS 3.1.1 SDK 中使用 FBSession openActiveSessionWithReadPermissions 处理无效的 accessToken,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12745235/

相关文章:

ios - ABRecordCopyValue 可以返回什么? (解决访问错误)

Facebook Graph API - 按页面 ID 查找页面

facebook - 是否可以将参数传递给通过选项卡访问的 FB 应用程序的回调 URL?

c# - 如何在 Xamarin 中从我的 iOS 应用程序打开 Facebook/Twitter 应用程序?

objective-c - 为什么具有相同 iNode 的文件/硬链接(hard link)比引用计数显示的要多?

iphone - 使用 writeImageToSavedPhotosAlbum 将 UIImage 保存到相册

iphone - Objective C - 在字符串的特定部分添加字符

objective-c - 一种实现横向 NSTextFieldCell 的方法?

iOS 在使用外部配件和 MFi 时连接/重新连接到蓝牙设备

ios - 尝试使用以编程方式创建的图像为 UIImageView 设置动画时抛出错误