在创建Auth uid Firebase的同时为用户创建和使用匿名ID



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

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

在视图控制器中有一个应用程序的帐户部分,用户可以在其中访问所有与帐户相关的数据。在同一个视图控制器中,应用程序的另一个部分,任何用户都可以访问存储在该数据库中的信息,让我们称之为"公共数据库",他们可以在不创建帐户的情况下查看该数据库。(创建帐户的用户不能查看公共数据库,除非他们注销帐户(

用户需要在没有登录的情况下调用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 = "HIn" + "(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 TOKENSnn" + 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 POINTSnn" + 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的用户(拥有帐户的用户(。

请原谅我的代码的结构✌️

要处理此问题,需要通过完成以下步骤将他们使用的Guest帐户链接到经过验证的身份验证提供程序来升级:

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

来源:iOS Auth转换访客

最新更新