Xamarin.Auth的AccountStore.Save适用于仿真,但不适用于"真正的"设备

时间:2018-04-30 19:31:28

标签: android xamarin xamarin.auth

我尝试使用Xamarin.AccountStore来保留用户的登录凭据,这样他们就不必在每次使用该应用时都输入它们。

保存凭据如下所示:

Account account = new Account(...);
AccountStore store = AccountStore.Create();
store.Save(account, appName);

从VS模拟应用程序时,这完全符合我的预期。当通过Xamarin Live在实际手机上运行时,Save方法会在Android库中抛出一个看似缺失方法的异常。

异常消息:

  

类型' Java.Security.KeyStore + SecretKeyEntry'上的构造函数没找到。

堆栈追踪:

at System.RuntimeType.CreateInstanceImpl (System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, System.Object[] args, System.Globalization.CultureInfo culture, System.Object[] activationAttributes, System.Threading.StackCrawlMark& stackMark) [0x00213] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Activator.CreateInstance (System.Type type, System.Reflection.BindingFlags bindingAttr, System.Reflection.Binder binder, System.Object[] args, System.Globalization.CultureInfo culture, System.Object[] activationAttributes) [0x000ba] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at System.Activator.CreateInstance (System.Type type, System.Object[] args) [0x00000] in <896ad1d315ca4ba7b117efb8dacaedcf>:0 
at NInterpret.Interpreter.newobj (System.Collections.Generic.Dictionary`2[TKey,TValue] gargs, Mono.Cecil.MethodReference m, System.Object[] createInstanceArgs) [0x00305] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.interpretBlock (System.Object[] args, System.Object[] locals, Mono.Cecil.Cil.Instruction initialInstruction, Microsoft.FSharp.Collections.FSharpSet`1[T] inTries, Microsoft.FSharp.Core.FSharpOption`1[T] lastException) [0x03d5b] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.interpret (System.Object[] args) [0x00099] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.callAMethod (NInterpret.AMethod m, NInterpret.AType[] ptypes, NInterpret.AType[] genericMethodArgs, System.Collections.Generic.Dictionary`2[TKey,TValue] genericArgsIndex, System.Object[] args, System.Collections.Generic.List`1[T] byRefArgs, Microsoft.FSharp.Core.FSharpOption`1[T] byRefTarget, System.Object target, System.Boolean virtualCall) [0x00184] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.callMethodReference (System.Collections.Generic.Dictionary`2[TKey,TValue] gargs, Mono.Cecil.MethodReference ms, System.Boolean virtualCall) [0x00384] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.interpretBlock (System.Object[] args, System.Object[] locals, Mono.Cecil.Cil.Instruction initialInstruction, Microsoft.FSharp.Collections.FSharpSet`1[T] inTries, Microsoft.FSharp.Core.FSharpOption`1[T] lastException) [0x03c6e] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.interpret (System.Object[] args) [0x00099] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.callAMethod (NInterpret.AMethod m, NInterpret.AType[] ptypes, NInterpret.AType[] genericMethodArgs, System.Collections.Generic.Dictionary`2[TKey,TValue] genericArgsIndex, System.Object[] args, System.Collections.Generic.List`1[T] byRefArgs, Microsoft.FSharp.Core.FSharpOption`1[T] byRefTarget, System.Object target, System.Boolean virtualCall) [0x00184] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.callMethodReference (System.Collections.Generic.Dictionary`2[TKey,TValue] gargs, Mono.Cecil.MethodReference ms, System.Boolean virtualCall) [0x00384] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.interpretBlock (System.Object[] args, System.Object[] locals, Mono.Cecil.Cil.Instruction initialInstruction, Microsoft.FSharp.Collections.FSharpSet`1[T] inTries, Microsoft.FSharp.Core.FSharpOption`1[T] lastException) [0x03c6e] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0 
at NInterpret.Interpreter.interpretBlock (System.Object[] args, System.Object[] locals, Mono.Cecil.Cil.Instruction initialInstruction, Microsoft.FSharp.Collections.FSharpSet`1[T] inTries, Microsoft.FSharp.Core.FSharpOption`1[T] lastException) [0x0013c] in <5a7d38ec7eef0f2aa7450383ec387d5a>:0

我已在多台Android设备上对此进行了测试,结果相同。模拟器运行的是Android 7.1,手机运行的是6. *和7.1,所以看起来这不是Android版本问题。

我还尝试清除我的binobj文件夹,重新安装相关的Nuget软件包,重新启动VS和我的电脑等,其中没有一个有帮助。

在模拟设备和真实设备之间造成这些行为差异的原因是什么?

可能无关:

有一次,我将Save表达式包装在try / catch中并返回bool以指示保存是否成功。在模拟器中,成功保存后返回true。在&#34;真实&#34;设备,catch语句被触发(并应返回false),但在返回调用代码后,返回的值不是false,而是(null)。由于很多原因,这是令人沮丧的(如果不可为空的bool如何被分配一个非真/假的值?如果我不能,我怎么能自信地做任何 相信我的函数的返回类型?等等。我不知道这种行为是否与手头的问题有关,但为了完整性,我将其包含在此处。缘故。

1 个答案:

答案 0 :(得分:0)

根据Per SushiHangover的说明,事实证明Xamarin Live 不适合实际运行应用程序,并且只应用于查看布局等任务。

使用Xamarin Live时缺少各种逻辑组件可能是上述其他奇怪行为的根本原因。

使用仿真器或USB连接到物理电话似乎都按预期工作。