Facebook登录Swift

时间:2016-03-26 18:09:38

标签: ios swift facebook facebook-sdk-4.0

提前感谢您的帮助!

我正在我正在编写的swift应用程序上实现facebook登录,并且在登录完成后我在执行segue时遇到了一些问题。

作为FBSDKLoginButtonDelegate的一部分,我有两种方法:

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result:
 FBSDKLoginManagerLoginResult!, error: NSError!)
    {}

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!)
    {}

登录按钮正确实现,我能够读取权限/ FB令牌,并将其传递到Amazon Cognito。

但奇怪的是,我无法以编程方式从登录中删除,进入不同的视图(控制器)。

按下FB登录按钮会将用户带到Web浏览器(Facebook SDK处理所有这些),然后进行登录。

如果我放置一个segue,例如:

dispatch_async(dispatch_get_main_queue(), {
        self.performSegueWithIdentifier("segueLoginViewtoHome", sender: nil })

进入loginButton(),它永远不会真正执行(即,当Web浏览器消失时,用户将返回到具有登录按钮的视图,而不是segue预期的新视图)。我相信该行在浏览器窗口返回到包含登录按钮(和segue)的视图之前执行,但我不知道如何告诉程序“等待”视图成为唯一一个活动且再次可见的视图执行segue。

我相信是这种情况,因为如果我将相同的segue代码放入loginButtonDidLogOut(),那里不需要切换到浏览器,则在表单中按下“注销”之后,segue执行得很好从屏幕底部向上滑动。

此视图控制器已正确设置为委托,如下所示,如果编码在注销时发生,则segue正常运行。

任何帮助都会非常感激,为长期问题道歉,谢谢!

3 个答案:

答案 0 :(得分:12)

我通过创建一个名为fbLoginSuccess的全局布尔值来修复此问题,该布尔值初始化为false。如果Facebook登录成功,那么我将fbLoginSuccess设置为true,执行你的segue。然后,如果fbLoginSuccess为true,我覆盖viewDidAppear()并在那里执行segue。这解决了它,因为viewDidAppear()是在从浏览器窗口返回后执行的,这就是你想要的。

var fbLoginSuccess = false

override func viewDidAppear(animated: Bool) {
    if (FBSDKAccessToken.currentAccessToken() != nil && fbLoginSuccess == true)
    {
        performSegueWithIdentifier("loginSegue", sender: self)
    }
}

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
    print("User Logged In")

    if ((error) != nil) {
        // Process error
        print(error)
    }
    else if result.isCancelled {
        // Handle cancellations
    }
    else {
        fbLoginSuccess = true
        // If you ask for multiple permissions at once, you
        // should check if specific permissions missing
        if result.grantedPermissions.contains("email") {
            // Do work
        }
    }
}

希望它有所帮助!

答案 1 :(得分:1)

就Facebook已经更新了他的Swift API而言,我发现这个很好的教程有助于最终触发到下一个屏幕的segue。

http://www.talkmobiledev.com/2016/12/24/facebook-sign-in-with-swift-3/

缺少的链接是我将segue类型设置为“Present Modally”。

答案 2 :(得分:0)

我没有足够的声誉来发表评论,但改变了你的“或”。比较器' ||'到AND'&&'当检查登录是否成功并且令牌没有为我工作时。否则,无论他们是否因某种原因登录,我都会陷入困境。可能只是我的问题,但希望有助于其他人。