为什么我的应用程序在身份验证期间无法找到用户?



我在过去的一周有一个问题,在登录/注册时,我的else语句在MainTabView中执行(这意味着它找不到当前用户??)因此,我看到的不是登录并显示主导航,而是一个白色的"正在加载"。登录后的画面。这是奇怪的,因为一些登录的工作很好,其他人崩溃的应用程序。任何帮助是非常感激!

我不认为问题是在EmailAuth或CreateAccountAuth,但让我知道,如果你想看到这些代码。

AuthViewModel:

import SwiftUI
import FirebaseAuth
import FirebaseCore
import FirebaseStorage
import FirebaseFirestore
import FirebaseFirestoreSwift
class AuthViewModel: NSObject, ObservableObject {
@Published var userSession: FirebaseAuth.User?
@Published var currentUser: User?
@Published var selectedImage: UIImage?

private let service = UserService()

static let shared = AuthViewModel()

override init() {
super.init()
userSession = Auth.auth().currentUser

fetchUser()
}

func login(withEmail email: String, password: String) {
Auth.auth().signIn(withEmail: email, password: password) { result, error in
if let error = error {
print("DEBUG: Failed to sign in with error (error.localizedDescription)")
return
}

self.userSession = result?.user
self.fetchUser()
}
}

func register(withEmail email: String, password: String, fullname: String) {
Auth.auth().createUser(withEmail: email, password: password) { result, error in
if let error = error {
print("DEBUG: Failed to register with error (error.localizedDescription)")
return
}

guard let user = result?.user else { return }
self.userSession = user
let data: [String: Any] = ["email": email,
"fullname": fullname]

COLLECTION_USERS
.document(user.uid)
.setData(data)
self.uploadProfileImage(self.selectedImage)
}
}

func signOut() {
// sets user session to nil so we show login view
self.userSession = nil

// signs user out on server
try? Auth.auth().signOut()
}

func uploadProfileImage(_ image: UIImage?) {
guard let uid = userSession?.uid else { return }

ImageUploader.uploadImage(image: image) { profileImageUrl in
COLLECTION_USERS
.document(uid)
.updateData(["profileImageUrl": profileImageUrl])
//{ _ in self.userSession = user }
}
}

func fetchUser() {
guard let uid = userSession?.uid else { return }

COLLECTION_USERS.document(uid).getDocument { snapshot, _ in
guard let user = try? snapshot?.data(as: User.self) else { return }
self.currentUser = user
}
}
}

应用程序文件:

struct Page_TurnerApp: App {

init() {
FirebaseApp.configure()
}

var body: some Scene {
WindowGroup {
NavigationView {
ContentView().environmentObject(AuthViewModel())
}
}
}
}

ContentView

struct ContentView: View {
@EnvironmentObject var viewModel: AuthViewModel

var body: some View {
Group {
if viewModel.userSession != nil {
MainTabView()
} else {
EmailAuth()
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}

MainTabView

struct MainTabView: View {
@State private var selectedIndex = 0
@EnvironmentObject var viewModel: AuthViewModel

var body: some View {
if let user = viewModel.currentUser {
TabView(selection: $selectedIndex) {
ExploreView()
.onTapGesture {
self.selectedIndex = 0
}
.tabItem {
Image(systemName: "house")
}.tag(0)

SearchView()
.onTapGesture {
self.selectedIndex = 1
}
.tabItem {
Image(systemName: "magnifyingglass")
}.tag(1)

ConversationsView()
.onTapGesture {
self.selectedIndex = 2
}
.tabItem {
Image(systemName: "message")
}.tag(2)

AccountView(user: user)
.onTapGesture {
self.selectedIndex = 3
}
.tabItem {
Image(systemName: "person.crop.circle")
}.tag(3)
}
} else {
Text("loading...")
}
}
}

我的问题是,除非有一个配置文件图像,否则我的用户不会被创建。这就是为什么它对某些用户有效,而对另一些用户却崩溃了。我改变了let profileImageUrl: Stringlet profileImageUrl: String?,所有用户现在可以登录

相关内容

最新更新