如何在视图模型中实现Firebase电话身份验证?

问题描述 投票:0回答:3

我正在尝试使用 Kotlin 在视图模型中添加 Firebase 电话身份验证代码。问题是

PhoneAuthProvider
需要一个活动。有谁知道如何在视图模型中实现此代码而不需要活动?

谢谢!

val mCallbacks: PhoneAuthProvider.OnVerificationStateChangedCallbacks ...

val options = PhoneAuthOptions.newBuilder(auth).apply {
  setPhoneNumber(phoneNumber)
  setTimeout(120L, TimeUnit.SECONDS)
  setActivity(this) <-------------------------- // Activity (for callback binding)
  setCallbacks(mCallbacks)
}.build()
PhoneAuthProvider.verifyPhoneNumber(options)
firebase kotlin mvvm firebase-authentication android-mvvm
3个回答
3
投票

事实证明这是 API 20 中的有意更改(在 Github 上查看此问题),尽管它违反了 MVVM 架构。需要活动的原因是该方法回退到 reCAPTCHA。正确的实现方式“尚未确定”。


1
投票

我的方法是将所有内容都包含在 viewModel 中,包括回调。然后,我调用 viewModel 中的函数并传入活动参数。见下文:

fun verifyPhoneNumber(phoneNumber: String, activity: Activity) {
        _validFullPhoneNumber.value = phoneNumber
        val options = PhoneAuthOptions.newBuilder(mAuth)
            .setPhoneNumber(phoneNumber)       // Phone number to verify
            .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
            .setActivity(activity)
            .setCallbacks(callbacks)          // OnVerificationStateChangedCallbacks
            .build()
        PhoneAuthProvider.verifyPhoneNumber(options)
    }

在 UI 控制器中,在我的例子中,我将其称为片段:

viewModel.verifyPhoneNumber(validatedPhoneNumber, requireActivity())

与重发按钮功能相同。

视图模型:

fun resendVerificationCode(activity: Activity) {
        val options =
            PhoneAuthOptions.newBuilder(mAuth)
                .setPhoneNumber(_validFullPhoneNumber.value!!) // Phone number to verify
                .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
                .setActivity(activity)
                .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
                .setForceResendingToken(_resendToken) // ForceResendingToken from callbacks
                .build()

        PhoneAuthProvider.verifyPhoneNumber(options)
        _isVerificationCodeExpired.value = false
    }

UI控制器(片段):

 viewModel.resendVerificationCode(requireActivity())

0
投票

此线程已解决,但对于可能偶然发现同一问题的任何人,这里有一个更新:

自 2023 年 3 月 28 日起,在 Firebase Android BoM 版本

31.4.0
发行说明)中,
PhoneAuthOptions.Builder
现在接受 null Activity,但如果应用程序验证回退到 reCAPTCHA,它将抛出
FirebaseAuthMissingActivityForRecaptchaException
。如果 Play 完整性不可用或应用程序未通过 Play 完整性检查,则可能会发生这种情况。因此,您现在可以按照 Firebase 文档 的建议进行操作,而无需调用
.setActivity(this)
,如下所示:

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

只需确保在 onVerificationFailed 回调中处理可能的 FirebaseAuthMissingActivityForRecaptchaException 错误情况,如文档中所示。

© www.soinside.com 2019 - 2024. All rights reserved.