我使用的是Firebase数据库,对下一种情况有点困惑。
假设我有todo应用程序。我使用标准的FirebaseAuth系统在用户设备之间进行同步。但在另一种情况下,用户可以不同步地匿名工作。
步骤1:
用户首次启动应用程序,并在items中创建了匿名用户:

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:
此匿名用户创建了几个todo项并决定注册:
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!)
     }
 })

因此,我修改了以前的代码,并更改了已创建todo项的所有者:
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.")
}

一切正常。但是,现在用户注销了。我创建了一个新的匿名用户。然后他再次登录,我合并数据。但我不能链接帐户,因为我以前就做过。而且我不能从AppDelegate数据库(my question)中删除匿名用户。我们会有僵尸!未使用的匿名帐户。如果用户登录/注销1000次,我们将获得1000个匿名帐户。

最佳答案

当您将凭证与已登录的当前用户链接时,不需要:

FIRAuth.auth()!.signIn

保留匿名用户的UID。
如果用户已经有帐户,在这种情况下,您需要:
currentUser.delete()

然后使用提供的凭据登录

关于ios - 从身份验证数据库中删除匿名用户,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41555145/

10-09 16:24
查看更多