iOS flutter Доступ к общим настройкам при имитации фоновой выборки в workmanager: MissingPluginException

У меня есть проект, который требует от меня доступа к общим настройкам в фоновом режиме, чтобы определить, какие уведомления необходимо установить. При использовании этого я получаю эту ошибку при имитации фоновой выборки:

2021-11-12 10:15:33.351668-0600 Бегун [88454:1012638] [VERBOSE-2:ui_dart_state.cc(209)] Необработанное исключение: MissingPluginException(Реализация для метода getAll в плагинах канала не найдена. Flutter.io/shared_preferences)

main.dart

      import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:workmanager/workmanager.dart' as w;

w.Workmanager workmanager = w.Workmanager();

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await workmanager.initialize(callbackDispatcher, isInDebugMode: true);
  runApp(const MyApp());
  //setSwitches();
}

void setSwitches() async {
  WidgetsFlutterBinding.ensureInitialized();
  SharedPreferences myPrefs = await SharedPreferences.getInstance();
  myPrefs.setString('key', 'value');
  print("setSwitch func");
}

void callbackDispatcher() {
  print("callBackDispatcher");
  workmanager.executeTask((task, inputData) async {
    setSwitches();

    return Future.value(true);
  });
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    
    return Scaffold(
      appBar: AppBar(
        
        title: Text(widget.title),
      ),
      body: Center(
        
        child: Column(
         
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              'You have pushed the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: const Icon(Icons.add),
      ), // This trailing comma makes auto-formatting nicer for build methods.
    );
  }
}

AppDelegate.swift

      import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {
    GeneratedPluginRegistrant.register(with: self)
    UNUserNotificationCenter.current().delegate = self
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

  override func userNotificationCenter(_ center: UNUserNotificationCenter,
    willPresent notification: UNNotification,
    withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        completionHandler(.alert) // shows banner even if app is in foreground
    }

  class AppDelegate:UIResponder,UIApplicationDelegate{
    func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey:Any]?)->Bool{
          // Other intialization code…
          UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15))

          return true
      }
  }

}

Это новый проект с установленным только менеджером и общими настройками. Мне нужно вызвать общие настройки в фоновом режиме, но пока я не могу найти решения этой проблемы. Я действительно не хочу менять пакеты на этом этапе проекта, поэтому, если есть какое-то обходное решение, которое вы можете увидеть, что я не буду, я буду признателен.

1 ответ

Я просто скопировал AppDelegate отсюда Ошибка реализации плагина Flutter Workmanager отсутствует в iOS

      import UIKit
import Flutter
import workmanager
import shared_preferences

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
  override func application(
    _ application: UIApplication,
    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
  ) -> Bool {


    GeneratedPluginRegistrant.register(with: self)

    WorkmanagerPlugin.register(with: self.registrar(forPlugin: "be.tramckrijte.workmanager.WorkmanagerPlugin")!)

    UNUserNotificationCenter.current().delegate = self

    UIApplication.shared.setMinimumBackgroundFetchInterval(TimeInterval(60*15))


    WorkmanagerPlugin.setPluginRegistrantCallback { registry in
        AppDelegate.registerPlugins(with: registry)
        FLTSharedPreferencesPlugin.register(with: registry.registrar(forPlugin: "io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin")!)



    }
    return super.application(application, didFinishLaunchingWithOptions: launchOptions)
  }

    static func registerPlugins(with registry: FlutterPluginRegistry) {
               GeneratedPluginRegistrant.register(with: registry)
          }

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

}
Другие вопросы по тегам