Luc*_*uke 3 iphone facebook objective-c facebook-graph-api ios
如何在程序中修复此错误?使用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."}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为发布的解决方案并不完整.我将解释原因:
当Facebook会话到期并且您继续使用旧的访问令牌时,将返回访问令牌错误.注销不是会话到期的唯一方案(例如,更改Web中的登录密码).因此,仅在注销后清除用户默认值是不够的.
从客户端,我们不知道我们拥有的访问令牌是否实际有效,直到响应带有此类信息.因此,您需要检测访问令牌错误,并通过清除旧访问令牌和到期日期将Facebook实例恢复到工作状态.这样,用户将需要再次登录以获取新的访问令牌.
那么,IMO,你需要做的是:
处理错误并检测何时发生访问令牌错误.
发生访问令牌错误时,自动注销并清除用户默认设置以删除旧访问令牌(步骤3).
作为注销的结果,您需要清除访问令牌和到期日期的用户默认值(如发布的那样).
这里有一些可用于检测访问令牌错误的代码:
-(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;
}
Run Code Online (Sandbox Code Playgroud)
处理此类错误的地方是:
- (void)request:(FBRequest*)request didFailWithError:(NSError*)error;
- (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error;
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.
更新: 我忘了提.如果你正在使用SSO功能(最有可能),我认为在登录前清理facebook cookies是个好主意.有时,在无效访问令牌错误之后,似乎登录不会将Facebook对象恢复到工作状态(有效访问令牌),除非执行"干净登录".虽然不总是有用.
此外,如果您没有使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6074 次 |
| 最近记录: |