如何在我的程序中修复这个错误?使用 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,你需要做的是:
处理错误并检测何时发生访问 token 错误。
发生访问 token 错误时,自动注销并清除用户默认设置以删除旧访问 token (第 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/