firebase auth / swift - 匿名用户不能在applicationWillTerminate上删除?

时间:2018-04-03 14:32:28

标签: ios swift firebase firebase-authentication

因此,在我的第一个加载屏幕上,我让用户匿名登录 - 因此他们有权访问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

为什么它永远不会打印完成块?

2 个答案:

答案 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 AnonymouslyDelete a User文档,没有提及删除匿名帐户。我认为这是因为签署它们与删除真实账户是一回事。 这可能是为什么调用Auth.auth().currentUser?.delete似乎对匿名用户无效。

更新

OP确认您可以删除匿名用户。放在applicationDidEnterBackground内的上述代码会删除该帐户。所以问题是当代码放在applicationWillTerminate内时,为什么不出现print语句。

查看applicationWillTerminate

  

您执行此方法大约需要五秒钟才能执行任何任务并返回。如果方法在时间到期之前没有返回,系统可能会完全终止该进程。

这可能是您没有看到回调print语句的原因。应用程序在返回完成之前终止。我不是100%确定匿名登录的工作方式,但应该有其他方法来验证帐户是否已删除。

申请终止后,您是否必须再次登录?如果您这样做,则删除令牌。

此外,the app life cycle documentation states

  

应用程序必须随时准备终止,并且不应等待保存用户数据或执行其他关键任务。系统启动的终止是应用程序生命周期的正常部分。系统通常会终止应用程序,以便它可以回收内存并为用户启动的其他应用程序腾出空间,但系统也可能会终止行为不当或未及时响应事件的应用程序。

     

暂停的应用在终止时不会收到通知;系统终止进程并回收相应的内存。如果某个应用当前正在后台运行且未暂停,则系统会在终止之前调用其应用委托的applicationWillTerminate :.当设备重新启动时,系统不会调用此方法。

     

除了终止您的应用程序的系统之外,用户还可以使用多任务UI显式终止您的应用程序。用户启动的终止与终止暂停的应用程序具有相同的效果。应用程序的进程被终止,并且没有通知应用程序。

由于暂停的应用未收到applicationWillTerminate通知,您可能需要重新考虑自己的工作方式。