因此,在我的应用程序中,我刚刚创建它,以便用户可以选择删除他们的帐户,并且效果很好。但是,在删除帐户后,应用程序崩溃了。我认为这是因为它试图搜索用户,但它不在那里。
这是我的代码:
let loginController = LoginController()
func deleteAccount() {
let user = Auth.auth().currentUser
let userId = Auth.auth().currentUser?.uid
let databaseUser = Database.database().reference().child("users").child(userId!)
user?.delete { error in
if let error = error {
print(error)
} else {
self.present(self.loginController, animated: true, completion: nil)
}
}
databaseUser.removeValue(completionBlock: { (error, ref) in
if error != nil {
print(error)
} else {
self.present(self.loginController, animated: true, completion: nil)
} //Without doing this the user's account only gets deleted in the Authentication, not the whole database. I think this is the problem here?
})
}
提前非常感谢你!
答案 0 :(得分:1)
您使用!
隐含地在此行中展开可选:
let databaseUser = Database.database().reference().child("users").child(userId!)
您应首先使用nil
声明检查guard
是否为guard let userId = Auth.auth().currentUser?.uid else {
return
}
let databaseUser = Database.database().reference().child("users").child(userId)
[...]
:
nil
此外,您的代码逻辑可能有误,因为您在使用userId
之前获得了<div class="imageeditor">
<select class="form-control m-b-sm">
<option>Select Image Style</option>
<option value="image-panel">Panel</option>
<option value="image-package-panel">Package</option>
<option value="image-open-panel">Open</option>
</select>
</div>
<div class="imageeditor">
<select class="form-control m-b-sm">
<option>Select Image Style</option>
<option value="image-panel">Panel</option>
<option value="image-package-panel">Package</option>
<option value="image-open-panel">Open</option>
</select>
</div>
<div class="imageeditor">
<select class="form-control m-b-sm">
<option>Select Image Style</option>
<option value="image-panel">Panel</option>
<option value="image-package-panel">Package</option>
<option value="image-open-panel">Open</option>
</select>
</div>
。
答案 1 :(得分:1)
首先,您需要删除用户数据库,以便执行您需要的let userId = Auth.auth().currentUser?.uid
,只有在用户本身位于您的后端时才会激活,然后您继续删除auth
。
func deleteAccount() {
let user = Auth.auth().currentUser
let userId = Auth.auth().currentUser!.uid
let databaseUser = Database.database().reference().child("users").child(userId)
databaseUser.removeValue(completionBlock: { (error, ref) in
if error != nil {
print(error)
} else {
user?.delete { error in
if let error = error {
print(error)
} else {
self.present(self.loginController, animated: true, completion: nil)
}
}
})
}
如果仍然无法使用调试工具跟踪用户的生命周期....
答案 2 :(得分:0)
代码顺序并不理想,因为删除用户也会将其记录下来。因此代码可能在用户注销后尝试访问用户节点。
还要记住,Firebase是异步的,知道函数已完成的唯一方法是当闭包内的代码执行时,即在这种情况下,databaseUser.removeValue 可能在删除用户之前触发或有时它可能没有。
代码比互联网更快,因此最好利用闭包,以便您知道什么时候可以安全继续。
尝试这个序列;注意到在我们确定删除了用户节点中的数据之前,我们不会尝试删除Firebase用户。可以使用更多的错误检查,但你明白了。
let userRef = self.ref.child("users").child(uid)
userRef.setValue(nil, withCompletionBlock: { snapshot in
Auth.auth().currentUser?.delete(completion: { err in
if err != nil {
print(err?.localizedDescription)
}
})
})