在Firebase和Swift 3中注册之前,如何validation用户名是否存在?

我已经整合了五个视图控制器的注册流程,而不是一个用于Firebase注册的中央VC。

通常在注册之前会出现数据丢失的问题,但是我将所有输入的值通过segue以编程方式推送到最终确认页面并最终将数据发送到Firebase以进行身份​​validation。

我的问题在于 – 我想注册检查用户名是否存在。 对于我的应用程序的用户体验来说这是必不可少的,我不能只做一个VC。

这是我为UsernameViewController提供的代码:

let rootRef = FIRDatabase.database().reference() rootRef.queryOrdered(byChild: "users").queryEqual(toValue: self.chooseUsernameTextField.text!) .observe(FIRDataEventType.value, with: { (snapshot: FIRDataSnapshot!) in if snapshot.hasChildren() == false { print("not found") } else { print("usr found") } }); 

这是我对Firebase数据库安全规则的代码

  { "rules": { ".read": false, ".write": false, "users": { ".validate": "data.child('username').val() === true", ".read": true } } } 

最后,我的数据树的截图(我的数据树不会让我嵌套任何新用户或创建没有值的用户节点由于某种原因):

Firebase数据树的图片:应用程序名称/用户

我怀疑我的数据规则和树是否配置正确以匹配代码,但我陷入了一个XY问题,即不知道如何处理Firebase安全性以使我的用户名检查代码完成。

请帮帮我! 🙁

如果在Firebase的Auth部分中创建了用户,那么您实际上可以使用fetchProviders方法,如果没有返回提供程序,则您在Auth部分中没有用户。

 FIRAuth.auth()?.fetchProviders(forEmail: email, completion: { (providers, error) in if providers == nil { // user doesn't exist } else { // user does exist } }) 

我没有测试过代码,但理论是按用户名排序,等于你要查找的用户名。 如果存在此快照,则表示您已拥有数据库中具有该名称的用户(如果不存在)。

当我有机会更新我的post时,将运行并测试代码。

  let rootRef = FIRDatabase.database().reference() rootRef.child("users").queryOrdered(byChild:"username").queryEqual(toValue: self.chooseUsernameTextField.text!) .observe(.value, with: { (snapshot) in if snapshot.exists() == false { print("not found") } else { print("usr found") } });