Xamarin.Auth 的 AccountStore.Save 在仿真中有效,但在 "real" 设备上无效

Xamarin.Auth's AccountStore.Save works in emulation, but not on a "real" device

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

保存凭据如下所示:

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

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

异常信息:

Constructor on type 'Java.Security.KeyStore+SecretKeyEntry' not found.

堆栈跟踪:

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 设备上测试过,结果都一样。模拟器是 运行ning Android 7.1,phones 运行 6.* 和 7.1,所以这看起来不像是 Android版本问题。

我也试过清理我的 binobj 文件夹,重新安装相关的 Nuget 包,重新启动 VS 和我的电脑等,none 有帮助.

是什么导致了模拟设备和真实设备之间的这些行为差异?

可能无关:

有一次,我将 Save 表达式包装在 try/catch 中,并 return 编辑了一个 bool 以指示保存是否已成功了。在模拟器中,这个returns true保存成功后。在 "real" 设备上,catch 语句被触发(并且应该 return false),但是在 returning 到调用代码之后,returned 值不是 false,而是 (null)。这令人沮丧,原因有很多(不可为 null 的 bool 是如何分配一个 true/false 以外的值的?如果我可以自信地做 anything不能相信我函数的 return 类型?等等)。我不知道这种行为是否与手头的问题有关,但为了完整起见,我将其包含在这里。

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

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

使用模拟器或 USB 连接到物理 phone 两者似乎都能按预期工作。