iOS 12 закрывает приложения в фоновом режиме без причины

Начиная с iOS 12, CLLocationManager больше не работает бесконечно в фоновом режиме. Приложение завершается без аварийного журнала в случайное время. Это работало нормально до iOS 12.

Чтобы продемонстрировать эту проблему, я создал образец приложения здесь

Демонстрационное приложение просто запускает CLLocationManager и поддерживает его в фоновом режиме. Работая в фоновом режиме, мы отслеживаем его, регистрируя его. Проблема в том, что приложение закрывается iOS. Демо-приложение создано для демонстрации этой проблемы.

Действия по воспроизведению

  1. Запустите приложение на устройстве
  2. Большой доступ к диспетчеру местоположений
  3. Положить приложение на задний план
  4. Подождите 1-48 часов

Результат:

  1. Приложение прекращено

Приложение прекращается без каких-либо причин после случайного времени.

Ожидаемый результат:

  1. Приложение все еще работает.

Как это должно работать

Это подтверждается инженером Apple:

Как только обновления CLLocationManager запущены на переднем плане, и вы выполнили всю работу, чтобы он работал в фоновом режиме, обновления местоположения должны выполняться бесконечно в фоновом режиме до тех пор, пока:

  • приложение принудительно
  • устройство перезагружено
  • приложение останавливает обновления местоположения
  • приложение выпускает объект CLLocationManager
  • приложение вылетает
  • iOS закрывает приложение из-за нехватки памяти,
  • объект locationManager освобожден, переиздан или перезаписан. Вы должны убедиться, что ваш контроллер представления не создается, что затем сбрасывает класс locationController. Если это произойдет, когда приложение находится в фоновом режиме, вы перезапустите обновления, что в конечном итоге приведет к приостановке приложения. Вы должны убедиться, что locationController является одноэлементным.
  • приложение падает. Проверьте, есть ли журналы сбоев на тестируемом устройстве.
  • iOS закрывает приложение из-за нехватки памяти. В этом случае вы найдете журналы JetsamEvent на устройстве, которое показывает, что ваше приложение завершено. Вы можете проверить метки времени и найти ту, которая находится примерно в то время, когда ваше приложение перестало работать.

Ответ 1

Обновленный ответ:

Apple исправила эту ошибку в iOS 12.2 beta 2 (16E5191d)

Оригинальный анализ и обнаружение ошибок:

Вместе с технической поддержкой Apple Developer мы проанализировали эту проблему с помощью файлов Sysdiagnose. Следуя этим рекомендациям, вы можете установить профили, чтобы иметь больше регистрации на вашем устройстве. Я не знаю точно, как эти журналы работают и где найти эту проблему, но Apple сделала это для меня и пришла с первым анализом:

В случае приостановки, который вы наблюдали в 2018/10/22 01: 01:12: 587, это то, что я вижу (примерно через минуту после регистрации вашей последней активности)

[CllocationManag: 2725] Завершается описанием: {owner =; target = rw.sp.flitsmeister.frameworks.CllocationManagerBackgroundTest; target = rw.sp.flitsmeister.frameworks.CllocationManagerBackgroundTest; } }

Это в основном говорит о том, что ваше приложение было закрыто, потому что системе требовалось место на диске, и она убила кучу приложений, чтобы она могла удалить их каталоги /tmp и /Library/Caches. Я видел, что этот процесс немного более агрессивен в iOS 12, но, увидев, что вы работаете на устройстве емкостью 256 ГБ и у вас после очистки осталось ~ 179 ГБ, мне трудно поверить, что это оправдано.

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

К сожалению, я не принес хороших новостей.

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

Итак, на данный момент, я хотел бы, чтобы вы подали отчет об ошибке. Объясните симптомы. И убедитесь, что вы загружаете файлы sysdiagnose вместе с отчетом об ошибке. (Я уже отправил ваши, но новые тоже не помешают). И дайте мне знать номер ошибки, пожалуйста.

Таким образом, это означает, что в настоящее время в iOS 12 ваше приложение не будет работать бесконечно в фоновом режиме. Я заполнил отчет об ошибке, номер 45581276 и постараюсь сохранить эту ветку обновленной.

Ответ 2

Я попытался очистить каталоги /tmp и /Library/Caches, когда приложение работает в фоновом режиме без каких-либо изменений в поведении. Я также периодически делал то же самое, когда приложение обрабатывало фоновые местоположения без каких-либо изменений.

Ответ 3

Я заметил, что Apple выпустила IOS 12.2 сейчас. проблема вашего приложения решена? У меня приложение работает на фоне без проблем на ios 8,9,10,11. однако, он перестает работать в фоновом режиме на IOS 12.1. Я заметил, что какое-то приложение все еще работает нормально (Skype, Facebook, Viber...) Кто-нибудь знает, как это исправить?