如何在iOS应用程序中完全注销Facebook SDK Auth

使用FBSDKCoreKit 4.22.1

我有一个公开安装的应用程序,白天服务于多个用户。 一个人可以走到iPad并用他们的Facebook帐户login:

在这里输入图像说明

成功login后,可以做他们的工作和使用的应用程序,他们会退出一段时间后: 在这里输入图像说明

注销成功。 然后下一个用户来使用公共iPad,并点击Facebookloginbutton,但他们会看到: 在这里输入图像说明

FBSDKLoginManager或其他Facebook SDK Libs记住了以前用户的Facebooklogin的一些元素。

我想彻底清除有关以前用户的Facebook凭据的任何信息

成功注销后,这个FBSDKLoginButtonDelegate方法被调用,我已经尝试完全删除Facebook帐户信息,但没有成功:

 func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) { print("\(#function) in \(#file.components(separatedBy: "/").last ?? "")") print("Todo, must completely remove Facebook Auth token info for current user logging out") FBSDKAccessToken.setCurrent(nil) FBSDKLoginManager().logOut() FBSDKProfile.setCurrent(nil) } 

因此,使用FBSDKCoreKit 4.22.1 Safari浏览器用于打开Facebook身份validationredirectURL,并使用本地存储: 在这里输入图像说明

有趣的是,阻止所有的Cookie,苹果暗示将阻止网站数据(localStorage),不会阻止本地存储和Facebook,并仍然创build网站数据存储: 在这里输入图像说明

苹果在这里说:

“更改接受哪些cookies和网站数据:select”Cookies和网站数据“选项:”

  • “始终阻止:Safari不允许任何网站,第三方或广告商在您的Mac上存储Cookie和其他数据,这可能会阻止某些网站正常运行。

这就是我期望本地存储被阻止的地方,但是Facebook仍然可以创build本地存储条目

我有一个类似的问题,我结束了使用SDK的修改版本,这实际上是相当危险的,因为另一个开发人员可能不知道它被修改..所以你需要留下一个笔记..

问题:注销后,您仍然login(在Safari中)..但只有当您使用本地login或系统login,并且没有办法从应用程序本身注销Safari。超级讨厌(你不能从应用程序中清除Safari的Cookie或数据)。

解决scheme(S):

如果您查看SDK的文档,它将显示:

 // Copyright (c) 2014-present, Facebook, Inc. All rights reserved. // // You are hereby granted a non-exclusive, worldwide, royalty-free license to use, // copy, modify, and distribute this software in source code or binary form for use // in connection with the web services and APIs provided by Facebook. // // As with any software that integrates with the Facebook platform, your use of // this software is subject to the Facebook Developer Principles and Policies // [http://developers.facebook.com/policy/]. This copyright notice shall be // included in all copies or substantial portions of the software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. typedef NS_ENUM(NSUInteger, FBSDKLoginBehavior) { /*! @abstract This is the default behavior, and indicates logging in through the native Facebook app may be used. The SDK may still use Safari instead. */ FBSDKLoginBehaviorNative = 0, /*! @abstract Attempts log in through the Safari or SFSafariViewController, if available. */ FBSDKLoginBehaviorBrowser, /*! @abstract Attempts log in through the Facebook account currently signed in through the device Settings. @note If the account is not available to the app (either not configured by user or as determined by the SDK) this behavior falls back to \c FBSDKLoginBehaviorNative. */ FBSDKLoginBehaviorSystemAccount, /*! @abstract Attemps log in through a modal \c UIWebView pop up @note This behavior is only available to certain types of apps. Please check the Facebook Platform Policy to verify your app meets the restrictions. */ FBSDKLoginBehaviorWeb, }; 

所以,如果你使用本机,但它不能,它将回退到Safari。 如果您使用系统,但它不能,它回落到本机,回落到Safari ..

然后是FBSDKLoginBehaviorWeb,它使用模式的Web视图/popup窗口! 所以,如果你不一定要使用本地或系统login,那么我build议你select这个选项,因为它不会退回到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]; //-- CHANGED BY BRANDON T. } }]; } else { [self logInWithBehavior:FBSDKLoginBehaviorWeb]; //-- CHANGED BY BRANDON T. } }]; break; } // intentional fall through. -- CHANGED BY BRANDON T. [self logInWithBehavior:FBSDKLoginBehaviorWeb]; //-- CHANGED BY BRANDON T. 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; } } 

这使得所有本地login或系统login将回退到模式在应用程序的UIWebView 。 然后,您可以清除cookie时注销,你会没事的。删除所有NSHTTPCookieStorage.sharedHTTPCookieStorage().cookiesNSURLCache.sharedURLCache().removeAllCachedResponses()注销后。

显然最安全的select是永远不要使用系统或本地login,而是总是使用: FBSDKLoginBehaviorWeb ..

我能够通过将FBSDKLoginBehavior更改为FBSDKLoginBehavior来解决此问题,请参阅: https : FBSDKLoginBehavior