Xamarin.Forms集成Shiny Jobs在iOS端无法运行的问题排查
问题原因与解决方案
核心错误点
- ShinyStartup类路径不匹配:iOS项目程序集属性中指定的
ShinyStartupTypeName是AppData.System.Startup,但实际Startup类的命名空间是AppData.SystemUsers,导致Shiny无法找到并加载Startup配置,ServiceProvider无法初始化。 - 任务注册类型错误:Startup中注册的任务类型是
typeof(SyncJob),但实际任务类名为SyncJobs,类型不匹配会导致任务无法被解析。 - iOS AppDelegate基类不正确:未使用Shiny提供的
FormsAppDelegate基类,导致Shiny的初始化流程未被正确触发。
分步解决
1. 修正ShinyStartup类路径
修改iOS项目中的程序集属性,将ShinyStartupTypeName改为正确的类路径:
[assembly: Shiny.ShinyApplication( ShinyStartupTypeName = "AppData.SystemUsers.Startup", XamarinFormsAppTypeName = "AppData.System.App" )]
2. 修正任务注册类型
在Xamarin.Forms项目的Startup类中,将任务类型改为正确的SyncJobs:
services.RegisterJob(new JobInfo(typeof(SyncJobs), "SyncJobs") { Repeat = true, BatteryNotLow = false, DeviceCharging = false, RunOnForeground = true, RequiredInternetAccess = InternetAccess.Any });
3. 修改iOS AppDelegate基类
将AppDelegate的基类替换为Shiny.FormsAppDelegate,确保Shiny接管初始化流程:
[Register("AppDelegate")] public partial class AppDelegate : Shiny.FormsAppDelegate { public override bool FinishedLaunching(UIApplication app, NSDictionary options) { try { global::Xamarin.Forms.Forms.Init(); LoadApplication(new App()); } catch (System.Exception ex) { Console.WriteLine(ex.StackTrace); } return base.FinishedLaunching(app, options); } public override void PerformFetch(UIApplication application, Action<UIBackgroundFetchResult> completionHandler) { ShinyHost.Resolve<IJobManager>() .RunAll() .ContinueWith(task => { if (task.IsCompletedSuccessfully) completionHandler(UIBackgroundFetchResult.NewData); else completionHandler(UIBackgroundFetchResult.Failed); }); } }
4. 确认任务触发时机
确保在App.xaml.cs的OnStart方法中触发任务,而非构造函数,保证Shiny已完成初始化:
protected override void OnStart() { Shiny.ShinyHost.Resolve<Shiny.Jobs.IJobManager>().Run("SyncJobs"); }
完成以上修改后,重新编译iOS项目并在真机上测试,ServiceProvider初始化失败的问题应该会解决,定时任务也能正常执行。
内容的提问来源于stack exchange,提问作者Tiago
相关产品推荐
相关产品推荐

