使用 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。用户登录后,如何实现从登录页面到主屏幕的segue
(ViewController
)。
AppDelegate
到 GIDSignInDelegate
附加了一个方法,它会在用户登录时通知我们。我想在那时将 segue
发送到主屏幕。此代码在AppDelegate
中,由于新的SceneDelegate
行为,我无法使用AppDelegate's
window
从StoryBoard
加载。
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 身份验证
使用 Firebase 登录 Twitter iOS 的 OAuthProvider 有错误的构造函数
有人设法在iOS上使用Firebase实现LinkedIn登录吗?