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
类,并且您将使用许多常用方法,例如 fetchProviders
、signIn
for Google
、 Facebook
、Apple
登录。因此,您可以编写一个可以获取凭据并登录用户的函数,然后进行优化。
【讨论】:
【参考方案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 = error
或if 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