注销Firebase经过身份验证的用户后写入Firestore

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注销Firebase经过身份验证的用户后写入Firestore相关的知识,希望对你有一定的参考价值。

在我的应用中,我使用一种简单的注销方法。此方法删除当前的FCM令牌,清除设备上的文档文件夹,然后注销用户。我在SceneDelegate中的身份验证侦听器对注销做出反应,并将用户带回登录/注册视图控制器。我还希望我的应用更新Firestore中的某些文档(在这种情况下,我存储在用户文档中的FCM令牌阵列)

我遇到的问题是,当我将Auth.auth()。signOut()放在完成处理程序中时,应用程序需要太多时间来做出反应,尤其是在Internet连接不良或没有连接的情况下。当我先注销用户时,Firestore写入失败,因为该用户不再通过身份验证。

我已经部分解决了云功能的问题,之后让它在Firestore中进行清理。但我想使用设备代替。

我的问题是:

a)是否有一种方法可以同时验证和启动Firestore写入并注销用户,而不必等待写入完成?

b)是否有办法以某种方式缓存此Firestore的写入内容,直到手机再次联机,即使应用程序之间已关闭?

func logoutUser() {

    InstanceID.instanceID().deleteID { error in
        if let error = error {
            os_log(.error, "%@", error.localizedDescription)
        }
    }
    do {
        try Auth.auth().signOut()

        localStorage_Methods.clearLocalFiles()

        self.deleteAllFcmTokens() {
        ///completion handler
        }

    } catch let signOutError as NSError {
        os_log(.error, "%@", signOutError)
    }
}




func deleteFcmToken(passedOnMethod: @escaping () -> () ) {

    guard let currentUserA = K.Globals.currentUser else { return }

    InstanceID.instanceID().instanceID { (result, error) in
        if let error = error {
            os_log(.error, "%@", error.localizedDescription)
        } else if let result = result {
            self.db.collection(K.FStore.collectionOf_RegisteredUsers_Name).document(currentUserA.uid)
                .updateData([
                    K.FStore.Users.fcmTokens: FieldValue.arrayRemove([result.token])
                ]) { (error) in
                    if let error = error {
                        os_log(.error, "%@", error.localizedDescription)
                    } else {
                        passedOnMethod()
                    }
            }
        }
    }
}

我的场景代表:

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?
    let fb_Auth_Methods = FB_Auth_Methods()

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        Auth.auth().addStateDidChangeListener { (auth, user) in

            if user != nil {
                self.setAndGoToRootView(withIdentifier: K.ViewItems.mainNavigationViewController)
                K.Globals.currentUser = user

            } else {
                self.setAndGoToRootView(withIdentifier: K.ViewItems.rootNavigationController)
                K.Globals.currentUser = nil
                self.fb_Auth_Methods.detachTrackLoginStatusListener()
            }
        }

        guard let _ = (scene as? UIWindowScene) else { return }
    }


func setAndGoToRootView(withIdentifier: String) {
        let storyboard = UIStoryboard(name: K.ViewItems.mainStoryboard, bundle: nil)
        var viewController: UIViewController = UIViewController()
        viewController = storyboard.instantiateViewController(withIdentifier: withIdentifier)
        self.window?.rootViewController = viewController
        self.window?.makeKeyAndVisible()

    }
答案

是否有一种方法可以同时验证和启动Firestore写入并注销用户,而不必等待写入完成?*

不幸的是调用signOut()方法后,它将使您的身份验证令牌无效。如果写操作成功完成才能使令牌无效,那么它可能会成功。否则它将失败。

是否有办法以某种方式缓存此Firestore的写入内容,直到手机再次联机,即使两次之间都已关闭该应用程序也是如此?*

Firestore默认情况下支持脱机持久性,这意味着您执行的所有写入(事务除外)都将被缓存,并在您连接到互联网后被执行。

由于Firebase admin SDK会绕过安全规则,因此通常在后端进行清理通常是更好的做法,您将能够清理移动客户端无法访问的数据。

以上是关于注销Firebase经过身份验证的用户后写入Firestore的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 数据库安全规则允许经过身份验证的用户读取和写入自己的内容

密码注册后 Firebase 云功能出现未经身份验证的错误

Firebase 权限被拒绝(读取和写入)与身份验证

Flutter Firebase - 未能正确删除经过 Google 身份验证的用户

Firebase 身份验证用户为空

Firebase Auth - 更新用户的电子邮件后,Firebase Auth 会注销用户