【发布时间】: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