Ios 合并匿名帐户时客户端登录错误的Firebase身份验证行为

Ios 合并匿名帐户时客户端登录错误的Firebase身份验证行为,ios,swift,firebase,firebase-authentication,firebaseui,Ios,Swift,Firebase,Firebase Authentication,Firebaseui,我们使用Firebase身份验证在用户启动第一个会话时匿名验证用户。稍后,他们可能会选择登录到非匿名提供商。我们使用FirebaseUI库来帮助实现这一点。FirebaseUI库有一个自动匿名升级功能(),我们使用它来简化这一过程 文档概述了我们必须处理的几个边缘案例,包括用户登录到现有帐户的帐户合并场景。发生这种情况时,我们希望将与匿名帐户关联的用户数据(在Firestore中)迁移到现有帐户,并最终登录到现有帐户。最后一步将自动且不可避免地丢弃客户端上的匿名帐户,因此我们无法恢复到该帐户 从

我们使用Firebase身份验证在用户启动第一个会话时匿名验证用户。稍后,他们可能会选择登录到非匿名提供商。我们使用FirebaseUI库来帮助实现这一点。FirebaseUI库有一个自动匿名升级功能(),我们使用它来简化这一过程

文档概述了我们必须处理的几个边缘案例,包括用户登录到现有帐户的帐户合并场景。发生这种情况时,我们希望将与匿名帐户关联的用户数据(在Firestore中)迁移到现有帐户,并最终登录到现有帐户。最后一步将自动且不可避免地丢弃客户端上的匿名帐户,因此我们无法恢复到该帐户

从逻辑上讲,这个合并过程并不复杂。唯一棘手的部分是使这个过程尽可能具有弹性/原子性,这样用户就不会陷入某种“不确定”状态

失败有两点。第一个是迁移用户数据时,第二个是登录到现有帐户时。我们实现原子性的想法是在用户登录到现有帐户之前开始迁移,将数据缓存在可以恢复的事务中,然后在登录成功后“提交”迁移。这样,如果数据迁移失败,以及登录失败,我们应该能够中止合并

我的问题是:如果
Auth.Auth().sign
返回错误,是否保证匿名帐户未被丢弃?
换句话说:如果登录失败,我们是否可以继续使用当前匿名用户,或者Auth SDK是否在尝试登录时丢弃了匿名用户

下面是FirebaseUI iOS/Swift委托函数框架,我在其中指出了迁移事件。我们也愿意接受超出主要问题范围的建议。我们知道我们不是第一个实现这一想法的人,但文档/示例并没有深入到这一步

func authUI(_ authUI: FUIAuth, didSignInWith authDataResult: AuthDataResult?, error: Error?) {
    if let error = error as NSError?, error.code == FUIAuthErrorCode.mergeConflict.rawValue {
        // Merge conflict error, discard the anonymous user and login as the existing non-anonymous user.
        guard let credential = error.userInfo[FUIAuthCredentialKey] as? AuthCredential else {
            print("Received merge conflict error without auth credential!")
            return
        }

        // Start migration process

        Auth.auth().signIn(with: credential) { (dataResult, error) in
            if let error = error as NSError? {
                print("Failed to re-login: \(error)")

                // Cancel migration process

                // WE NEED TO REVERT TO THE ANONYMOUS USER!

                return
            }

            // Finalize migration process
        }
    }
    else if let error = error {
        // Some non-merge conflict error happened.
        print("Failed to log in: \(error)")
        return
    }
    // Handle successful login
}