Facebook Logout无法在ios的新SDK V.4.1.0中运行?

时间:2015-05-07 05:29:44

标签: ios facebook swift

朋友我想在我的应用程序中集成Facebook,以便我下载新的Facebook SDK v.4.1.0,对于Facebook登录按钮使用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
 }
}

如上面的代码,显示“使用Facebook登录”按钮。

enter image description here

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

注销注销方法:

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

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

    let manager = FBSDKLoginManager()
    manager.logOut()

}
委托中的

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

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

Qusetion:Facebook BUG

每次退出后显示屏幕:

enter image description here

2 个答案:

答案 0 :(得分:33)

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

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

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

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

这些信息可让您查看“您已经授权......”#39;消息来自Facebook。要撤消应用程序的权限,您需要触摸Graph 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)")

        })

但是,为了完全从应用程序退出,系统会提示用户重新输入凭据,请参阅以下内容:

你必须从Facebook应用程序注销,然后只有你真正注销,然后只有应用程序再次请求凭据。因为你没有在手机上的任何地方登录。所以,SSO规则不适用于此处。如果您只是从您的应用程序(不是fb)注销,那么您将因为在您的案例中从safari登录而被记录。原因是,您将收到相同的消息,表明您已获得此应用程序的授权。

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

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

答案 1 :(得分:7)

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

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

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