使用 Firebase 登录 iOS 13.2 的导航/Segue

Posted

技术标签:

【中文标题】使用 Firebase 登录 iOS 13.2 的导航/Segue【英文标题】:LogIn Navigation/Segue for iOS 13.2 using Firebase 【发布时间】:2019-11-05 13:56:33 【问题描述】:

我正在尝试使用 Firebase 为我的 iOS 13.2 应用实现 SignIn with Google。用户登录后,如何实现从登录页面到主屏幕的segueViewController)。

AppDelegateGIDSignInDelegate 附加了一个方法,它会在用户登录时通知我们。我想在那时将 segue 发送到主屏幕。此代码在AppDelegate 中,由于新的SceneDelegate 行为,我无法使用AppDelegate's windowStoryBoard 加载。

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) 
        if (error == nil) 
          // Perform any operations on signed in user here.
          // ...
            print("User signed in")

            //place to perform segue
            //write code for segue here

        
        else 
          print("\(error.localizedDescription)")
        
        if user != nil
        
        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
          // ...          
        
               
       

预期结果:https://***.com/a/27136455/6311566 但这不适用于 iOS 13.2

【问题讨论】:

【参考方案1】:

老路

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
        // Override point for customization after application launch.
        let rootVC = window?.rootViewController

        return true
    

这是因为 AppDelegate.swift 没有 window 属性了。现在您必须使用 SceneDelegate.swift 来更改根视图控制器。如本例所示:

现在做什么

现在,您将把代码移到应用的 SceneDelegate Swift 文件中:

class SceneDelegate: UIResponder, UIWindowSceneDelegate 

     var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
         // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
         // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
         // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else  return 

        // Create the root view controller as needed
        let vc = ViewController()
        let nc = UINavigationController(rootViewController: vc)

        // Create the window. Be sure to use this initializer and not the frame one.
        let win = UIWindow(windowScene: winScene) 
        win.rootViewController = nc
        win.makeKeyAndVisible()
        window = win
    

    // ... the rest of SceneDelegate

【讨论】:

问题是我的 AppDelegate 包含告诉我用户何时登录的代码块。当时我需要继续,该代码在 SceneDelegate 中不可用。 好的,我明白了,但是在 segue 之前,您需要在用户登录后使用 UIWindowScene 创建 root 来进行 segue。 从 AppDelegate 类你不能执行 segue。所以这条线永远不会在你的 AppDelegate class.self.window?.rootViewController?.performSegue 中工作 这是一个适用于 ios 13 的示例:github.com/mattneub/RegistrationExample 好的,感谢您的回复,需要阅读有关 SceneDelegate 的信息。与此同时,可以使用let window = UIApplication.shared.windows.first 访问 AppDelegate 中的窗口,这对我来说是一种快速修复。

以上是关于使用 Firebase 登录 iOS 13.2 的导航/Segue的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 Facebook 令牌在 iOS 上发送 Firebase 邀请登录 Firebase 身份验证

在 IOS 中使用电话号码登录 Firebase

使用 Firebase 登录 Twitter iOS 的 OAuthProvider 有错误的构造函数

有人设法在iOS上使用Firebase实现LinkedIn登录吗?

让用户使用 Firebase 登录(自定义 iOS 身份验证)

有人设法在 iOS 上使用 Firebase 实现 LinkedIn 登录吗?