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

Posted

技术标签:

【中文标题】如何在视图模型中实现 Firebase 电话身份验证?【英文标题】:How can firebase phone auth be implemented in view model? 【发布时间】:2021-04-10 04:42:00 【问题描述】:

我正在尝试使用 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)

【问题讨论】:

【参考方案1】:

结果证明这是对 API 20 (check out this issue on Github) 的有意更改,尽管它违反了 MVVM 架构。需要活动的原因是该方法回退到 reCAPTCHA。实现它的正确方法是“尚未确定”。

【讨论】:

你最终选择了两个“邪恶”中的哪一个,视图模型中的活动实例或直接在片段/活动中做所有事情? 不能再同意了,他们都是邪恶的。但是不,永远不要在视图模型中使用活动实例。可惜还没修好。【参考方案2】:

我的方法是在 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())

【讨论】:

以上是关于如何在视图模型中实现 Firebase 电话身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Firebase 身份验证中实现多用户帐户登录和切换?

如何在 MVVM-C RxSwift 中实现 firebase 身份验证

如何在angular4的firebase电话身份验证中重新发送短信验证?

在 Firebase 电话身份验证中未接收代码。

Firebase 电话身份验证 (Flutter) 在某些 iOS 设备中不起作用

如何通过在 swift 中实现观察者从 Firebase 实时数据库中获取嵌套数据