Фоновый режим iOS: после запуска обновлений местоположения в фоновом режиме приложение никогда не завершает работу - PullRequest
3 голосов
/ 23 октября 2019

Я запускаю обновления местоположения в фоновом режиме. Все работает хорошо:

  • На значительном месте приложение запускается в фоновом режиме

- appDidFinishLaunching(options:) вызывается как положено.

  • Я запускаю LocationManager startUpdatingLocation() и startMonitoringSignificantLocationChanges()

  • Местоположения собраны правильно.

  • Через некоторое время я звоню stopUpdatingLocation()

  • Моя программа на этом этапе не нуждается в каких-либо действиях и дальнейший код не выполняется

В этот момент программа остается бездействующей. applicationWillTerminate больше никогда не вызывается. Это ожидается? Я надеялся, что приложение снова закроется, так как обновления местоположения не требуются.

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

Как только это произойдет, то, если пользователь открывает приложение или снова будет получено значительное местоположение, тогда appDidFinishLaunching(options:) НЕ вызывается, а вместо applicationDidBecomeActive.

Есть ли какая-либо документация, которой я могу следовать, которая поддерживает ожидаемое поведение?

Ответы [ 2 ]

7 голосов
/ 06 ноября 2019

Да, все здесь ожидается. От JD Wooder есть удаленный ответ, который правильно связал документацию: «Управление жизненным циклом вашего приложения». Как правило, фоновые приложения iOS не убиваются заранее. Их убивают только тогда, когда нужны системные ресурсы. Это непредсказуемо, и приложение, как правило, не получит сообщение applicationWillTerminate, когда это произойдет (потому что приложение обычно не работает в этот момент, и его не разбудят, чтобы убить). Ваше приложение должно обрабатывать как холодный запуск (appDidFinishLaunching), так и горячий запуск (applicationDidBecomeActive).

Перезапуск приложения с нуля стоит дорого, поэтому iOS предпочитает хранить недавно использованную вещь в памяти, если ее нетресурсное давление. Приложения, которые ничего не делают, очень дешевы. чтобы быть в курсе.

Обратите внимание, что iOS 13 стала намного более агрессивной в убийстве приложений в фоновом режиме, и что большие камеры на новых телефонах приводят к нехватке памяти, которая также убивает приложения быстрее, поэтому не стоитслишком долго бегать в фоновом режиме. Но это тоже очень нормально.

2 голосов
/ 07 ноября 2019

Пожалуйста, смотрите приложение для iOS Жизненный цикл ,

appDidFinishLaunching will call only when app Launch,
applicationWillTerminate  - called when app terminate from background
applicationDidBecomeActive - Called when app comes to foreground from background
...