繁体   English   中英

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

[英]User not logged in error in Facebook SDK 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."}
}
}

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

当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;
}

处理此类错误的地方是:

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

我希望这有帮助。

更新:我忘了提。 如果你正在使用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

我刚刚也遇到了这个错误。 这是解决方案。 将此代码放在主FBSessionDelegate(可能是您的app委托)中。

- (void)fbDidLogout {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults removeObjectForKey:@"FBAccessTokenKey"];
    [defaults removeObjectForKey:@"FBExpirationDateKey"];
    [defaults synchronize];
}

然后删除并重新安装应用程序!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM