0

我想知道如何在用户创建帐户时为其创建第二个(匿名)标识符。

这样做的原因是我让用户创建一个帐户,以便他们可以获得奖励,但我需要知道他们是否应该在再次登录他们的帐户之前获得奖励。

视图控制器中有应用程序的帐户部分,用户可以访问所有与帐户相关的数据。在同一视图控制器中还有应用程序的另一部分,任何用户都可以访问存储在该数据库中的信息,我们将其称为“公共数据库”,他们无需创建帐户即可查看。(创建账户的用户不能查看公共数据库,除非他们注销他们的账户)

用户需要在未登录的情况下调用 Firebase 实时数据库,然后在当天晚些时候登录他们的帐户,以查看他们是否因在该公共数据库中搜索正确的分支而获得奖励。

例如:

假设用户使用他们的电子邮件和密码创建他们的帐户。他们从 0 点开始并注销。他们在稍后或第二天再次使用他们的帐户登录之前返回以从数据库中获取答案,并希望查看他们是否因在未登录时查看该数据库的一个分支而获得奖励。如果他们查看了该分支,然后当他们登录时,他们现在将获得 1 分。

任何用户都可以访问数据库的这些分支,但如果他们不先创建帐户,则不会获得奖励。用户目前确实可以访问数据库的这些分支,但无法识别,因为他们不需要这样做。

我允许用户创建一个帐户,以奖励访问任何用户已经有权访问的数据库部分。

我希望这是有道理的。

我不需要知道如何为用户创建帐户,只需要知道如何在用户未登录时识别用户,因此当他们登录时,他们可以在不知道他们之前访问的情况下写入他们的帐户他们访问了他们未登录的数据库部分的数据库。

我知道您希望我显示一些代码,无论是否与我正在寻找的答案相关......

func createNewUser()
{
   guard let email = registerEmailField.text, let password = registerPasswordField.text, let name = registerNameField.text
        else
    {
        return
    }

   if self.registerEmailField.text!.isValidEmail == true
    {
        Auth.auth().createUser(withEmail: email, password: password)
        {
            authResult, error in
            if error != nil
            {
                self.newUserError()
                return
            }
            else
            {
            guard let uid = authResult?.user.uid
            else
            {
                return
            }
            let user = ["Name": name,
                        "email": email,
                        "password": password]
              
            let gold = self.goldLabel.text ?? "\(0)"
            let rewards = self.rewardLabel.text ?? "\(0)"

            let savingUserScores = ["gold": gold as Any,
                                    "rewards": rewards as Any]

        Database.database().reference().child("Users").child(uid).updateChildValues(user, withCompletionBlock:
        {
            (error, ref) in
            if let error = error
            {
                print("Failed to update database values with error: ", error.localizedDescription)
                return
            }
        Database.database().reference().child("Users").child(uid).child("scores").updateChildValues(savingUserScores, withCompletionBlock:
        {
            (error, ref) in
            if let error = error
            {
                print("Failed to update database values with error: ", error.localizedDescription)
                return
            }
            else
            {
                self.sendEmailVerification()
                self.hideRegisterWindow()
                self.hideLoginKeyboard()
            DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(2), execute:
                    {
                        self.userView.isHidden = true
                        self.checkEmailButton.isHidden = false
                    })
            }
          })
        })
       }
     }
   }
  }
}


func logInUser()
{
  guard let email = logInEmailField.text, let password = logInPasswordField.text
    else
    {
        return
    }
    Auth.auth().signIn(withEmail: email, password: password)
    {
        [weak self] user, error in
        if error != nil
        {
           print("I can't put all this code in here")
        }
        else
        {
          guard let user = Auth.auth().currentUser
                else
            {
                return
            }
            if user.isEmailVerified
            {
              print("I can't put all of the code in here either")
            }
        }
    }
}


func displayUserScoresFromFirebase()
{
    guard let userID = Auth.auth().currentUser?.uid
    else
    {
        return
    }
    Database.database().reference().child("Users").child(userID).child("Name").observe(.value)
    {
        (snapshot)
        in
        guard let name = snapshot.value as? String else
        {
            return
        }
        self.accountNameLabel.text = "HI\n" + "\(name)"
    }
    Database.database().reference().child("Users").child(userID).child("scores").child("gold").observe(.value)
    {
        (snapshot)
        in
        guard let gold = snapshot.value
        else
        {
            return
        }
        let Gold = "\(gold)"
        self.goldLabel.text = Gold//"GOLD TOKENS\n\n" + Gold
    }
    Database.database().reference().child("Users").child(userID).child("scores").child("rewards").observe(.value)
    {
        (snapshot)
        in
        guard let rewards = snapshot.value
        else
        {
            return
        }
        let Rewards = "\(rewards)"
        self.rewardLabel.text = Rewards//"REWARD POINTS\n\n" + Rewards
    }
}


func loadPublicInfoFromDatabase()
{ 
    let ref = Database.database().reference(withPath: "*publicUserInfo")
    
    ref.child("publicInfo").child("publicInfo1").observe(.value)
    {
        (snapshot)
        in
        guard let publicInfo1 = snapshot.value
            else
        {
            return
        }
            self.publicInfoLabel.text = "\(publicInfo1)"
            
        ref.child("publicInfo").child("publicInfo2").observe(.value)
        {
            (snapshot)
            in
            guard let publicInfo2 = snapshot.value
                else
            {
                return
            }
                self.publicInfoLabel.text = "\(publicInfo2)"
        }
    }
}

让事情更复杂一点,所有这一切的主要原因是,如果他们查看 publicInfo2 而不是 publicInfo1,我只需要奖励用户(谁有帐户)。

请原谅我的代码结构✌️

4

1 回答 1

0

为了处理这个问题,他们正在使用的访客帐户需要通过完成以下步骤将其链接到经过验证的身份验证提供程序来升级:

  1. 当用户注册时,完成用户身份验证提供程序的登录流程,直至调用FIRAuth.signInWith方法之一,但不包括。例如,获取用户的 Google ID 令牌、Facebook 访问令牌或电子邮件地址和密码。
  2. 获取新身份验证提供程序的 FIRAuthCredential
let credential = EmailAuthProvider.credential(withEmail: email, password: password)
  1. 将 FIRAuthCredential 对象传递给登录用户的 linkWithCredential:completion: 方法:
   user.link(with: credential) { (authResult, error) in
  // ...
}

资料来源:iOS Auth 转换访客

于 2021-05-14T14:44:46.263 回答