Описание решения нашего от flutter-разработчика Дамира ВильямоваКстати, обращаем ваше внимание:
FirebaseMessaging.onBackgroundMessage
-это правильный метод
FirebaseMessaging.onForegroundMessage
-неправильный
На этапе первых тестов столкнулись с тем, что разработчик по ошибке указал не тот метод ю, и поэтому пуши попросту не принимались. Еще подробнее про тестирование расскажем ниже.
Тестирование решенияДля того, чтобы проверить решение, мы сделали ветку со счётчиком пришедших silent-push уведомлений на главной странице приложения.
Нужно было проверить 2 сценария.
1.Работа в бэкграунде, если приложение свернуто:- запускаем приложение;
- открываем маршрутный лист;
- проверяем, что координаты начали идти;
- отмечаем у себя время начала тестов;
- переходим в другое приложение(либо просто выходим из приложения по кнопке "Домой");
- оставляем девайс на час;
- открываем приложение;
- проверяем количество пришедших уведомлений (с учётом того, что они отправляются раз в 30 сек, счётчик должен показывать 120);
- далее проверяем количество пришедших координат (мы запрашивали у заказчика скрин из их CRM-системы, на нем был отображён список всех пришедших по маршрутному листу координат с указанием времени, количество с момента открытия должно было равняться количеству пришедших сайлент пушей).
2.Работа приложения в бэкграунде, если экран телефона заблокирован:Все шаги те же, но вместо перехода в другое приложение/выхода по кнопке "Домой", мы блокировали экран.
Минусы этого решения:
- если смахнуть приложение из системного трея (это меню всех недавно открытых приложений) - работать не будет;
- если у приложения не стоит доступ к геолокации "всегда" - работать не будет.
О второй пункт мы споткнулись, да так больно, что успели уже похоронить надежду сдать заказчику задачу в полном объеме. Ситуацию вполне можно назвать эпик фейлом.
Как это былоПри тестировании второго сценария у нас в момент блокировки просто переставали идти координаты на сервер. В коде с геолокацией проблем не было, пуши с сервера, судя по логам (лог - это текстовый файл, куда автоматически записывается важная информация о работе системы или программы), шли нормально. Ситуация казалась безвыходной.
Спустя 4 часа упорного тестирования, чтения документации, паники и попыток понять, где ошибка, до нас дошло, что проблемы, в общем-то, и не было.
При переустановке сборки слетело разрешение "использовать геолокацию всегда", стояло "только при использовании".
Итак, решение для iOS сработало, но возникла другая проблема - этот вариант не подходил для Android.
Для начала нужно было описать входную точку, которая будет работать с нативным кодом через Dart API/