Xamarin Auth账户存储功能实现技术咨询
Xamarin.Auth 凭据保存实现指南与关键细节
嘿,我看到你正在用Xamarin.Auth实现应用的凭据存储功能,已经搞定了NuGet安装,还在共享项目里写了基础代码,我来帮你补全并梳理下关键注意事项,避免踩坑:
首先,先把你写的代码补全并规范一下,完整的实现应该是这样的:
using Xamarin.Auth; public void SaveCredentials(string userName, string password) { // 先校验输入是否合法,避免空值存入 if (!string.IsNullOrWhiteSpace(userName) && !string.IsNullOrWhiteSpace(password)) { // 创建Account实例,用来存储用户名 Account account = new Account { Username = userName }; // 将密码添加到Properties字典中,这个字典用来存储额外的用户信息 account.Properties.Add("Password", password); // 这里要注意:共享项目中直接调用AccountStore.Create()会有平台适配问题 // 后面我会讲如何用依赖服务处理,先看完整的保存逻辑 var accountStore = AccountStore.Create(); // 保存时必须指定一个ServiceId,相当于凭据的分组标识,后续查询也要用同一个 accountStore.Save(account, "YourAppUniqueServiceId"); } }
接下来是几个必须注意的关键点,不然很容易出问题:
平台上下文的适配处理
共享项目里直接用AccountStore.Create()在Android上会报错,因为Android需要传入Context,而iOS不需要。最好用依赖服务来封装平台特定的创建逻辑:- 先定义一个接口:
public interface IAccountStoreService { AccountStore GetAccountStore(); } - Android端实现:
[assembly: Dependency(typeof(AccountStoreServiceAndroid))] namespace YourAppNamespace.Droid { public class AccountStoreServiceAndroid : IAccountStoreService { public AccountStore GetAccountStore() { // 传入Android应用的上下文 return AccountStore.Create(Android.App.Application.Context); } } } - iOS端实现:
[assembly: Dependency(typeof(AccountStoreServiceiOS))] namespace YourAppNamespace.iOS { public class AccountStoreServiceiOS : IAccountStoreService { public AccountStore GetAccountStore() { // iOS直接创建即可,不需要额外参数 return AccountStore.Create(); } } } - 共享项目中调用:
var accountStore = DependencyService.Get<IAccountStoreService>().GetAccountStore(); accountStore.Save(account, "YourAppUniqueServiceId");
- 先定义一个接口:
ServiceId的作用
这个ID是用来区分不同服务/应用的凭据的,比如你的应用叫"TodoApp",就可以用"TodoApp_UserCredentials"作为ServiceId,保存和查询的时候必须用同一个,不然找不到之前存的凭据。密码的安全性建议
虽然Xamarin.Auth会在平台层面加密存储凭据(Android用Keystore,iOS用Keychain),但还是建议不要直接存明文密码,最好先做哈希处理(比如用SHA256加盐)再存入Properties。如何读取保存的凭据
后续如果要读取用户的登录信息,可以用这段代码:public Account GetSavedUserCredentials() { var accountStore = DependencyService.Get<IAccountStoreService>().GetAccountStore(); // 查询指定ServiceId下的所有账户,这里假设一个用户对应一个账户 return accountStore.FindAccountsForService("YourAppUniqueServiceId").FirstOrDefault(); }
如果还有具体的报错或者功能需求,随时说细节哦!
内容的提问来源于stack exchange,提问作者ClueSelecter
相关产品推荐
相关产品推荐

