簡體   English   中英

如何在 SwiftUI 中使用 Firebase Auth 登錄后檢查用戶是否已存在於 Firestore 集合中

[英]How to check if a user already exists in a Firestore collection after signing in with Firebase Auth in SwiftUI

@Published var isNewUser: Bool?

init() {
  self.isNewUser = false
}

func checkIfTheUserExistsInDataBase(
  userID: String?, completion: @escaping (_ isNewuser: Bool) -> Void
) {
  let docRef = db.collection("users").whereField("user_id", isEqualTo: userID!).limit(to: 1)
  docRef.getDocuments { querySnapshot, error in
    if error != nil {
      print(error?.localizedDescription)
    } else {
      if let doc = querySnapshot?.documents, doc.isEmpty {
        completion(true)
      } else {
        completion(false)
      }
    }
  }
}

func login(
  email: String, password: String,
  completion: @escaping (_ error: Error?, _ isEmailVerified: Bool) -> Void
) {
  Auth.auth().signIn(withEmail: email, password: password) { authDataResult, error in
    if error == nil {
      if authDataResult!.user.isEmailVerified {
        DispatchQueue.main.async {
          self.checkIfTheUserExistsInDataBase(userID: authDataResult?.user.uid) { isNewUser in
            self.isNewUser = isNewUser
          }
        }
        UserDefaults.standard.set(authDataResult?.user.uid, forKey: CurrentUserDefaults.userID)
        completion(error, true)
      } else {
        print("Email not verified")
        completion(error, false)
      }
    } else {
      completion(error, false)
    }
  }
}

我嘗試使用DispatchSemaphore讓運行時間更長的 function 首先執行,即checkIfTheUserExistsInDataBase ,但它凍結了我的應用程序。 有一個更好的方法嗎?

Firebase 支持 async/await(參見這個短片、這個視頻和我創建的這篇文來詳細解釋這一點。

要回答您的問題:您應該使用 async/await 來調用用戶登錄,等待結果,檢查用戶是否存在於您的 Firestore 集合中,以及更新 UI。

以下代碼片段(基於此示例應用程序)使用 Firestore 中新的COUNT功能來計算users集合中的文檔數量,以確定是否至少有一個用戶的 ID 為剛剛登錄的用戶.

func isNewUser(_ user: User) async -> Bool {
  let userId = user.uid
  let db = Firestore.firestore()
  let collection = db.collection("users")
  let query = collection.whereField("userId", isEqualTo: userId)
  let countQuery = query.count
  do {
    let snapshot = try await countQuery.getAggregation(source: .server)
    return snapshot.count.intValue >= 0
  }
  catch {
    print(error)
    return false
  }
}

func signInWithEmailPassword() async -> Bool {
  authenticationState = .authenticating
  do {
    let authResult = try await Auth.auth().signIn(withEmail: self.email, password: self.password)
    if await isNewUser(authResult.user) {

    }
    return true
  }
  catch  {
    print(error)
    errorMessage = error.localizedDescription
    authenticationState = .unauthenticated
    return false
  }
}

有關如何在 SwiftUI 應用程序中實施 Firebase 身份驗證的更多詳細信息,請觀看此視頻

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM