Невозможно показать или запланировать уведомление с помощью Flutter WorkManagerIOS

Программируем под IOS
Ответить
Anonymous
 Невозможно показать или запланировать уведомление с помощью Flutter WorkManager

Сообщение Anonymous »

Я создаю приложение с Flutter для Android и iOS, которое должно каждый день проверять наличие новых данных и отправлять уведомление пользователю. Для этого я использую workmanager, чтобы запланировать задание, и flutter_local_notifications, чтобы показать уведомление.
Когда задание выполняется, никаких уведомлений не отображается и никаких исключений не перехватывается.
Однако, если я попытаюсь отобразить уведомление в соответствии с документами flutter_local_notifications, т. е. без Workmanager, оно сработает правильно.
Это MRE моего main.dart, который показывает, как я планирую задание и показываю уведомление:

Код: Выделить всё

import 'dart:io';
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
import 'package:intl/intl.dart';
import 'package:timezone/data/latest_all.dart' as tz;
import 'package:timezone/timezone.dart' as tz;
import 'package:workmanager/workmanager.dart';
import 'package:intl/date_symbol_data_local.dart';

final localNotificationPlugin = FlutterLocalNotificationsPlugin();
bool _initialized = false;

void main() async {
await initialize();
Workmanager().initialize(callbackDispatcher);
runApp(App());
}

@pragma('vm:entry-point')
Future initialize() async {
WidgetsFlutterBinding.ensureInitialized();

await initializeDateFormatting(Platform.localeName, null);
await initLocalNotificationPlugin();

tz.initializeTimeZones();
tz.setLocalLocation(tz.getLocation(DateTime.now().timeZoneName));
}

Future initLocalNotificationPlugin() async {
if (_initialized) {
return;
}

_initialized = true;
const AndroidInitializationSettings initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher');
final DarwinInitializationSettings initializationSettingsDarwin = DarwinInitializationSettings();
final InitializationSettings initializationSettings = InitializationSettings(
android: initializationSettingsAndroid,
iOS: initializationSettingsDarwin
);

await localNotificationPlugin.initialize(initializationSettings);
}

@pragma('vm:entry-point')
void callbackDispatcher() {
Workmanager().executeTask((task, inputData) async {
print('callbackDispatcher');

try {
await initialize();
} catch (e) {
print("Exception on callbackDispatcher");
print(e);
}

switch (task) {
case "fetchAndShow":
await sendNotification();
break;
default:
// Handle unknown task types
break;
}

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

@pragma('vm:entry-point')
Future sendNotification() async {
print('sendNotification');

try {
await localNotificationPlugin.show(
0,
"Notification Title",
"Notification Body",
NotificationDetails(
android: AndroidNotificationDetails("channel_id", "channel_name")
)
);
} catch (e) {
print('Exception on sendNotification');
print(e);
}
}

class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
Workmanager().registerPeriodicTask('dataSync', 'fetchAndShow', frequency: Duration(days: 1));
// Build logic
}
}
Я использую:
  • flutter: ^3.9.2
  • intl: ^0.20.2
  • flutter_local_notifications: ^19.5.0
  • часовой пояс: ^0.10.1
  • рабочий менеджер: ^0.9.0+3
Изменить
Обратите внимание, что задание выполняется успешно: я вижу как callbackDispatcher, так и sendNotification, а также

Код: Выделить всё

worker result SUCCESS for Work [ id=GUID, tags={ dev.fluttercommunity.workmanager.BackgroundWorker } ]
при отладке через Android Studio.

Подробнее здесь: https://stackoverflow.com/questions/798 ... orkmanager
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»