You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms集成Shiny Jobs在iOS端无法运行的问题排查

问题原因与解决方案

核心错误点

  1. ShinyStartup类路径不匹配:iOS项目程序集属性中指定的ShinyStartupTypeName是AppData.System.Startup,但实际Startup类的命名空间是AppData.SystemUsers,导致Shiny无法找到并加载Startup配置,ServiceProvider无法初始化。
  2. 任务注册类型错误:Startup中注册的任务类型是typeof(SyncJob),但实际任务类名为SyncJobs,类型不匹配会导致任务无法被解析。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:19:57