iOS 12 закрывает приложения в фоновом режиме без причины
Начиная с iOS 12, CLLocationManager больше не работает бесконечно в фоновом режиме. Приложение завершается без аварийного журнала в случайное время. Это работало нормально до iOS 12.
Чтобы продемонстрировать эту проблему, я создал образец приложения здесь
Демонстрационное приложение просто запускает CLLocationManager и поддерживает его в фоновом режиме. Работая в фоновом режиме, мы отслеживаем его, регистрируя его. Проблема в том, что приложение закрывается iOS. Демо-приложение создано для демонстрации этой проблемы.
Действия по воспроизведению
- Запустите приложение на устройстве
- Большой доступ к диспетчеру местоположений
- Положить приложение на задний план
- Подождите 1-48 часов
Результат:
- Приложение прекращено
Приложение прекращается без каких-либо причин после случайного времени.
Ожидаемый результат:
- Приложение все еще работает.
Как это должно работать
Это подтверждается инженером 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...) Кто-нибудь знает, как это исправить?