首页 > 解决方案 > Firebase SwiftUI 的首次登录弹出窗口

问题描述

我正在尝试制作一项功能,以在用户第一次使用 Firebase 登录时显示弹出窗口,但打印时它不起作用。打印时在所有情况下都返回 false

很高兴知道,这些帐户是从控制台创建的!

AuthView.swift

    func on_connect() {
        if self.email != "" && self.pass != "" {
            Auth.auth().signIn(withEmail: self.email, password: self.pass) { (res, err) in
                if err != nil {
                    self.error = err!.localizedDescription
                    self.alert.toggle()
                    return
                }
            
                if res?.additionalUserInfo?.isNewUser == true{
                    print("IM NEW!")
                    UserDefaults.standard.set(true, forKey: "status")
                    NotificationCenter.default.post(name: NSNotification.Name("status"), object: nil)
                }
                else{
                    UserDefaults.standard.set(true, forKey: "status")
                    NotificationCenter.default.post(name: NSNotification.Name("status"), object: nil)
                }
            }
        } 
    }

感谢您的宝贵帮助!

标签: iosswiftdatabasefirebaseswiftui

解决方案


问题 #1

你有两个delivViewModels:

@ObservedObject private var viewModel = delivViewModel()
@ObservedObject var first_log: delivViewModel

第一个是在内部创建LoggedView的,第二个看起来像是通过参数传入的。很难想象你需要两者的场景,所以摆脱它们中的一个,这样你就不会最终在两者上调用函数,稍后会发生这种情况:

self.viewModel.is_first_loggin() // called on viewModel
print("first sign in-> \($first_log.first_log)")  // called on first_log

问题 #2

Auth.auth().signIn,就像几乎所有网络功能一样,是异步的。这意味着它不会立即返回(它将在未来的某个不确定的时间点返回),因此代码会在它自己完成之前 signIn完成之后直接运行。但是,回调函数/闭包中的代码(您在{}after中看到的signIn)将在完成后被调用。

在打印值方面,我只需将该代码移动到回调函数中。你会有:

Auth.auth().signIn(with: credential) { (result, error) in
             if error == nil {
                 if result?.additionalUserInfo!.isNewUser == true {
                    self.first_log = true
                 } else {
                    self.first_log = false
                 }
                 print("First log in? \(self.first_log)")
             }
         }

在显示您提到的弹出窗口方面,您可以有条件地显示$viewModel.first_log(这是假设您选择viewModel成为delivViewModel您想要保留的。

就像是:

.sheet(isPresented: $viewModel.first_log) {
  Text("Popup stuff")
}

如果您确实想要一种first_log在异步设置后在视图中响应的方法,您还可以查看onReceive如何在 SwiftUI 中使用 onReceive 从 ObservedObject 获取数据?),但是这里可能没有它的用​​例(除非您要返回 UIKit 以命令式地显示弹出窗口或其他内容)。


推荐阅读