【问题标题】:Writing to Firestore after logging out the Firebase authenticated user注销经过 Firebase 身份验证的用户后写入 Firestore
【发布时间】:2020-05-13 19:34:54
【问题描述】:

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

我遇到的问题是,当我将 Auth.auth().signOut() 放入完成处理程序时,应用程序需要花费太多时间做出反应,尤其是在互联网连接不良或没有互联网连接的情况下。当我先注销用户时,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()

    }

【问题讨论】:

    标签: ios swift firebase google-cloud-firestore firebase-authentication


    【解决方案1】:

    有没有办法同时验证和启动 Firestore 写入并注销用户,而不必等待写入完成?*

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

    有没有办法以某种方式缓存此 Firestore 写入,直到手机再次在线,即使应用程序已在其间关闭?*

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-21
      • 2021-05-24
      • 1970-01-01
      • 2014-10-31
      • 2017-11-15
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多