Начиная с iOS 12, CLLocationManager больше не работает бесконечно в фоновом режиме. Приложение завершается без аварийного журнала в случайное время. Это работало нормально до iOS 12.
Чтобы продемонстрировать эту проблему, я создал образец приложения здесь
Демонстрационное приложение просто запускает CLLocationManager и поддерживает его в фоновом режиме. Работая в фоновом режиме, мы отслеживаем его, регистрируя его. Проблема в том, что приложение закрывается iOS. Демо-приложение создано для демонстрации этой проблемы.
Действия по воспроизведению
- Запустите приложение на устройстве
- Большой доступ к диспетчеру местоположений
- Положить приложение на задний план
- Подождите 1-48 часов
Результат:
- Приложение прекращено
Приложение прекращается без каких-либо причин после случайного времени.
Ожидаемый результат:
- Приложение все еще работает.
Как это должно работать
Это подтверждается инженером Apple:
Как только обновления CLLocationManager запущены на переднем плане, и вы выполнили всю работу, чтобы он работал в фоновом режиме, обновления местоположения должны выполняться бесконечно в фоновом режиме до тех пор, пока:
- приложение принудительно
- устройство перезагружено
- приложение останавливает обновления местоположения
- приложение выпускает объект CLLocationManager
- приложение вылетает
- iOS закрывает приложение из-за нехватки памяти,
- объект locationManager освобожден, переиздан или перезаписан. Вы должны убедиться, что ваш контроллер представления не создается, что затем сбрасывает класс locationController. Если это произойдет, когда приложение находится в фоновом режиме, вы перезапустите обновления, что в конечном итоге приведет к приостановке приложения. Вы должны убедиться, что locationController является одноэлементным.
- приложение падает. Проверьте, есть ли журналы сбоев на тестируемом устройстве.
- iOS закрывает приложение из-за нехватки памяти. В этом случае вы найдете журналы JetsamEvent на устройстве, которое показывает, что ваше приложение завершено. Вы можете проверить метки времени и найти ту, которая находится примерно в то время, когда ваше приложение перестало работать.