用户未在Facebook SDK iOS中登录错误

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)

Lio*_*Lio 8

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

当Facebook会话到期并且您继续使用旧的访问令牌时,将返回访问令牌错误.注销不是会话到期的唯一方案(例如,更改Web中的登录密码).因此,仅在注销后清除用户默认值是不够的.

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

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

  1. 处理错误并检测何时发生访问令牌错误.

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

  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)