Xamarin.Auth 的 AccountStore.Save 在仿真中工作,但不能在"real"设备上工作



我正在尝试使用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和PC等,这些都没有帮助。

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

可能不相关:

有一次,我将Save表达式包装在 try/catch 中,并返回一个bool来指示保存是否成功。在模拟器中,这将在成功保存后返回true。在"真实"设备上,catch语句被跳闸(并且应该返回false(,但是返回调用代码后,返回的值不是false,而是(null)。由于很多原因,这令人沮丧(如何为不可为空的bool分配真/假以外的值?如果我不能信任函数的返回类型,我该如何自信地做任何事情?等(。我不知道这种行为是否与手头的问题有关,但为了完整起见,我将其包含在这里。

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

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

使用模拟器或与物理手机的 USB 连接似乎都可以按预期工作。

相关内容

  • 没有找到相关文章

最新更新