Facebook的注销是不是在新的SDK V.4.1.0在iOS中工作?

朋友我想在我的应用程序中整合Facebook,以便我下载新的Facebook SDK v.4.1.0,对于Facebookloginbutton使用FBSDKLoginButton类作为Swift中的代码。

 if (FBSDKAccessToken.currentAccessToken() != nil) { // User is already logged in, do work such as go to next view controller. // Or Show Logout Button let loginView : FBSDKLoginButton = FBSDKLoginButton() self.view.addSubview(loginView) loginView.center = self.view.center loginView.readPermissions = ["public_profile", "email", "user_friends"] loginView.delegate = self self.returnUserData() } else { let loginView : FBSDKLoginButton = FBSDKLoginButton() self.loginButtonDidLogOut(loginView) self.view.addSubview(loginView) loginView.center = self.view.center loginView.readPermissions = ["public_profile", "email", "user_friends"] loginView.delegate = self } } 

上面的代码显示“使用Facebooklogin”button。

在这里输入图像说明

成功login后,显示登出button。 当我点击注销button时,它的委托被调用 – 委托类FBSDKLoginButtonDelegate

退出的委托方法:

 func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { println("User Logged Out") FBSDKAccessToken.setCurrentAccessToken(nil) FBSDKProfile.setCurrentProfile(nil) let manager = FBSDKLoginManager() manager.logOut() } 

在委托中我清晰的表示了FBSDKLoginManager类中的logout函数。 但是每次获得用户的授权屏幕。 没有得到login屏幕,以便其他用户无法loginFacebook。 每次我必须清除浏览器历史logging。

没有清楚的浏览器历史logging,没有显示login页面,以便其他用户无法login。

问题: Facebook的BUG

每次登出后显示屏幕:

在这里输入图像说明

我也被困在同一个地方。 然而,冲浪我得出以下结论。

首先让我们知道SingleSignOn的含义:

单点login(SSO)是多个相关但独立的软件系统的访问控制的一个属性。 有了这个属性,用户可以login一次,并获得对所有系统的访问权限,而不会被提示在每个系统上重新login。

为什么我觉得有一些问题。为什么我们不会再要求login,虽然我们已经注销了? 因为在模拟器上的证书已经保存在Safari(第一次使用Facebooklogin,你的应用程序打开Safari或Facebook应用程序,如果安装)。

允许您查看“您已经授权…”消息的信息位于Facebook。为了从您的应用中撤销权限,您需要触摸Graph API。 FB文档,位于https://developers.facebook.com/docs/reference/api/user/的“删除”部分

撤消login

您也可以让人们完全取消授权应用程序,或通过调用此Graph API端点来撤消login:DELETE / {user-id} / permissions

如迅速:

  let deletepermission = FBSDKGraphRequest(graphPath: "me/permissions/", parameters: nil, HTTPMethod: "DELETE") deletepermission.startWithCompletionHandler({(connection,result,error)-> Void in println("the delete permission is \(result)") }) 

但为了完全注销应用程序,用户将被提示重新input凭据,请参阅下面的内容:

你必须从Facebook应用程序注销,然后只有你真正注销,然后只有应用程序再次要求凭据。这是因为你没有login到手机的任何地方。因此,SSO规则不适用于此。 如果您仅从您的应用程序注销(而不是从registry),则会因为从您的案例中的safarilogin而被logging。这就是为什么,您将得到相同的消息,显示您已经获得了此应用程序的授权。

尝试在模拟器上进行testing,当您第一次插入凭证时,Safari会打开,并且您input的凭证会保存在Safari中。 所以,下一次当你注销和login应用程序,它不会要求凭据。因为Safari提供(或Facebook应用程序,如果你已经input了你的凭证)

现在你打开safari并打开Facebook。 你看到Facebook已经打开,并从Safari自动获取的信息,或者如果你从那里安装Facebook应用程序。 所以从safari注销并重新打开您的应用程序并从应用程序注销。然后,您的应用程序将再次询问凭据。

这个答案帮助我确定了根本原因问题。 2键是SSO和Safari。 Facebook糟糕地logging了Facebooklogin过程。 我不得不closuresSSO。 这是在设置下的Facebook开发者网站上,您的应用程序已注册。 但更重要的是,我不得不改变FBLoginManager的行为来使用UIWebView而不是Safari。 我用下面的代码片断做了这个:

 FBSDKLoginManager *loginMgr = [[FBSDKLoginManager alloc] init]; loginMgr.loginBehavior = FBSDKLoginBehaviorWeb; 

如果您使用默认行为,它将通过Facebook应用程序或浏览器Safaripipe理注销,而不是直接从应用程序中注销。 FBSDKLoginBehaviorWeb将在popup窗口中使用iOS UIWebView。 这是完美的,每次登出后都需要凭证。