我曾经遇到过类似的问题,最终我使用了一个修改过的SDK版本,但这样做实际上是非常危险的,因为其他开发人员可能不知道它被修改了。因此,你需要留下一条说明。
问题:在Safari中退出登录后,你仍然处于登录状态,但只有当你使用本地登录或系统登录时才会出现这种情况,并且没有办法从应用程序内部退出Safari。这非常烦人(你也无法在应用程序内部清除Safari的cookie或数据)。
解决方案:
如果你查看SDK的文档,它会显示:
typedef NS_ENUM(NSUInteger, FBSDKLoginBehavior)
{
FBSDKLoginBehaviorNative = 0,
FBSDKLoginBehaviorBrowser,
FBSDKLoginBehaviorSystemAccount,
FBSDKLoginBehaviorWeb,
};
如果您使用原生应用程序,但无法正常工作,它将回退到Safari。如果您使用系统登录,但无法正常工作,则会回退到Native,然后回退到Safari。
然后有FBSDKLoginBehaviorWeb,它使用模态Web视图/弹出窗口!因此,如果您不绝对必须使用Native或System Login,则建议您选择此选项,因为它不会回退到Safari。
否则:
这就是我所做的更改,以便在后台从未使用Safari:
FBLoginSDKManager.m:
- (void)logInWithBehavior:(FBSDKLoginBehavior)loginBehavior
{
NSDictionary *loginParams = [self logInParametersWithPermissions:_requestedPermissions];
void(^completion)(BOOL, NSString *, NSError *) = ^void(BOOL didPerformLogIn, NSString *authMethod, NSError *error) {
if (didPerformLogIn) {
[_logger startAuthMethod:authMethod];
_performingLogIn = YES;
} else {
if (!error) {
error = [NSError errorWithDomain:FBSDKLoginErrorDomain code:FBSDKLoginUnknownErrorCode userInfo:nil];
}
[self invokeHandler:nil error:error];
}
};
switch (loginBehavior) {
case FBSDKLoginBehaviorNative: {
if ([FBSDKInternalUtility isFacebookAppInstalled]) {
[FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *loadError) {
BOOL useNativeDialog = [serverConfiguration useNativeDialogForDialogName:FBSDKDialogConfigurationNameLogin];
if (useNativeDialog && loadError == nil) {
[self performNativeLogInWithParameters:loginParams handler:^(BOOL openedURL, NSError *openedURLError) {
if (openedURLError) {
[FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors
formatString:@"FBSDKLoginBehaviorNative failed : %@\nTrying FBSDKLoginBehaviorBrowser", openedURLError];
}
if (openedURL) {
completion(YES, FBSDKLoginManagerLoggerAuthMethod_Native, openedURLError);
} else {
[self logInWithBehavior:FBSDKLoginBehaviorWeb];
}
}];
} else {
[self logInWithBehavior:FBSDKLoginBehaviorWeb];
}
}];
break;
}
[self logInWithBehavior:FBSDKLoginBehaviorWeb];
break;
}
case FBSDKLoginBehaviorBrowser: {
[self performBrowserLogInWithParameters:loginParams handler:^(BOOL openedURL,
NSString *authMethod,
NSError *openedURLError) {
if (openedURL) {
completion(YES, authMethod, openedURLError);
} else {
completion(NO, authMethod, openedURLError);
}
}];
break;
}
case FBSDKLoginBehaviorSystemAccount: {
[FBSDKServerConfigurationManager loadServerConfigurationWithCompletionBlock:^(FBSDKServerConfiguration *serverConfiguration, NSError *loadError) {
if (serverConfiguration.isSystemAuthenticationEnabled && loadError == nil) {
[self beginSystemLogIn];
} else {
[self logInWithBehavior:FBSDKLoginBehaviorNative];
}
}];
completion(YES, FBSDKLoginManagerLoggerAuthMethod_System, nil);
break;
}
case FBSDKLoginBehaviorWeb:
[self performWebLogInWithParameters:loginParams handler:^(BOOL openedURL, NSError *openedURLError) {
completion(openedURL, FBSDKLoginManagerLoggerAuthMethod_Webview, openedURLError);
}];
break;
}
}
这样,所有本机登录或系统登录都将回溯到应用内的modal-
UIWebView
。然后,您可以在注销时清除cookies,就没有问题了。注销后删除
NSHTTPCookieStorage.sharedHTTPCookieStorage().cookies
和
NSURLCache.sharedURLCache().removeAllCachedResponses()
。
显然最安全的选择是永远不使用系统或本机登录,而始终使用:
FBSDKLoginBehaviorWeb
……