Каков наилучший способ запланировать выполнение задания в ответном режиме?

Существуют различные способы запуска задач в фоновом режиме в Android и iOS соответственно. Я нашел Каков наилучший способ запланировать задачу в android?, а также при переполнении стека.

Мне интересно, какой из них лучше всего использовать только react-native. Было бы достаточно использовать setInterval или setTimeout для задач, которые должны выполняться ежедневно или каждые несколько часов?

Не будут ли эти задачи убиты ОС?

Любые идеи или предложения?

Ответ 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 убедитесь, что она запущена в качестве службы переднего плана, если вы хотите, чтобы она длилась дольше нескольких секунд. Это может потребовать уведомления с ним. Примите во внимание, что только загрузка пакета может занять до нескольких секунд, в зависимости от вашего приложения и устройства.

Ответ 2

На самом деле для этого нет достаточного пути. но мы можем отметить mauron85 как способ, который лучше, чем другие на Android, но он также не работает на IOS. например, если приложение было убито пользователем, задание не будет работать, или не будет никакого контроля количества выполненных заданий, задание запускается каждый раз, когда устройство меняет свое положение.

другие компоненты, такие какact-native-background-fetch и Reaction-native-background-task, имеют ограничение по времени выполнения задания (задание повторяется через каждые 15 минут, и нет никакого способа уменьшить этот период времени), и они просто работают на Android,

было бы замечательно, если бы у Facebook реагировать нативно было какое-то практическое решение этой проблемы.