使用Firebase和Xcode 12的SwiftUI应用程序生命周期
我得到了这个线程错误使用Firebase和Xcode 12的SwiftUI应用程序生命周期,firebase,google-cloud-firestore,swiftui,ios14,xcode12,Firebase,Google Cloud Firestore,Swiftui,Ios14,Xcode12,我得到了这个线程错误线程1:EXC\u BAD\u访问(code=2,address=0x7ffeecc0bfe8) 根据我在示例.App中配置启动的方式,控制台会打印未找到挂起的快照或UIApplicationAdaptor不符合AppDelegate 下面是Xcode 12的代码(直接来自Firebase的Peter Friese,将颜色替换为示例作为应用程序名称): 我的InitialView如下所示: import SwiftUI struct InitialView: View
线程1:EXC\u BAD\u访问(code=2,address=0x7ffeecc0bfe8)
根据我在示例.App
中配置启动的方式,控制台会打印未找到挂起的快照
或UIApplicationAdaptor不符合AppDelegate
下面是Xcode 12的代码(直接来自Firebase的Peter Friese,将颜色
替换为示例
作为应用程序名称):
我的InitialView
如下所示:
import SwiftUI
struct InitialView: View {
@EnvironmentObject var session: SessionStore
func listen() {
session.listenAuthenticationState()
}
var body: some View {
Group {
if session.isLoggedIn {
MainView()
}
if !session.isLoggedIn {
SignInView()
}
}
.onAppear(perform: listen)
}
}
我的会话存储
也是这样
import Foundation
import Combine
import Firebase
class SessionStore: ObservableObject {
@Published var isLoggedIn = false
var userSession: User?
var handle: AuthStateDidChangeListenerHandle?
func listenAuthenticationState() {
handle = Auth.auth().addStateDidChangeListener({ (auth, user) in
if let user = user {
print(user.email ?? "")
let firestoreUserId = Ref.FIRESTORE_DOCUMENT_USERID(userId: user.uid)
firestoreUserId.getDocument { (document, error) in
if let dict = document?.data() {
guard let decodeUser = try? User.init(fromDictionary: dict) else { return }
self.userSession = decodeUser
}
}
self.isLoggedIn = true
} else {
print("isLoggedIn is false")
self.isLoggedIn = false
self.userSession = nil
}
})
}
}
已更新
// Firestore
static var FIRESTORE_ROOT = Firestore.firestore()
// Firestore - Users
static var FIRESTORE_COLLECTION_USERS = FIRESTORE_ROOT.collection("users")
static func FIRESTORE_DOCUMENT_USERID(userId: String) -> DocumentReference {
return FIRESTORE_COLLECTION_USERS.document(userId)
}
嗨,大卫,我没法重新解释这件事。在我看来,你的代码基本上没问题。您能否共享
Ref.FIRESTORE\u DOCUMENT\u USERID的代码(最好将其添加到原始问题中)。另外,你能详细解释一下“取决于我如何配置我的启动”是什么意思吗?嗨,@PeterFriese。通过“配置我的启动”,我的意思是,我尝试在我的应用程序委托
的didFinishLaunchingWithOptions
中初始化Firebase,而不是在@main
结构的初始值设定项中初始化Firebase。我还尝试了其他事情,比如不使用应用程序委托
。当我第一次创建项目时,是否可能不选择“应用程序委派”?我可以用任何其他方式初始化Firebase吗?如果您只使用Firestore,您可以在应用程序类的初始化器中初始化Firebase-请参阅的“开始使用SwiftUI应用程序生命周期”部分中的第一个代码段。无论如何,这都不应该崩溃。还有别的事情。您是否使用最新版本的Firebase吊舱?是的。让我试试,然后再回到这篇文章。谢谢你,彼得。
// Firestore
static var FIRESTORE_ROOT = Firestore.firestore()
// Firestore - Users
static var FIRESTORE_COLLECTION_USERS = FIRESTORE_ROOT.collection("users")
static func FIRESTORE_DOCUMENT_USERID(userId: String) -> DocumentReference {
return FIRESTORE_COLLECTION_USERS.document(userId)
}