0

我一直在嘗試在此處實現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()" 
    } 
    } 
} 

現在不會讓我的任何用戶名設置爲數據庫。我在創建規則時感到困惑,但我的觀點是,我需要使用用戶數據的註冊流程,這些數據對數據庫中的每個用戶都是唯一的。

+0

你爲什麼試圖使用戶名是唯一的? Firebase Auth已經支持大量供應商,包括電子郵件/密碼。它會爲所有創建的帳戶生成一個唯一的UID。 – FibreChips

+0

@FibreChips是,但這些是自動生成的唯一ID,而不是用戶可以根據自己的選擇設置的用戶名。 – waseefakhtar

+0

什麼不適用於你目前的方法?事務塊應該觸發(可能多次),但是(與安全規則結合)最終應該允許您安全地聲明用戶名。 –

回答

0

嘗試在相關文章中找到的每一個答案時,對我來說簡單的方法,即不使Firebase規則參與其中或在數據庫中創建單獨的用戶名節點,是不會將if/else條件放在裏面Firebase觀察者,而是使用FIRDataSnapshot的exists()方法。

現在,這裏的技巧,雖然我只用一個簡單的觀察者嘗試只存在()方法,但是這並沒有幫助我。我所做的就是第一個查詢用戶名以,然後配合queryEqualToValue的用戶名,以過濾查詢:

refUsers.queryOrderedByChild("username").queryEqualToValue(usernameString).observeSingleEventOfType(.Value , withBlock: { 
      snapshot in 

      if !snapshot.exists() { 
       if usernameString == "" { 
        self.signupErrorAlert("Uh oh!", message: "Looks like you haven't set a username yet.") 
       } 
       else { 

        // Update database with a unique username. 

       } 
      } 
      else { 
       self.signupErrorAlert("Uh oh!", message: "\(usernameString!) is not available. Try another username.") 
      } 

     }) { error in 
      print(error.localizedDescription) 

     } 
    } 

這是第一次出這裏的大部分答案,對於我工作的。但現在,我不知道這是否會擴大規模。發佈您的經驗和最佳實踐。他們將不勝感激。