swift Firebase停止重复用户名

时间:2017-03-27 02:49:25

标签: firebase swift3 firebase-realtime-database

我想在有人注册时停止重复的用户名,我已经进行了查询以检查用户名是否存在以注册新的用户名。 但是!当我使用2个设备同时注册相同的用户名时,它会创建两个相同的用户名!我不希望这种情况发生。

以下是查询:

let username = self.usernameTxt.text



    let userRef = ref.child("users/\(username)")

    userRef.observe(.value, with: { snapshot in

        if snapshot.exists() {

            print("Username Already taken!")

        } else {

            self.signupUser() // Create new username

        }


        userRef.removeAllObservers()

    }, withCancel: { error in

        print(error)

    })

数据库看起来像这样: Database Image

以下是Firebase规则:

{
  "rules": {
    ".read": "(auth != null)",
    ".write": "(auth != null)",

 "users" :{
        ".indexOn": ["username"],
  "$uid":{
          ".read": "(auth != null) ",
          ".write": "(auth != null)",
          ".validate": "newData.isString()"
      }
    }
  }
}

SignupUser()代码:

func signupUser() {


    FIRAuth.auth()?.createUser(withEmail: self.emailTxt.text!, password: self.passwordTxt.text!, completion: {
        (user, error) in



        if let error = error {

            let alertController = UIAlertController(title: "Error", message: error.localizedDescription, preferredStyle: .alert)

            let defaultAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
            alertController.addAction(defaultAction)

            self.present(alertController, animated: true, completion: nil)
        }

        if let user = user {



            let changeRequest = FIRAuth.auth()!.currentUser!.profileChangeRequest()
            changeRequest.displayName = self.usernameTxt.text!
            changeRequest.commitChanges(completion: nil)


            let imageRef = self.userStorage.child("\(user.uid).jpg")

            let data = UIImageJPEGRepresentation(self.profilepic.image!, 0.5)

            let uploadTask = imageRef.put(data!, metadata: nil, completion: { (metadata, error) in

                if error != nil {

                    print(error!.localizedDescription)
                }

                imageRef.downloadURL(completion: { (url, error) in

                    if error != nil {

                        print(error!.localizedDescription)
                    }


                    if let url = url {



                        let userInfo: [String : Any] = ["uid" : user.uid,
                                                        "urlToImage" : url.absoluteString,
                                                        "email" : self.emailTxt.text!,
                                                        "username" : self.usernameTxt.text!,

                                                        ]

                        self.ref.child("users").child(user.uid).setValue(userInfo)
                        self.performSegue(withIdentifier: "home", sender: self)




                    }


                })



            })

            uploadTask.resume()


        }
    })

}

如果我在注册之前删除了用户名检查,它将继续创建相同的用户名,如复制它们。此外,如果有一个检查,并且有两个客户端创建相同的用户名,同时它将创建它们。 我想要的是,如果用户名存在,请停止注册过程,并显示警告说用户名已被占用!

1 个答案:

答案 0 :(得分:0)

根据您共享的数据库快照,您将用户名存储在“users / autogeneratedId / \(username)”节点。

但根据您的代码,您正在“users / \(username)”节点检查重复的用户名。

因此,每次if语句返回false,因为它在“users / \(username)”节点上找不到任何用户名。所以else语句被执行。

可能的解决方案是您必须将用户名存储在“users / \(username)”节点。请检查您的插入用户名代码。