我正在尝试使用 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)
事实证明这是 API 20 中的有意更改(在 Github 上查看此问题),尽管它违反了 MVVM 架构。需要活动的原因是该方法回退到 reCAPTCHA。正确的实现方式“尚未确定”。
我的方法是将所有内容都包含在 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())
此线程已解决,但对于可能偶然发现同一问题的任何人,这里有一个更新:
自 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 错误情况,如文档中所示。