iphone - Facebook SDK iOS 中的用户未登录错误

标签 iphone objective-c ios facebook facebook-graph-api

如何在我的程序中修复这个错误?使用 Facebook SDK。

Error Domain=facebookErrDomain Code=10000 "The operation couldn’t be completed. (facebookErrDomain error 10000.)" UserInfo=0x5da9b10 {error=<CFBasicHash 0x5db09a0 [0x1087400]>{type = mutable dict, count = 2,
entries =>
    2 : <CFString 0x5db7920 [0x1087400]>{contents = "type"} = <CFString 0x5d35420 [0x1087400]>{contents = "OAuthException"}
    3 : <CFString 0x5d34970 [0x1087400]>{contents = "message"} = <CFString 0x5da96b0 [0x1087400]>{contents = "Error validating access token: The session is invalid because the user logged out."}
}
}

最佳答案

我认为 enbr 发布的解决方案不完整。我将解释原因:

当 Facebook session 过期并且您继续使用旧访问 token 时,将返回访问 token 错误。注销不是 session 过期的唯一场景(例如,在 Web 中更改登录密码)。因此,在注销后简单地清除用户默认值是不够的。

在客户端,我们不知道我们拥有的访问 token 是否真正有效,直到响应附带此类信息。因此,您需要检测访问 token 错误,并通过清理旧访问 token 和到期日期将 Facebook 实例恢复到工作状态。这样,用户将需要再次登录以获取新的访问 token 。

那么,IMO,你需要做的是:

  1. 处理错误并检测何时发生访问 token 错误。

  2. 发生访问 token 错误时,自动注销并清除用户默认设置以删除旧访问 token (第 3 步)。

  3. 由于注销,您需要清除访问 token 和到期日期的用户默认值(如 enbr 发布的那样)。

这里有一些可用于检测访问 token 错误的代码:

-(BOOL)isAccessTokenError:(NSError *) error {
    if ([[error domain] isEqualToString:@"facebookErrDomain"] && [error code] == 10000 ) {
        NSDictionary *userInfo = [error userInfo];
        NSDictionary *errorAsDictionary = [userInfo objectForKey:@"error"];
        if ([[errorAsDictionary objectForKey:@"type"] isEqualToString:@"OAuthException"]) {
            //Invalid access token
            return YES;         
        }
    }
    if ([[error domain] isEqualToString:@"facebookErrDomain"] && ([error code] == 110 || [error code] == 190)) {
        //Error accessing access token
        return YES;         
    }
    return NO;
}

处理此类错误的地方是:

- (void)request:(FBRequest*)request didFailWithError:(NSError*)error; 
- (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error;

希望对您有所帮助。

更新: 我忘了提。如果您正在使用 SSO 功能(最有可能),我认为在登录前清除 facebook cookie 是一个非常好的主意。有时,在出现无效访问 token 错误后,除非执行“干净登录”,否则登录似乎不会将 Facebook 对象恢复到工作状态(有效访问 token )。虽然并不总是有效。

此外,如果您没有使用 SSO 功能,这用于修复出现的 ghost 登录弹出窗口再次自动消失。

这是我清理 cookie 的方式:

NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    NSArray* facebookCookies = [cookies cookiesForURL:
                                [NSURL URLWithString:@"http://login.facebook.com"]];    
    for (NSHTTPCookie* cookie in facebookCookies) {
        [cookies deleteCookie:cookie];
    }
enter code here

关于iphone - Facebook SDK iOS 中的用户未登录错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7150595/

相关文章:

iphone - xcode 将警告显示为错误

ios - 尝试将来自 Web API 的照片添加到表中的各个行

ios - 应用程序卡住核心数据

iphone - 将 iOS (iPhone) 应用移植到 Mac?

iphone - 旋转 UIView iPhone

objective-c - 使用 UIButton 进行内存管理

ios - 缩放时在核心图中调整大小和重新放置注释

iphone - 有没有用于开发 OpenGL ES 2.0 着色器的工具?

ios - 使用 CoreData 存储对象

ios - 在 Realm 中一对多链接对象