我正在尝试用我的应用程序实现Xamairn Auth。我已经从 https://www.nuget.org/packages/Xamarin.Auth 安装了 nuget 包。
按照他们的示例,我在共享项目中有以下代码。
public void SaveCredentials (string userName, string password)
{
if (!string.IsNullOrWhiteSpace (userName) && !string.IsNullOrWhiteSpace (password)) {
Account account = new Account {
Username = userName
};
account.Properties.Add ("Password", password);
AccountStore.Create ().Save (account, App.AppName);
}
}
在 android 上运行时,它会保存用户名和密码,但我在控制台中收到以下消息:
">由于默认密码,此版本不安全。 请使用带有提供密码的版本进行帐户存储。 AccountStore.Create(Contex, string( or AccountStore.Create(string(;">
我尝试将参数传递给AccountStore.Create((方法,但它似乎不需要一个。像这样:
#if ANDROID
_accountStore = AccountStore.Create(Application.Context);
#else
_accountStore = AccountStore.Create();
#endif
我是否需要编写特定于 android 的代码来扩展创建方法。
我理解你为什么删除非答案,我认为这会对这个问题表现出兴趣。 我想我应该投票支持这个问题。 无论如何,这是我找到的答案。
您不能将 PCL 版本用于安卓。 它没有添加密码的选项。 我使用了安卓特定版本。 将使用依赖项服务调用它。
下面是一个示例:
Account account = null;
try
{
//account = AccountStore.Create(Application.ApplicationContext, "System.Char[]").FindAccountsForService("My APP").FirstOrDefault();
var aStore = AccountStore.Create(Application.ApplicationContext, "myownpassword");
// save test
account = aStore.FindAccountsForService(Constants.AppName).FirstOrDefault();
if (account == null)
account = new Account();
account.Username = "bobbafett";
account.Properties["pswd"] = "haha";
aStore.Save(account, Constants.AppName);
// delete test, doesn't seem to work, account is still found
var accts = aStore.FindAccountsForService(Constants.AppName);
int howMany = accts.ToList().Count;
foreach (var acct in accts)
{
aStore.Delete(acct, Constants.AppName);
}
account = aStore.FindAccountsForService(Constants.AppName).FirstOrDefault();
}
catch (Java.IO.IOException ex)
{
// This part is not invoked anymore once I use the suggested password.
int i1 = 123;
}
我能够通过在 android 中实现一个 getAccountStore 方法来让它工作,该方法可以选择添加密码,然后使用 DependencyService 来调用它。
public AccountStore GetAccountStore()
{
try
{
var acctStore = AccountStore.Create(Application.Context, "somePassword");
return acctStore;
}
catch (Java.IO.IOException ex)
{
throw ex;
}
}
然后在您的 pcl 项目中这样调用它:
if (Device.RuntimePlatform == Device.Android)
_accountStore = DependencyService.Get<IAccountStoreHelper>().GetAccountStore();
else
_accountStore = AccountStore.Create();