我尝试使用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版本问题。
我还尝试清除我的bin
和obj
文件夹,重新安装相关的Nuget软件包,重新启动VS和我的电脑等,其中没有一个有帮助。
在模拟设备和真实设备之间造成这些行为差异的原因是什么?
可能无关:
有一次,我将Save
表达式包装在try
/ catch
中并返回bool
以指示保存是否成功。在模拟器中,成功保存后返回true
。在&#34;真实&#34;设备,catch
语句被触发(并应返回false
),但在返回调用代码后,返回的值不是false
,而是(null)
。由于很多原因,这是令人沮丧的(如果不可为空的bool
如何被分配一个非真/假的值?如果我不能,我怎么能自信地做任何 相信我的函数的返回类型?等等。我不知道这种行为是否与手头的问题有关,但为了完整性,我将其包含在此处。缘故。
答案 0 :(得分:0)
根据Per SushiHangover的说明,事实证明Xamarin Live 不适合实际运行应用程序,并且只应用于查看布局等任务。
使用Xamarin Live时缺少各种逻辑组件可能是上述其他奇怪行为的根本原因。
使用仿真器或USB连接到物理电话似乎都按预期工作。