Xamarin升级后出现FindAccountsForServiceAsync空引用异常求助
排查并解决FindAccountsForServiceAsync空引用异常
针对你升级Xamarin环境后新增定时器出现的System.NullReferenceException异常,我整理了几个关键排查方向和解决办法:
1. 检查AccountStore实例是否正确初始化
空引用最常见的原因就是调用方法的对象本身为null。你需要确认在定时器的StartTimers方法中,调用FindAccountsForServiceAsync的AccountStore实例是否已正确获取:
// 正确的AccountStore获取方式 var accountStore = AccountStore.Create(); if (accountStore == null) { // 这里说明获取失败,需要排查环境或权限问题 Console.WriteLine("AccountStore实例获取失败"); return; } var accounts = await accountStore.FindAccountsForServiceAsync("你的服务标识");
如果是在定时器回调中才获取AccountStore,要注意定时器线程的上下文是否支持AccountStore的创建——部分定时器(比如System.Timers.Timer)会在后台线程触发回调,而Xamarin.iOS的某些API对线程上下文有要求,建议切换到主线程执行相关操作:
// 在定时器回调中切换到主线程 Device.BeginInvokeOnMainThread(async () => { var accountStore = AccountStore.Create(); if (accountStore != null) { var accounts = await accountStore.FindAccountsForServiceAsync("你的服务标识"); // 后续逻辑 } });
2. 验证Xamarin.iOS 13.x的API兼容性
你升级到了Xamarin.iOS 13.2.0.47,这个版本对Account相关的API有一些权限和行为变更:
- 确保你的
Info.plist中已添加对应的权限描述(比如NSAccountsUsageDescription),缺少权限可能导致AccountStore无法正常初始化 - 检查
FindAccountsForServiceAsync的参数是否正确,服务标识是否和之前一致,拼写错误也可能导致内部逻辑返回null进而引发异常
3. 排查定时器的触发时机
如果StartTimers方法在应用启动早期就被调用(比如在AppDelegate.FinishedLaunching中还未完成所有初始化时),此时AccountStore依赖的系统服务可能还未就绪,导致获取实例失败。建议:
- 延迟定时器的启动时间,比如在页面加载完成后再调用
StartTimers - 添加初始化完成的标记,确保在所有依赖服务就绪后再触发定时器回调
4. 检查Mono环境的潜在问题
你当前使用的Mono 6.4.0.208存在一些已知的线程上下文相关bug,可能影响异步方法的执行。可以尝试:
- 更新Mono到对应VS2019 16.3.3支持的最新稳定版本
- 在调用异步方法前,确保
SynchronizationContext已正确设置
内容的提问来源于stack exchange,提问作者A.Goutam
相关产品推荐
相关产品推荐

