代码之家  ›  专栏  ›  技术社区  ›  plplmax

Firebase Auth+像素移动网络+暂停协同程序=漏洞?

  •  0
  • plplmax  · 技术社区  · 3 年前

    例如,在三星(Android 11)、华为(Android 10)上,除了至少谷歌Pixel 2(Android 11)、谷歌Pixel 5(Android 11)之外,一切都运转良好。 这些设备上的Wi-Fi也没有问题。

    有一个注册屏幕。用户输入数据并点击“注册”按钮。

    在用户执行以下操作之前,一切正常:

    1. Enable the mobile network -> Click on the "sign up" button -> For example, the message "email is already in use" -> Disable the mobile network -> 点击“注册”按钮 -> The suspended coroutine never continues (预计会出现FirebaseNetwork异常)

    然而,它是有效的:

    1. 启用移动网络 -> 禁用移动网络 -> 点击“注册”按钮 -> 例如,邮件“电子邮件已在使用” (一切都很好,因为暂停的合作项目已经醒来)

    要旨 :Firebase不会引发FirebaseNetwork或任何异常,因此,当用户在启用移动网络的情况下提交表单,然后在关闭移动网络的情况下提交表单时,用户界面会“冻结”(在处理请求时,我会禁用表单)。

    private suspend fun handleResult(task: Task<AuthResult>) =
                    suspendCoroutine<AuthResult> { continuation ->
                        task.addOnSuccessListener { continuation.resume(it) }
                            .addOnFailureListener { continuation.resumeWithException(it) }
    
                    }
    

    我用计算机解决了这个问题 this 代码现在看起来像:

    private suspend fun handleResult(task: Task<AuthResult>) =
                withTimeout(5000L) {
                    suspendCancellableCoroutine<AuthResult> { continuation ->
                        task.addOnSuccessListener { continuation.resume(it) }
                            .addOnFailureListener { continuation.resumeWithException(it); }
                    }
                }
    

    我是否需要将SuspendCancelableCorroutine与timeout一起使用,而不是将SuspendCorroutine始终与Firebase一起使用,以避免在其他设备上出现这些错误?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Tenfour04    3 年前

    我不知道这是否是原因,但可能会有所帮助。现在已经有了一个suspend函数,可以在不需要实现的情况下处理Google任务 suspendCancellableCoroutine 你自己它们的实现比你的(大约30行代码)要彻底得多,可能会处理一些你没有的边缘情况。当你调用它时,任务已经完成时,它还会优化结果,并正确地处理取消,而你没有。

    功能是 Task.await() 。如果您不可用,请在生成中添加此依赖项。格雷德尔:

    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.6.0"
    
        2
  •  0
  •   plplmax    3 年前

    这个问题通过组合wait()解决了, @Tenfour04 )+withTimeout()。Firebase似乎没有网络身份验证呼叫的超时时间。

    建筑gradle获得挂起等待()(将“x.x.x”替换为最新版本):

    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:x.x.x'
    

    例如:

    private val firebaseAuth: FirebaseAuth
    
    suspend fun create(userInitial: UserInitial): AuthResult = withTimeout(5000L) {
                firebaseAuth.createUserWithEmailAndPassword(
                    userInitial.email,
                    userInitial.password
                )
                    .await()
            }
    

    withTimeout()在超过超时时抛出TimeoutCancellationException