Ответ 1
Я отвечу на свой вопрос, чтобы узнать, может ли эта информация быть использована любым, кто ее ищет.
Поскольку различные мобильные ОС обычно убивают фоновые задания или блокируют их, чтобы сэкономить заряд батареи, существует несколько детерминированных методов для планирования задач в режиме реагирования. Я использую комбинацию из следующего:
-
Перенесите таймеры в фоновый режим, которые работают с приложением как на переднем, так и на заднем плане. Https://github.com/ocetnik/react-native-background-timer (! Если вы используете create-реагировать-native-приложение, вы должны извлечь его)
-
Используйте фоновую выборку для iOS и HeadlessTask в Android, вот достойная библиотека https://github.com/jamesisaac/react-native-background-task
-
Используйте обновления геолокации для запуска приложения и запуска потоков https://github.com/mauron85/react-native-background-geolocation.
-
Я думаю, что вы можете следовать аналогичным стратегиям, используя пробуждения Bluetooth.
-
Отправляйте уведомления с сервера, чтобы детерминистически убедиться, что приложение запускает приложение (за исключением того, что оно было убито ОС). В iOS убедитесь, что вы вызываетеtification.finish
notification.finish()
чтобы избежать дискриминации алгоритмом обработчика задач. -
Для Android вы можете попробовать использовать AlarmManager API https://github.com/vikeri/react-native-background-job.
Остерегайтесь драконов: ваше приложение может быть закрыто, если оно злоупотребляет временем выполнения или использованием памяти после пробуждения системы. Возможно, вам придется повторно увлажнить всех слушателей после того, как телефон остался без батареи. Таким образом, пользователю все еще необходимо интенсивно взаимодействовать с вашим приложением.
Обновление: с Android O существуют очень строгие ограничения на фоновое исполнение. При использовании службы HeadlessJSTask убедитесь, что она запущена в качестве службы переднего плана, если вы хотите, чтобы она длилась дольше нескольких секунд. Это может потребовать уведомления с ним. Примите во внимание, что только загрузка пакета может занять до нескольких секунд, в зависимости от вашего приложения и устройства.