Facebook Logout无法在ios中使用新的SDK V.4.1.0?

Kir*_*odi 24 facebook ios swift

朋友我想在我的应用程序中集成Facebook,以便我下载新的Facebook SDK v.4.1.0,对于Facebook登录按钮使用FBSDKLoginButtonSwift中的以下代码类.

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
 }
}
Run Code Online (Sandbox Code Playgroud)

如上面的代码,显示"使用Facebook登录"按钮.

在此输入图像描述

成功登录后,显示注销按钮.当我点击注销按钮然后调用它的委托 - 委托类FBSDKLoginButtonDelegate

委派注销方法:

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
    println("User Logged Out")

    FBSDKAccessToken.setCurrentAccessToken(nil)
    FBSDKProfile.setCurrentProfile(nil)

    let manager = FBSDKLoginManager()
    manager.logOut()

}
Run Code Online (Sandbox Code Playgroud)

在委托中我清楚令牌,也称为类内注销功能FBSDKLoginManager.但每次都获得用户的授权屏幕.没有登录屏幕,以便其他用户无法登录Facebook.每次我必须清除浏览器历史记录.

没有明确的浏览器历史记录,没有显示登录页面,以便其他用户无法登录.

问题:Facebook BUG

注销后每次显示屏幕:

在此输入图像描述

LC *_*C 웃 35

我也被困在同一个地方.然而冲浪我得出结论.

首先让我们了解SingleSignOn的含义:

单点登录(SSO)是多个相关但独立的软件系统的访问控制的属性.使用此属性,用户登录一次并获得对所有系统的访问权限,而不会被提示再次登录每个系统.

我认为有一点.为什么我们没有被要求再登录虽然我们已经退出了?因为在模拟器上,凭证已保存在safari上(首次使用facebook登录时,您的应用程序会打开safari或facebook app,如果已安装).

允许您查看"您已经授权..."消息的信息在于Facebook.要从您的应用撤消权限,您需要触摸图谱API.FB文档,位于https://developers.facebook.com/docs/reference/api/user/的"删除"部分

撤消登录

您还可以通过调用此Graph API端点让人们完全取消授权应用或撤消登录:DELETE/{user-id}/permissions

例如在swift中:

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

        })
Run Code Online (Sandbox Code Playgroud)

但是为了完全从应用程序注销以便提示用户重新输入凭据,请参阅以下内容:

您必须从Facebook应用程序注销,然后只有您真正注销,然后只有应用程序再次要求凭据.这是因为您没有在手机上的任何地方登录.所以,SSO规则不适用于此处.如果你只是从你的应用程序(而不是fb)注销,你将会因为在你的情况下从safari登录而被记录.原因是,你会收到同样的消息,表明你已经被授权使用这个应用程序.

尝试在模拟器上进行测试,当您第一次插入凭据时,Safari会打开,您输入的凭据将保存在safari中.因此,下次当您注销并登录应用程序时,它不会要求凭据.因为safari提供了它(如果您在那里输入了凭证,则为facebook应用程序)

现在你打开safari并打开facebook.你看到facebook已经打开,并自动从Safari中获取信息,或者如果你安装了facebook应用程序,那么从那里开始.因此,从safari注销并重新打开您的应用程序并从应用程序注销.然后您的应用程序将再次询问凭据.

  • 是的,+ 1票但不要再次登录,必须清除Safari broswer的数据. (4认同)

小智 7

这个答案帮助我确定了根本原因问题.2个键是SSO和Safari.Facebook很难记录Facebook登录过程.我不得不关闭SSO.这是在您的应用程序注册的Facebook开发者网站上的"设置"下.但更重要的是我必须改变FBLoginManager的行为才能使用UIWebView而不是Safari.我使用以下代码片段完成了此操作:

FBSDKLoginManager *loginMgr = [[FBSDKLoginManager alloc] init];
loginMgr.loginBehavior = FBSDKLoginBehaviorWeb;
Run Code Online (Sandbox Code Playgroud)

如果您使用默认行为,它将通过Facebook应用程序或浏览器Safari管理注销,而不是直接从应用程序管理.FBSDKLoginBehaviorWeb是在弹出窗口中使用iOS UIWebView.这非常有效,每次注销后都需要凭据.