Flutter: периодическая фоновая задача с использованием workmanager не работает на IOS
Я создаю приложение для iOS и Android с помощью Flutter. Мое приложение должно запускать фоновую задачу, когда приложение закрыто (скажем, каждые 15 минут). Затем покажите уведомление. Я слежу за этой статьей https://www.geeksforgeeks.org/background-local-notifications-in-flutter/?fbclid=IwAR0sKCVATW068AxuRIyDO693vcqwU0VTPVl1bgVkM3J3EGCHExv8P13dvz4 . Итак, я использую эту библиотеку https://pub.dev/packages/workmanager . Он работает для Android, но не работает для IOS.
Это мой код.
void main() {
// needed if you intend to initialize in the `main` function
WidgetsFlutterBinding.ensureInitialized();
Workmanager().initialize(
// The top level function, aka callbackDispatcher
callbackDispatcher,
// If enabled it will post a notification whenever
// the task is running. Handy for debugging tasks
isInDebugMode: true
);
// Periodic task registration
Workmanager().registerPeriodicTask(
"2",
//This is the value that will be
// returned in the callbackDispatcher
"simplePeriodicTask",
// When no frequency is provided
// the default 15 minutes is set.
// Minimum frequency is 15 min.
// Android will automatically change
// your frequency to 15 min
// if you have configured a lower frequency.
frequency: const Duration(minutes: 15),
);
runApp(const MyApp());
}
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) {
// initialise the plugin of flutterlocalnotifications.
FlutterLocalNotificationsPlugin flip = FlutterLocalNotificationsPlugin();
// app_icon needs to be a added as a drawable
// resource to the Android head project.
var android = const AndroidInitializationSettings('@mipmap/ic_launcher');
var ios = const IOSInitializationSettings();
// initialise settings for both Android and iOS device.
var settings = InitializationSettings(android: android, iOS: ios);
flip.initialize(settings);
_showNotificationWithDefaultSound(flip);
return Future.value(true);
});
}
Future _showNotificationWithDefaultSound(flip) async {
var androidPlatformChannelSpecifics = const AndroidNotificationDetails("your channel id", "my channel name");
var iOSPlatformChannelSpecifics = const IOSNotificationDetails();
// initialise channel platform for both Android and iOS device.
var platformChannelSpecifics = NotificationDetails(android: androidPlatformChannelSpecifics, iOS: iOSPlatformChannelSpecifics);
await flip.show(0, 'GeeksforGeeks',
'Your are one step away to connect with GeeksforGeeks',
platformChannelSpecifics, payload: 'Default_Sound'
);
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
Как я уже упоминал, он работает должным образом и показывает уведомления на Android. Когда я запускаю его на эмуляторе IOS, я получаю следующую ошибку.
An Observatory debugger and profiler on iPhone 12 Pro Max is available at: http://127.0.0.1:56183/fjCBE_KZDpw=/
[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: PlatformException(unhandledMethod("registerPeriodicTask") error, Unhandled method registerPeriodicTask, null, null)
#0 StandardMethodCodec.decodeEnvelope (package:flutter/src/services/message_codecs.dart:607:7)
#1 MethodChannel._invokeMethod (package:flutter/src/services/platform_channel.dart:156:18)
<asynchronous suspension>
#2 Workmanager.registerPeriodicTask (package:workmanager/src/workmanager.dart:173:7)
<asynchronous suspension>
The Flutter DevTools debugger and profiler on iPhone 12 Pro Max is available at: http://127.0.0.1:9100?uri=http://127.0.0.1:56183/fjCBE_KZDpw=/
В основном workmanager не работает. Что не так с моим кодом и как я могу это исправить?
1 ответ
Этот плагин поддерживает только одноразовые задачи на iOS.
Сообщение об исключении говорит вам, что метод
Даже если это работало на iOS, iOS не поддерживает задачи, запланированные через определенные промежутки времени. Вы можете запросить отправку фоновых задач, но операционная система будет принимать решения на основе таких вещей, как время автономной работы, бодрствование устройства и даже прошлые показатели производительности вашего приложения относительно того, действительно ли выполнять фоновую задачу для вашего приложения.
В идеале вместо того, чтобы выполнять задачу каждые 15 минут на мобильном устройстве, вам следует разработать какой-то другой подход; Пусть сервер выполнит задачу и при необходимости отправит уведомление, например.