Я некоторое время боролся с этой проблемой, и я думаю, что наконец-то дошел до ее сути ..
Причина, по которой служба определения местоположения не останавливается при запросе, не в том, что вы ее не остановили или не выпустили должным образом. На самом деле это вызвано освобождением и перераспределением самого CLLocationManager, по моему опыту.
Если у вас есть код, который выпускает ваш CLLocationManager в applicationDidEnterBackground, а затем вы выделяете новый в applicationDidEnterForeground и т. Д., То, вероятно, у вас возникнет эта проблема.
Решение таково:
- Создайте объект CLLocationManager только один раз, в applicationDidFinishLaunching.
- Для начала вызовите startUpdatingLocation, startMonitoringSignificantLocationChanges и т. Д. Как обычно.
- Чтобы остановить обновления, вызовите соответствующий stopUpdatingLocation, stopMonitoringSignificantLocationChanges и т. Д. Как обычно.
- Никогда, никогда не выпускайте ваш CLLocationManager или устанавливайте его ссылку на nil (возможно, за исключением applicationWillTerminate, но это, вероятно, не будет иметь никакого значения).
Таким образом, я отказался от того, чтобы мое приложение продолжало использовать службы определения местоположения в течение 12 часов после помещения моего приложения в фоновом режиме, до стрелки служб определения местоположения, исчезающей в течение 10 секунд после создания фона с этим новым подходом.
Примечание. Протестировано на iPhone 4S под управлением iOS 5.1.1. Чтобы получить точные результаты о производительности вашего приложения в этом отношении, убедитесь, что вы идете в Настройки-> Службы определения местоположения-> Системные службы и отключите переключатель значка строки состояния. Таким образом, стрелка в строке состояния будет точно отражать использование только приложениями.