我想知道如何在用户创建帐户时为其创建第二个(匿名)标识符。
这样做的原因是我让用户创建一个帐户,以便他们可以获得奖励,但我需要知道他们是否应该在再次登录他们的帐户之前获得奖励。
视图控制器中有应用程序的帐户部分,用户可以访问所有与帐户相关的数据。在同一视图控制器中还有应用程序的另一部分,任何用户都可以访问存储在该数据库中的信息,我们将其称为“公共数据库”,他们无需创建帐户即可查看。(创建账户的用户不能查看公共数据库,除非他们注销他们的账户)
用户需要在未登录的情况下调用 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,我只需要奖励用户(谁有帐户)。
请原谅我的代码结构✌️