如何在Firebase身份验证后转换到新的viewController?

问题描述 投票:0回答:2

我已经成功实现了Firebase预构建的UI。它包括谷歌,脸书,电子邮件和电话的提供商。启动应用程序会带您进入带有登录按钮的viewController。单击按钮会显示authUIController。登录到其中一个提供商后,authUIController消失了,我用登录按钮带回原来的viewController。如何在身份验证后转换到新的viewController。我确信它的愚蠢简单,而且我看起来有些东西。请帮忙。

我尝试在我的代码的几个不同的地方使用present(viewController(), animation: true, completion: nil)performSegue(withIdentifier: "goHome", sender: nil)。我将我的提供者的数组从viewDidLoad()移动到viewDidAppear(),什么都没有。我不知道该怎么做。我搜索了Google的文档,YouTube和堆栈溢出没有运气。我知道我应该只提交我的代码片段,但我很遗憾,我应该显示我已经粘贴了viewControllers代码。

import UIKit
import Firebase
import FirebaseAuth
import FirebaseUI
import FirebaseDatabase
import FacebookCore
import FacebookLogin
import FBSDKLoginKit
import FacebookShare
import GoogleSignIn

class LoginViewController: UIViewController, FUIAuthDelegate,
GIDSignInUIDelegate, FBSDKLoginButtonDelegate {

    @IBAction func loginAction(sender: AnyObject) {
        // Present the default login view controller provided by authUI
        let authViewController = authUI?.authViewController();
        self.present(authViewController!, animated: true, completion: nil)
    }

    let loginButton = FBSDKLoginButton()

    fileprivate(set) var auth:Auth?
    fileprivate(set) var authUI: FUIAuth? //only set internally but get externally
    fileprivate(set) var authStateListenerHandle: AuthStateDidChangeListenerHandle?

    override func viewDidLoad() {
        super.viewDidLoad()

        if let accessToken = AccessToken.current {
            // User is logged in, use 'accessToken' here.
        }

        GIDSignIn.sharedInstance().uiDelegate = self
        GIDSignIn.sharedInstance().signIn()

        self.authStateListenerHandle = self.auth?.addStateDidChangeListener { (auth, user) in
            if user != nil {(self.performSegue(withIdentifier: "goHome", sender: nil))
            } else {
                self.loginAction(sender: self)
                return
            }
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        let providers: [FUIAuthProvider] = [
            FUIEmailAuth(),
            FUIGoogleAuth(),
            FUIFacebookAuth(),
            FUIPhoneAuth(authUI: FUIAuth.defaultAuthUI()!),
            ]
        //loginButton.delegate = self

        // Do any additional setup after loading the view, typically from a nib.
        self.auth = Auth.auth()
        self.authUI = FUIAuth.defaultAuthUI()
        self.authUI?.delegate = self
        self.authUI?.providers = providers
    }

    func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
        if let error = error {
            print(error.localizedDescription)
            return
        }
        let credential = FacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)

        Auth.auth().signInAndRetrieveData(with: credential) { (authResult, error) in
            if let error = error {
                // ...
                return
            }
            // User is signed in
            // ...
        }
    }

    func loginButtonDidLogOut(_ loginButton: FBSDKLoginButton!) {
        print("User Logged Out")
    }

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
        // ...
        if let error = error {
            // ...
            return
        }

        guard let authentication = user.authentication else { return }
        let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                       accessToken: authentication.accessToken)
        Auth.auth().signInAndRetrieveData(with: credential) { (authResult, error) in
            if let error = error {
                // ...
                return
            }
        }
    }

    // Implement the required protocol method for FIRAuthUIDelegate

    func authUI(_ authUI: FUIAuth, didSignInWith user: User?, error: Error?) {
        guard let authError = error else { return }

        let errorCode = UInt((authError as NSError).code)

        switch errorCode {
        case FUIAuthErrorCode.userCancelledSignIn.rawValue:
            print("User cancelled sign-in");
            break

        default:
            let detailedError = (authError as NSError).userInfo[NSUnderlyingErrorKey] ?? authError
            print("Login error: \((detailedError as! NSError).localizedDescription)");
        }
    }
}

ios swift firebase firebase-authentication firebaseui
2个回答
1
投票

我简直不敢相信我想出来了!谢谢大家的帮助!下面是我的代码(这是正确的代码),但我一直收到一个错误:LoginViewController:0x104f17660>其视图不在窗口层次结构中!

func viewDidAppear(){
        self.authStateListenerHandle = self.auth?.addStateDidChangeListener { (auth, user) in
        if user != nil {(self.performSegue(withIdentifier: "goHome", sender: nil))
        } else {
            self.loginAction(sender: self)
            return
        }
    }
}

我一直在周围转换东西......我试过的其他代码就是

func viewDidAppear(){
        self.authStateListenerHandle = self.auth?.addStateDidChangeListener { (auth, user) in
        if user != nil {(self.present(UIViewController(), animated: true, completion: nil))
        } else {
            self.loginAction(sender: self)
            return
        }
    }
}

无论我尝试什么,这段代码都失败了。第一个代码块是正确的,我的问题是我的故事板segue是show(推送),不存在(模态)。一旦我改变了这个BAM就行了。呃,如此简单但疯狂地弄明白。再次感谢帮助人员!


0
投票

如果正确调用FirebaseUI,您应该在名为didSignInWith的方法中处理结果,如下所示:

func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
  // handle user and error as necessary
}

你可以看一下这个链接到Firebase documentation

样品:

func authUI(_ authUI: FUIAuth, didSignInWith user: FIRUser?, error: Error?) {
    if error != nil {
        // HANDLE login
        login()
    } else {
        // HANDLE Error
    }
}

func login() {
    let authUI = FIRAuthUI.init(auth: FIRAtuth.auth()!)
    authUI?.delegate = self
    let authViewController = authUI?.authViewController()
    self.present(authViewController!, animated: true, completion: nil)
}
© www.soinside.com 2019 - 2024. All rights reserved.