谷歌登录后使用 Swift 4 推送视图控制器

Posted

技术标签:

【中文标题】谷歌登录后使用 Swift 4 推送视图控制器【英文标题】:Pushing a view controller using Swift 4 after Google Sign In 【发布时间】:2018-05-27 05:43:47 【问题描述】:

我正在使用 Firebase 和 Swift 4 开发我的应用,但在 Google 登录完成后我无法推送新的视图控制器。据我所知,我应该将 pushViewController 代码放在 didSignIn 方法中,但该部分在我的 AppDelegate.swift 文件中(因为它实现了 GIDSignInDelegate,根据 Firebase 文档)。

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)
    // ...

现在,我想在登录完成后推送一个新的视图控制器,使用类似:

navigationController?.pushViewController(BrowserViewController(), animated: true)

但似乎不可能从 AppDelegate 文件中推送 VC,因为那里不存在 navigationController。我在不使用 Storyboard 的情况下以编程方式创建视图,因此我也无法执行 segue。

在用户使用 Google 登录完成登录后,我如何能够展示新的 VC?我应该将 didSignInFor 方法移动到实际托管登录按钮的视图控制器(即使文档似乎没有说这是正确的方法)?

【问题讨论】:

【参考方案1】:

解决此问题的一种方法是在登录成功时使用通知中心从您的应用代理发布通知,然后在托管登录按钮的视图控制器中观察此通知。

这是 swift 4 中的示例:

在您的应用委托中的 didSignInFor 方法中:

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)
    // ...

    NotificationCenter.default.post(
        name: Notification.Name("SuccessfulSignInNotification"), object: nil, userInfo: nil)

在承载登录按钮的 ViewController 中:

 override func viewDidLoad() 
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(didSignIn), name: NSNotification.Name("SuccessfulSignInNotification"), object: nil)



@objc func didSignIn()  

    // Add your code here to push the new view controller
  navigationController?.pushViewController(BrowserViewController(), animated: true)



deinit 
    NotificationCenter.default.removeObserver(self)

如果您还想处理失败的登录尝试,您可以使用相同的技巧并发布失败通知,然后在视图控制器中观察它。或者,您也可以对两种情况(成功和失败)使用一个通知,并在每种情况下传递不同的值。

【讨论】:

嘿,谢谢!我以前没有想到这一点——这绝对是一个创造性的解决方案! 非常有创意的解决方案!非常感谢您!【参考方案2】:

如果我没有正确回答您的问题,请尝试在应用程序委托中创建一个导航控制器并将其分配给窗口,然后您可以使用 push to view controller 推送到个人 viewcontroller

navigationController?.pushViewController(BrowserViewController(), animated: true)

供参考:

class AppDelegate: UIResponder, UIApplicationDelegate
 

    // Main Nevigation view controller maintained stack
    var navigationController: UINavigationController!
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
        // Override point for customization after application launch.
        // Home Screen view Object
        let homeVC = HomeVC.init(nibName: "HomeVC", bundle: nil)

        // Allocate navigation controller
        self.navigationController = 
          UINavigationController(rootViewController: homeVC)
                return true

       // Custom navigation View Assign window root view controller.
        self.window?.rootViewController = self.navigationController
        self.window?.makeKeyAndVisible()
    

【讨论】:

以上是关于谷歌登录后使用 Swift 4 推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

OneSignal 按下推送通知去一个视图控制器 iOS Swift

关闭两个视图控制器,然后推送一个视图控制器 - Swift

标签栏控制器显示最后推送的控制器 - swift 4

swift 3登录后如何返回主页或以前的视图控制器

使用背景颜色“清除”推送新视图控制器

推送视图控制器后导航控制器隐藏