我使用的是 Firebase 数据库,并且对下一个情况感到困惑。
让我们想象我有todo应用程序。我在用户设备之间使用标准Firebase Auth
系统进行同步items
。但在其他情况下,用户可以匿名工作而不进行同步。
第1步:
第一次用户启动应用,并在AppDelegate
我创建了匿名用户:
FIRAuth.auth()?.addStateDidChangeListener { auth, user in
if let _user = user {
if _user.isAnonymous {
print("User logged in as anonymous. Saving uid to user defaults storage.")
UserDefaults.standard.setValue(_user.uid, forKey: "uid")
} else {
print("User logged in with email: \(_user.email)")
}
} else {
FIRAuth.auth()?.signInAnonymously() { (user, error) in
if let _error = error {
print("Anonymous signIn error: \(_error)")
}
}
}
}
第2步:
这位匿名用户创建了几个待办事项并决定了signUp:
let credential = FIREmailPasswordAuthProvider.credential(withEmail: emailField.text!, password: passwordField.text!)
FIRAuth.auth()?.currentUser?.link(with: credential, completion: { user, error in
if error == nil {
FIRAuth.auth()!.signIn(withEmail: emailField.text!,
password: passwordField.text!)
}
})
所以我修改了以前的代码并更改了创建的待办事项的所有者:
if let prevUserUID = UserDefaults.standard.string(forKey: "uid"), prevUserUID != _user.uid {
FIRDatabase.database().reference().child("todo-items").queryOrdered(byChild: "user").queryEqual(toValue: prevUserUID).observe(.value, with: { snapshot in
for item in snapshot.children {
var todoItem = TodoItem(snapshot: item as! FIRDataSnapshot)
todoItem.user = _user.uid
todoItem.ref?.setValue(todoItem.toAnyObject())
}
})
print("Data migrated.")
}
好的一切正常。但是,现在用户退出了。我创建了一个新的匿名用户。然后他再次登录,我合并数据。但我无法联系帐户,因为我之前已经这样做了。我无法从Auth
数据库(my question)中删除匿名用户。我们得到僵尸!未使用的匿名帐户。如果用户将登录/注销1000次,我们将获得1000个匿名帐户。
答案 0 :(得分:1)
当您将凭据与当前已记录的当前用户链接时,不需要:
FIRAuth.auth()!.signIn
保留匿名用户的UID。
如果用户已拥有帐户,则需要:
currentUser.delete()
然后使用提供的凭据登录