Xamarin Firebase PhoneAuth for Xamarin Forms



我需要创建一个具有Firebase Phone Auth的Xamarin Forms应用程序。有一个用于 Xamarin Firebase 身份验证的软件包,其中包含电话身份验证,但没有 Xamarin Forms 的文档。

到目前为止,对于Android,我有:

public class FirebaseAuthenticator : IFirebaseAuthenticator
{
public async Task<string> RegisterWithPhoneNumber(string number)
{
PhoneAuthCallbacks phoneAuthCallbacks = new PhoneAuthCallbacks();
var user = await PhoneAuthProvider.Instance.VerifyPhoneNumber(number, 60, TimeUnit.Seconds, this, phoneAuthCallbacks);
return user;
}
}

我的电话身份验证回调类:

public class PhoneAuthCallbacks : PhoneAuthProvider.OnVerificationStateChangedCallbacks
{
public override void OnVerificationCompleted(PhoneAuthCredential credential)
{
// This callback will be invoked in two situations:
// 1 - Instant verification. In some cases the phone number can be instantly
//     verified without needing to send or enter a verification code.
// 2 - Auto-retrieval. On some devices Google Play services can automatically
//     detect the incoming verification SMS and perform verification without
//     user action.        
FirebaseAuth.Instance.SignInWithCredential(credential);
System.Diagnostics.Debug.WriteLine("onVerificationCompleted");
}
public override void OnVerificationFailed(FirebaseException exception)
{
// This callback is invoked in an invalid request for verification is made,
// for instance if the the phone number format is not valid.
System.Diagnostics.Debug.WriteLine("onVerificationFailed: " + exception);
}
public override void OnCodeSent(string verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken)
{
// The SMS verification code has been sent to the provided phone number, we
// now need to ask the user to enter the code and then construct a credential
// by combining the code with a verification ID.
base.OnCodeSent(verificationId, forceResendingToken);
System.Diagnostics.Debug.WriteLine("onCodeSent" + verificationId);
}
}

但它不起作用。在 RegisterWithPhoneNumber 中,"this"给出错误"无法从 xx.Droid.FirebaseAuthenticator 转换为 Android.App.Activity">

由于您的 FirebaseAuthenticator 不是活动固有的,因此您无法在调用函数中使用它。可以将主活动保存为静态变量,并在依赖项服务中使用。添加了下面的代码

public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
internal static Activity CurrentActivityRef { get; private set; }
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
var fapp = FirebaseApp.InitializeApp(this);
LoadApplication(new App());
CurrentActivityRef = this;
}

}

以及在依赖项服务实现中

public class FirebaseAuthenticator: IFirebaseAuthenticator
{
public void RegisterOrLoginWithMobileNumber(string MobileNumber)
{
Activity activity = MainActivity.CurrentActivityRef;
PhoneAuthCredentialCallBack callBack = new PhoneAuthCredentialCallBack();
PhoneAuthProvider.Instance.VerifyPhoneNumber(MobileNumber,
60,
TimeUnit.Seconds,
activity, callBack
);
}
}

为了补充上一个答案,如果你使用的是Xamarin Essentials,你可以使用Platform.CurrentActivity来获取MainActivity的实例。

最新更新