Flutter didChangeAppLifecycleState перестал работать в iOS

#ios #flutter #push-notification #background

Вопрос:

Пожалуйста, помогите!!!

Вот пример моего кода (извлечены только важные части)

   @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    super.didChangeAppLifecycleState(state);
    switch (state) {
      case AppLifecycleState.paused: 
       AuraPreferences.queryPreference('AppointmentRemindMe').then((value) async {
          if (appState.isUserLoggedIn amp;amp; AuraConvert.toBoolean(value)) {
            // stop foreground and resume background appointment reminders
            AppointmentReminder.stop();
            await AppointmentReminder.scheduleRemindersInBackground();
          }
        });

        ProgressNoteService.stop();
        chatMessageProvider.stopConnection();

        _goneToBackgroundAt = DateTime.now().toUtc();

        appState.cancelSsoTimer();

        print('App went to background at $_goneToBackgroundAt');
        break;

      case AppLifecycleState.resumed:
 

   static Future<void> scheduleRemindersInBackground() async {
    // schedule appointment reminders in background 10 minutes before they are supposed to occur
    final appointments = await ScheduleService.getAppointmentReminders(inNextMinutes: 60 * 24 * 3);
    for (int i = 0; i < appointments.length; i  ) {
      await _scheduleReminderInBackground(
 

   static Future<List<AuraAppointment>> getAppointmentReminders({required int inNextMinutes}) async {
    var now = DateTime.now();
    now = DateTime(now.year, now.month, now.day, now.hour, now.minute);
    final to = now.add(Duration(minutes: inNextMinutes));

    if (cacheAppointments.containsKey(DateTimeRange(start: now, end: to))) {
      return cacheAppointments[DateTimeRange(start: now, end: to)] ?? <AuraAppointment>[];
    }

    var appointments = await getAppointments(now, to);
 

 class ScheduleService {
  static Future<List<AuraAppointment>> getAppointments(
    DateTime? dateFrom,
    DateTime? dateTo, {
    isCalledFromCalendar = false,
    isSync = false,
  }) async {
    if (dateFrom == null || dateTo == null) return <AuraAppointment>[];

    final authUser = await UserService.authUser;

       final String uri = 'https://api.domain123.com/something_here_to_send_parameters';

    final networkHelper = NetworkHelper(uri, authUser: authUser, goToLoginScreen: isCalledFromCalendar);

    var appointments = await networkHelper.get<List<AuraAppointment>>((dynamic data) {
      return (data as List).map((i) => AuraAppointment.fromMap(i)).toList();
    });

    final localDb = await MobileDatabase.dbInstance;

    if (NetworkHelper.isConnected) {
      if (appointments == null) return <AuraAppointment>[];

      if (isSync) {
        await MobileDatabase.deleteData('AuraAppointments', {'OwnerID': authUser?.userId});
      }

      // upsert data into local database to be available in off-line mode
      for (var appointment in appointments) {
        appointment.ownerId = authUser?.userId;
        MobileDatabase.upsertData('AuraAppointments', appointment.toMap());
      }
    } else {
      appointments = (await localDb.query(
        'AuraAppointments',
        where: 'OwnerID = ?',
        whereArgs: [authUser?.userId],
      ))
          .map((i) => AuraAppointment.fromMap(i))
          .toList();
    }

    final individualApp = appointments.where((a) => a.scgrID == 0);
    individualApp.forEach((ia) {
      if (ia.clientID != null amp;amp; ia.clientID! > 0) ia.clientIDs.add(ia.clientID);
    });

    final groupApp = appointments.where((a) => a.scgrID! > 0 amp;amp; a.clientID == 0);
    groupApp.forEach((ga) {
      final clients =
          appointments!.where((a) => a.scgrID == ga.scgrID amp;amp; a.clientID! > 0).map((a) => a.clientID).toList();
      ga.clientIDs.addAll(clients);
    });

    var resultApp = <AuraAppointment>[];
    resultApp.addAll(individualApp);
    resultApp.addAll(groupApp);

    return resultApp;
  } // end of getAppointments method
 

Уведомления работают правильно, когда приложение находится в автономном режиме, но не работают, когда оно находится в онлайн-режиме. Встречи (данные) поступают из локальной базы данных в автономном режиме и веб-API в онлайн-режиме. Это означает, что веб-API выходит из строя, когда он вызывается в то время, когда приложение отодвигается на задний план. Это происходит только в выпускных сборках для iOS (Android хорош), но не в отладочных сборках, когда я запускаю код на своем устройстве iPhone 8.
ПОЖАЛУЙСТА, ПОМОГИТЕ МНЕ РЕШИТЬ ЭТУ ПРОБЛЕМУ!!!

Краткое описание врача (чтобы увидеть все подробности, запустите flutter doctor -v):

Флаттер (стабильный канал, 2.2.3, на Mac OS X 10.15.7 19H524 darwin-x64, язык en-CA)

Набор инструментов Android — разработка для устройств Android (Android SDK версии 30.0.2)

Android Studio (версия 4.2)

Версия iOS-14,4

Комментарии:

1. Можете ли вы перейти на последнюю стабильную версию канала Flutter (2.5.1)? Принимаю желаемое за действительное, но, может быть, это все исправит.

2. Я только что протестировал свой код, используя последнюю версию Flutter 2.5.1. Вот что я нашел. Мое мобильное приложение работает в онлайн-режиме, что означает, что оно вызывает веб-API. Когда я нажимаю на него в фоновом режиме, я не получаю уведомлений. Однако, когда я возвращаю свое приложение на передний план, я получаю уведомление. Это противоположно тому, чего я хочу достичь. Мне кажется, что в Flutter SDK что-то не так.

3. Вы просто пытаетесь разбудить свое фоновое приложение с помощью заранее запланированного локального или внешнего уведомления (например, push-уведомления) или пытаетесь заставить свое фоновое приложение отправлять уведомление при фоновом режиме? Выполнение приложений AFAIK на базе iOS приостановлено, за исключением тех, которые используют некоторые очень специфические системные API, такие как аудио и навигация. В нашем приложении я могу вывести его на передний план, если он находится в фоновом режиме, используя предварительно запланированное локальное уведомление, и оно работает на iOS и Android, но уведомление должно быть либо внешним, либо запланированным, прежде чем приложение будет создано.

4. Мое приложение должно постоянно отправлять напоминания о встречах в виде локальных push-уведомлений (с использованием пакета flutter_local_notifications). Пока он активен, я запускаю таймер каждые 10 минут, чтобы выбрать предстоящую встречу и напомнить пользователю. Когда приложение отодвигается на задний план, я выключаю таймер и вызываю веб-API, чтобы выбрать встречи и запланировать уведомления для них за 10 минут до их начала. Это происходит в случае AppLifecycleState.приостановлено: в didChangeAppLifecycleState() Я уверен, что это работало несколько месяцев назад, когда я ссылался на Flutter SDK версии 1.?.?