我一直在嘗試在此處實現Chris的回答:Can I make Firebase use a username login process?用於Facebook登錄,但我似乎無法控制它。Firebase中的唯一用戶名
到目前爲止,我試圖在textField上設置條件,但由於Firebase觀察者異步工作,檢查數據庫中是否存在用戶名的條件將不起作用。
let usernameString = usernameTextField.text
let uid = FIRAuth.auth()?.currentUser?.uid
ref.runTransactionBlock({ (currentData: FIRMutableData) -> FIRTransactionResult in
if var post = currentData.value as? [String : AnyObject], let uid = FIRAuth.auth()?.currentUser?.uid {
let usernamesDictionary = post["usernames"] as! NSDictionary
for (key, _) in usernamesDictionary {
if key as? String == usernameString {
print("username not available: \(key)")
}
else if usernameString == "" {
print("Uh oh! Looks like you haven't set a username yet.")
}
else if key as? String != usernameString {
print("username available: \(key)")
print("All set to go!")
let setValue: NSDictionary = [usernameString!: uid]
post["usernames"] = setValue
currentData.value = post
}
}
return FIRTransactionResult.successWithValue(currentData)
}
return FIRTransactionResult.successWithValue(currentData)
}
然後我試圖創建/用戶名/節點數據庫並設置規則:
{
"rules": {
"usernames": {
".read": "auth != null",
".write": "newData.val() === auth.uid && !data.exists()"
}
}
}
現在不會讓我的任何用戶名設置爲數據庫。我在創建規則時感到困惑,但我的觀點是,我需要使用用戶數據的註冊流程,這些數據對數據庫中的每個用戶都是唯一的。
你爲什麼試圖使用戶名是唯一的? Firebase Auth已經支持大量供應商,包括電子郵件/密碼。它會爲所有創建的帳戶生成一個唯一的UID。 – FibreChips
@FibreChips是,但這些是自動生成的唯一ID,而不是用戶可以根據自己的選擇設置的用戶名。 – waseefakhtar
什麼不適用於你目前的方法?事務塊應該觸發(可能多次),但是(與安全規則結合)最終應該允許您安全地聲明用戶名。 –