Firebase IOS Google 登录:成功登录后更改视图

Posted

技术标签:

【中文标题】Firebase IOS Google 登录:成功登录后更改视图【英文标题】:Firebase IOS Google Sign in: Change views after successfully signed in 【发布时间】:2020-03-09 10:17:17 【问题描述】:

我正在尝试构建我的第一个 ios 应用程序并尝试按照此处的文档实现 Firebase Google 登录:https://firebase.google.com/docs/auth/ios/google-signin。如果用户成功登录,问题是尝试更改视图。我已经尝试了其他堆栈溢出帖子中有关此问题的几种解决方案,但似乎都没有。我相信这是因为其他解决方案不必考虑新的 sceneDelegate 文件,因为它们使用的是以前版本的 XCode。

Google 登录是在 App Delegate 中实现的,实际尝试对用户进行身份验证的特定代码(在 App Delegate 中)在这里:

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().signIn(with: credential)  (authResult, error) in
  if let error = error 
    // ...
    return
  
  // User is signed in
  // Here i want to change views



用户登录后如何更改视图?我已经尝试了所有我能找到的东西,但似乎一切都不起作用或导致应用程序崩溃。

非常感谢任何帮助

【问题讨论】:

您是否尝试将登录屏幕更改为应用程序的主屏幕? 是的,我是。登录屏幕到另一个视图(主页视图) 也可以写在LoginVC。从那里您可以检查用户何时登录,然后self.navigationController.pushViewController(nextVC(),animated: true) @Rob 检查用户是否从我的视图控制器登录的最佳方法是什么? 我会在 11-12 小时后给你看。 【参考方案1】:

这是一个例子,你怎么能在你的LoginVC

class LoginViewController: UIViewController 

  override func viewDidLoad() 

    super.viewDidLoad()

    GIDSignIn.sharedInstance().delegate = self

    GIDSignIn.sharedInstance()?.presentingViewController = self

  

这是我在viewDidLoad 方法中添加的内容。之后,我创建了一个继承到UIButton 的自定义按钮。我以编程方式创建了该按钮,但您可以使用@IBOutlet weak var googleB: UIButton!。然后,点击该按钮,您可以添加以下内容:

@IBAction func googleBTap(_ sender: UIButton) 

    GIDSignIn.sharedInstance().signIn()

然后,我为GIDSignInDelegate 创建了extension

extension LoginViewController: GIDSignInDelegate 

 func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) 

    if let error = error 

        print(error)

        return
    

    guard let email = user.profile.email else  return 

    guard let authentication = user.authentication else  return 

      let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                accessToken: authentication.accessToken)
  Auth.auth().signIn(with: credential)  (authResult, error) in
    if let error = error 
     print(error)
      return
    

    //If login is successful then add
   self.navigationController.pushViewController(nextVC(), animated: true) 
   //OR
   self.performSegue() //<-- Whatever goes in here, I don't use these methods as I create views programitacally, but you can use it here and move to next view 


 


嗯,这是一种方法,但是随着您的应用程序变得越来越大,最好创建一个 FirebaseHelper 类,并且您将使用许多常用方法,例如 fetchProviderssignIn for GoogleFacebookApple 登录。因此,您可以编写一个可以获取凭据并登录用户的函数,然后进行优化。

【讨论】:

【参考方案2】:

您可以在 AppDelegate 的 SignIn 函数中使用它:

let nextVC= UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") as! YourViewController
window?.rootViewController = nextVC

【讨论】:

【参考方案3】:

首先你将你的segue从LoginViewController设置为HomeViewController,并将你的segue的标识符设置为loginToHome

            if error == nil 
                print("User signed in")
                self.performSegue(withIdentifier: "loginToHome", sender: self)
            

【讨论】:

我已经尝试过了,我收到一条错误消息,提示“'AppDelegate' 类型的值没有成员'performSegue'”和“'AppDelegate' 类型的值没有成员'showStatusLine'”跨度> 您不需要添加showStatusLine。您应该将您的登录屏幕代码添加到您的LoginViewController,而不是您的AppDelegate。在你应该在谷歌中搜索 segue 之后。你可以看看这个:***.com/questions/58444248/… Google 身份验证在 App Delegate 中。如果存在“performSegue”,如何在视图控制器中检查用户是否已登录? 您了解用户是否已使用if let error = errorif error == nil 登录,因此如果错误为nil,则表示您已成功登录并执行Segue 到HomeViewController 是的,我理解错误,但它们在应用程序委托中的签名功能内,必须保留在应用程序委托中。因此,如果错误 == nil 并且用户已登录,我该如何在视图控制器中调用执行 segue?

以上是关于Firebase IOS Google 登录:成功登录后更改视图的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上退出 Google 登录无法在 Flutter Firebase 中运行

Flutter Firebase Android/ios Google 登录错误

Flutter Firebase Google Apple Facebook 登录

使用 google 登录可防止用户使用其他帐户再次登录 - iOS

Flutter:如何从谷歌登录firebase获取生日? (安卓和iOS)

使用 Google 登录通过 Firebase 签名后如何访问课堂 API