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)
}
}