在Google登录后使用Swift 4推送视图控制器

时间:2018-05-27 05:43:47

标签: ios swift firebase firebase-authentication

我正在使用Firebase和Swift 4来开发我的应用,但是在Google登录完成后我无法推送新的视图控制器。据我所知,我应该把在didSignIn方法pushViewController代码,但这部分是我AppDelegate.swift文件(因为它实现GIDSignInDelegate当按照火力地堡的文档)。

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的情况下以编程方式创建视图,因此我也无法执行segues。

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

2 个答案:

答案 0 :(得分:3)

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

这是swift 4中的一个例子:

在didSignInFor方法中的app委托中:

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)
}

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

答案 1 :(得分:0)

如果我正确地提出您的问题,请尝试在app delegate中创建导航控制器并将其分配给窗口然后您可以使用push来查看控制器,以推送到单个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()
    }