能否用.NET Standard共享代码开发跨安卓iOS的Firebase邮箱/密码认证?
当然可行!Firebase 邮箱/密码认证完全可以和基于 .NET Standard 的 Xamarin.Forms 项目集成,我给你梳理下完整的实现流程和代码示例,帮你快速上手。
第一步:准备 Firebase 项目配置
- 登录 Firebase 控制台,创建或选择你的项目
- 在Authentication模块中,启用「邮箱/密码」登录方式
- 下载平台配置文件:
- Android:下载
google-services.json,放到 Android 项目根目录,设置生成操作为GoogleServicesJson - iOS:下载
GoogleService-Info.plist,放到 iOS 项目根目录,设置生成操作为BundleResource
- Android:下载
第二步:安装必要的 NuGet 包
在 Android 和 iOS 项目中分别安装对应的 Firebase Auth 包:
- Android 项目:安装
Xamarin.Firebase.Auth和Xamarin.Firebase.Core - iOS 项目:安装
Xamarin.Firebase.iOS.Auth和Xamarin.Firebase.iOS.Core
第三步:创建共享的认证服务接口
在你的 .NET Standard 共享项目中,定义跨平台的认证接口,统一调用逻辑:
public interface IFirebaseAuthService { // 邮箱密码登录 Task<string> SignInWithEmailAndPassword(string email, string password); // 注册新用户 Task<string> CreateUserWithEmailAndPassword(string email, string password); // 登出 Task SignOut(); }
第四步:实现 Android 平台的认证服务
在 Android 项目中实现上述接口,通过依赖注入让共享项目调用:
[assembly: Dependency(typeof(FirebaseAuthServiceAndroid))] namespace YourAppNamespace.Droid { public class FirebaseAuthServiceAndroid : IFirebaseAuthService { public FirebaseAuthServiceAndroid() { // 初始化 Firebase FirebaseApp.InitializeApp(Android.App.Application.Context); } public async Task<string> SignInWithEmailAndPassword(string email, string password) { try { var authResult = await FirebaseAuth.Instance.SignInWithEmailAndPasswordAsync(email, password); return authResult.User.Uid; } catch (FirebaseAuthInvalidUserException) { throw new Exception("用户不存在或已被禁用"); } catch (FirebaseAuthInvalidCredentialsException) { throw new Exception("邮箱或密码错误"); } catch (Exception ex) { throw new Exception($"登录失败:{ex.Message}"); } } public async Task<string> CreateUserWithEmailAndPassword(string email, string password) { try { var authResult = await FirebaseAuth.Instance.CreateUserWithEmailAndPasswordAsync(email, password); return authResult.User.Uid; } catch (FirebaseAuthWeakPasswordException) { throw new Exception("密码强度不足,至少需要6个字符"); } catch (FirebaseAuthInvalidCredentialsException) { throw new Exception("邮箱格式无效"); } catch (FirebaseAuthUserCollisionException) { throw new Exception("该邮箱已被注册"); } catch (Exception ex) { throw new Exception($"注册失败:{ex.Message}"); } } public Task SignOut() { FirebaseAuth.Instance.SignOut(); return Task.CompletedTask; } } }
第五步:实现 iOS 平台的认证服务
在 iOS 项目中完成接口实现:
[assembly: Dependency(typeof(FirebaseAuthServiceiOS))] namespace YourAppNamespace.iOS { public class FirebaseAuthServiceiOS : IFirebaseAuthService { public FirebaseAuthServiceiOS() { // 初始化 Firebase Firebase.Core.App.Configure(); } public async Task<string> SignInWithEmailAndPassword(string email, string password) { try { var authResult = await Auth.DefaultInstance.SignInWithPasswordAsync(email, password); return authResult.User.Uid; } catch (NSErrorException ex) { HandleFirebaseError(ex.Error); return null; } } public async Task<string> CreateUserWithEmailAndPassword(string email, string password) { try { var authResult = await Auth.DefaultInstance.CreateUserAsync(email, password); return authResult.User.Uid; } catch (NSErrorException ex) { HandleFirebaseError(ex.Error); return null; } } public Task SignOut() { try { Auth.DefaultInstance.SignOut(out NSError error); if (error != null) throw new Exception(error.LocalizedDescription); return Task.CompletedTask; } catch (Exception ex) { throw new Exception($"登出失败:{ex.Message}"); } } private void HandleFirebaseError(NSError error) { switch ((AuthErrorCode)error.Code) { case AuthErrorCode.UserNotFound: throw new Exception("用户不存在或已被禁用"); case AuthErrorCode.WrongPassword: throw new Exception("邮箱或密码错误"); case AuthErrorCode.WeakPassword: throw new Exception("密码强度不足,至少需要6个字符"); case AuthErrorCode.InvalidEmail: throw new Exception("邮箱格式无效"); case AuthErrorCode.EmailAlreadyInUse: throw new Exception("该邮箱已被注册"); default: throw new Exception($"操作失败:{error.LocalizedDescription}"); } } } }
第六步:在 Xamarin.Forms 页面中调用服务
假设你已经有了包含邮箱输入框、密码输入框和登录/注册按钮的 XAML 页面,在后台代码中调用认证服务:
public partial class LoginPage : ContentPage { private readonly IFirebaseAuthService _authService; public LoginPage() { InitializeComponent(); _authService = DependencyService.Get<IFirebaseAuthService>(); } private async void LoginBtn_Clicked(object sender, EventArgs e) { string email = EmailEntry.Text?.Trim(); string password = PasswordEntry.Text?.Trim(); if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password)) { await DisplayAlert("提示", "请输入完整的邮箱和密码", "确定"); return; } try { string userId = await _authService.SignInWithEmailAndPassword(email, password); await DisplayAlert("登录成功", $"用户ID:{userId}", "确定"); // 跳转到主页 await Navigation.PushAsync(new MainPage()); } catch (Exception ex) { await DisplayAlert("登录失败", ex.Message, "确定"); } } private async void RegisterBtn_Clicked(object sender, EventArgs e) { string email = EmailEntry.Text?.Trim(); string password = PasswordEntry.Text?.Trim(); if (string.IsNullOrEmpty(email) || string.IsNullOrEmpty(password)) { await DisplayAlert("提示", "请输入完整的邮箱和密码", "确定"); return; } try { string userId = await _authService.CreateUserWithEmailAndPassword(email, password); await DisplayAlert("注册成功", $"用户ID:{userId}", "确定"); } catch (Exception ex) { await DisplayAlert("注册失败", ex.Message, "确定"); } } }
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

