Firebase中的唯一用户名

时间:2017-02-14 18:57:04

标签: swift firebase firebase-realtime-database firebase-authentication

我一直试图在这里实施Chris的答案:Can I make Firebase use a username login process?用于Facebook登录,但我似乎无法理解它。

到目前为止,我已尝试在textField上设置条件,但由于Firebase观察者异步工作,检查数据库中是否存在用户名的条件将无效。

#if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000
  return __builtin_mul_overflow(*pA, iB, pA);
#else
  ... code without the builtin which succeeds if check is short-circuited ...
#endif

然后我尝试在数据库中创建/ usernames / node并将规则设置为:

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)
}

现在不允许我为数据库设置任何用户名。我对创建规则感到困惑,但我的全部观点是我需要一个注册流程,其中包含数据库中每个用户唯一的用户名数据。

1 个答案:

答案 0 :(得分:0)

在尝试我在相关帖子中找到的每个答案时,对我来说简单的方法是什么,即没有让Firebase规则参与其中或在数据库中创建单独的用户名节点,就是不在其中放置if / else条件Firebase观察者,而是使用FIRDataSnapshot的exists()方法。

现在这是诀窍,虽然我只用一个简单的观察者尝试了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)

        }
    }

这是第一次出现对我有用的大部分答案。但就目前而言,我不知道这是否会扩大。发布您的经验和最佳实践。他们将不胜感激。