我已经成功实现了Firebase预制UI。它包括Google,Facebook,电子邮件和电话的提供商。启动应用程序后,您将通过登录按钮进入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)");
}
}
}
答案 0 :(得分: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
}
}
}
无论我尝试什么,此代码均失败。第一个代码块是正确的,我的问题是我的情节提要剧集显示(按下),不存在(模态显示)。一旦我更改了此BAM,它就会起作用。哎呀,这么简单,但发疯了。再次感谢您的帮助!
答案 1 :(得分: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)
}