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

iOS端Flutter使用Workmanager模拟后台拉取访问SharedPreferences报MissingPluginException

解决方案

问题根因

你遇到的MissingPluginException是因为Workmanager触发的后台任务运行在独立的Dart Isolate中,该Isolate默认不会继承主Isolate的插件注册信息,所以SharedPreferences的原生通道实现没有被注册到后台Isolate中。另外你的AppDelegate.swift存在语法错误,嵌套了重复的AppDelegate类也会导致后台配置不生效。

Dart侧修改

调整callbackDispatcher方法的初始化逻辑,同时修正异步方法调用的等待逻辑:

void callbackDispatcher() {
  // 第一行添加,确保后台Isolate完成组件绑定和插件注册
  WidgetsFlutterBinding.ensureInitialized();
  print("callBackDispatcher");
  workmanager.executeTask((task, inputData) async {
    // 异步方法需要加await等待执行完成
    await setSwitches();
    return Future.value(true);
  });
}

iOS侧AppDelegate.swift修改

删除嵌套的冗余AppDelegate类,添加Workmanager插件注册回调,合并后台配置逻辑:

import UIKit
import Flutter
import workmanager

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    // 注册后台Isolate的插件回调
    WorkmanagerPlugin.setPluginRegistrantCallback { registry in
      GeneratedPluginRegistrant.register(with: registry)
    }
    UNUserNotificationCenter.current().delegate = self
    // 配置后台拉取间隔
    UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15))
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  override func userNotificationCenter(_ center: UNUserNotificationCenter,
    willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler(.alert)
    }
}

生效验证

  • 执行flutter clean清理项目缓存
  • 执行flutter pub get重新拉取依赖
  • 卸载测试设备上的旧安装包,重新编译运行即可

内容的提问来源于stack exchange,提问作者Kristin Vernon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:39:00