因此,在我的第一个加载屏幕上,我让用户匿名登录 - 因此他们有权访问Firebase数据库。这是代码:
Auth.auth().signInAnonymously { (user, error) in
if error != nil {
print(error!.localizedDescription)
SVProgressHUD.showError(withStatus: AlertMessages.authError)
} else {
print("successfully signed in anon")
}
}
每次运行时都会打印出 successfully signed in anon
,这就是应该发生的事情。但是在我的applicationWillTerminate
中,我尝试删除这个匿名用户,因此不会有任何悬空用户,但它不起作用。这是代码:
func applicationWillTerminate(_ application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
print("will terminate")
if Auth.auth().currentUser != nil {
print("user exists")
if (Auth.auth().currentUser?.isAnonymous)! {
print("delete anonymous user")
Auth.auth().currentUser?.delete(completion: { (error) in
if error != nil {
print(error!.localizedDescription)
try! Auth.auth().signOut()
} else {
print("delete success")
}
})
}
}
}
打印出来:
will terminate
user exists
delete anonymous user
为什么它永远不会打印完成块?
答案 0 :(得分:0)
很奇怪。乍一看,你似乎正在做正确的事。
尝试这种方法:
let user = Auth.auth().currentUser
user?.reauthenticate(with:credential) { error in
if let error = error {
showAlertWithErrorMessage(message: error.localizedDescription)
} else {
user?.delete { error in
if let error = error {
showAlertWithErrorMessage(message: error.localizedDescription)
} else {
let userID = HelperFunction.helper.FetchFromUserDefault(name: kUID)
Database.database().reference(fromURL: kFirebaseLink).child(kUser).child(userID).removeValue()
try! Auth.auth().signOut()
showAlertWithErrorMessage(message: "Your account deleted successfully...")
return
}
}
}
}
答案 1 :(得分:0)
看起来这是一个问题。我的第一个问题是你为什么要删除用户?
查看this answer,您会看到,如果Firebase忘记了匿名用户的身份验证令牌,则会将其帐户删除/过期。这意味着从帐户中签名匿名用户将删除该用户。如果同一用户再次匿名登录,则会向他们提供新令牌。
documentation还声明:
为了保护您的项目免遭滥用,Firebase会在短时间内限制您的应用可以从同一IP地址获得的新电子邮件/密码和匿名注册的数量。您可以从Firebase控制台
请求并安排对此配额的临时更改
如果您尝试删除帐户以及与这些帐户相关联的数据,请查看此repo。
查看Authenticate with Firebase Anonymously和Delete a User文档,没有提及删除匿名帐户。我认为这是因为签署它们与删除真实账户是一回事。 这可能是为什么调用 Auth.auth().currentUser?.delete
似乎对匿名用户无效。
更新
OP确认您可以删除匿名用户。放在applicationDidEnterBackground内的上述代码会删除该帐户。所以问题是当代码放在applicationWillTerminate
内时,为什么不出现print语句。
您执行此方法大约需要五秒钟才能执行任何任务并返回。如果方法在时间到期之前没有返回,系统可能会完全终止该进程。
这可能是您没有看到回调print语句的原因。应用程序在返回完成之前终止。我不是100%确定匿名登录的工作方式,但应该有其他方法来验证帐户是否已删除。
申请终止后,您是否必须再次登录?如果您这样做,则删除令牌。
此外,the app life cycle documentation states:
应用程序必须随时准备终止,并且不应等待保存用户数据或执行其他关键任务。系统启动的终止是应用程序生命周期的正常部分。系统通常会终止应用程序,以便它可以回收内存并为用户启动的其他应用程序腾出空间,但系统也可能会终止行为不当或未及时响应事件的应用程序。
暂停的应用在终止时不会收到通知;系统终止进程并回收相应的内存。如果某个应用当前正在后台运行且未暂停,则系统会在终止之前调用其应用委托的applicationWillTerminate :.当设备重新启动时,系统不会调用此方法。
除了终止您的应用程序的系统之外,用户还可以使用多任务UI显式终止您的应用程序。用户启动的终止与终止暂停的应用程序具有相同的效果。应用程序的进程被终止,并且没有通知应用程序。
由于暂停的应用未收到applicationWillTerminate
通知,您可能需要重新考虑自己的工作方式。