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
相关产品推荐
相关产品推荐

