【问题标题】:Swift Firebase check if email is already in useSwift Firebase 检查电子邮件是否已在使用中
【发布时间】:2016-12-29 02:27:15
【问题描述】:

我希望能够检查一个电子邮件地址是否已被使用(所以如果有人输入 test1@test.com 但另一个用户已经使用该电子邮件帐户注册)。

我有一个简单的测试,如果它没有被使用,图像视图显示一个绿色箭头,如果它已经被使用,那么它是红色 x

当我创建用户时,我使用以下代码

FIRAuth.auth()?.createUser(withEmail: email, password: password, completion: { (user, error) in

    if error == nil {

      self.ref.child("userEmails").child((user?.uid)!).setValue(email)


      FIRAuth.auth()!.signIn(withEmail: email,
                             password: password)

    } else {
      //registration failure
    }

我想要检查的是

func checkIfEmailExists(textField: UITextField) {

    let ref = FIRDatabase.database().reference()

    let email = firstContainerTextField.text ?? ""

    ref.child("userEmails").queryEqual(toValue: email)
      .observe(.value, with: { snapshot in

        if (self.firstContainerTextField.text?.isEmpty)! {
          self.firstContainerImage.image = UIImage.init(named: "emptyBlue.png")

        } else if !(self.firstContainerTextField.text?.isEmpty)! && !snapshot.exists() {
          self.firstContainerImage.image = UIImage.init(named: "redEx.png")

        } else if snapshot.exists() {
          self.firstContainerImage.image = UIImage.init(named: "greenCheck.png")
        }

    });

}

到目前为止,它不起作用,因为我可以在我的数据库中看到 test1@test.com 存在。 谁能告诉我我错过了什么?

编辑

我已经更新了我的代码。我正在使用 hasChildren,我搜索了类似的问题,他们似乎指向了这个方向,但我仍然无法得到我正在寻找的结果

func checkIfEmailExists(textField: UITextField) {

let ref = FIRDatabase.database().reference()

let email = firstContainerTextField.text ?? ""

ref.child("userEmails").queryEqual(toValue: email)
  .observe(.value, with: { snapshot in

    if !snapshot.hasChildren() {

      self.firstContainerImage.image = UIImage.init(named: "redEx.png")

    } else {

      for child in snapshot.children.allObjects as! [FIRDataSnapshot] {

        let tmp = child.value as! String


        if tmp == email {

          self.firstContainerImage.image = UIImage.init(named: "greenCheck.png")

        }

      }
    }

  });
}

编辑 2

我更改了设置用户的方式

self.ref.child("users").child((user?.uid)!).setValue(["Email": email])

所以现在我的数据库看起来像这样

users
    *****uid*****
        Email: "test@test.com

【问题讨论】:

  • 当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。如果没有结果,您将得到一个空列表。您需要查看snapshot.hasChildren()。见firebase.google.com/docs/reference/ios/firebasedatabase/api/…
  • @FrankvanPuffelen 我阅读了该文档并看到了 snapshot.hasChild(String) ...当我使用它并输入电子邮件时,我收到一个崩溃说 (hasChild:) 必须是非空的字符串且不包含 '.' '#' '$' '[' 或 ']''
  • 我链接到hasChildren()(复数),而不是hasChild()(它需要一个字符串参数来指示要检查的孩子)。

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


【解决方案1】:

正如我之前评论的:您需要通过调用snapshot.hasChildren() 来检查查询是否有任何结果。

func checkIfEmailExists(textField: UITextField) {

    let ref = FIRDatabase.database().reference()

    let email = firstContainerTextField.text ?? ""

    ref.child("userEmails").queryEqual(toValue: email)
      .observe(.value, with: { snapshot in
        if (!snapshot.hasChildren()) {
            // User doesn't exist yet...
        }
    });

}

【讨论】:

  • 我已经尝试将它与其他 SO 答案结合使用,但我似乎仍然无法让它发挥作用。
【解决方案2】:

以下是您可能正在寻找的Firebase function 的结构(Swift 4):

Auth.auth().fetchProviders(forEmail: emailAddress, completion: {
        (providers, error) in

        if let error = error {
            print(error.localizedDescription)
        } else if let providers = providers {
            print(providers)
        }
    })

如果电子邮件地址已注册给用户,您将获得使用该电子邮件地址的提供商的列表。否则,提供者列表将为空,因此电子邮件地址未注册。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    • 2020-11-13
    • 2019-01-10
    • 1970-01-01
    • 2019-05-30
    相关资源
    最近更新 更多