Какие причины (и как я могу исправить) эту нечетную ошибку Core Location?

ERROR, Generic, время, 320195751.128, функция, "пустота CLClientHandleRegistrationTimerExpiry (__ CFRunLoopTimer *, void *)", истек таймер регистрации, но клиент все еще регистрируется!

Есть только несколько упоминаний об этой проблеме, которые я смог выкопать в более широком Интернете, и никто не имеет полезной информации. Здесь контекст:

У меня есть приложение, которое отслеживает местоположение устройства с помощью метода CLUocationManager startUpdatingLocation. Он начинает мониторинг, работает некоторое время, затем это сообщение появляется на выходе отладки. С этого момента больше нет обновлений местоположения.

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

Update:
Хотя я и не нашел решения проблемы или не понял, почему это происходит в первую очередь, я также потерял способность воспроизводить ее. Это, похоже, произошло в течение некоторого периода времени, когда я делал много вещей, включая общее изменение структуры кода, за которым следует обновление бета-версии iOS 5. Кажется, что-то там заставило меня замолчать.

Ответы

Ответ 1

Вы реализовали

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error 

и это уловит?

Вам нужно проверить для kCLErrorNetwork, kCLErrorDenied, kCLErrorHeadingFailure и kCLErrorLocationUnknown в обычном прогоне, но мне интересно, есть ли еще ошибки, которые делегат может поймать?

Это может дать вам возможность остановить и затем перезапустить службы определения местоположения.

Ответ 2

Отключение того, что должен был предоставить @schillace, возможно ли, что вы пытаетесь принудительно обновлять местоположение, не прислушиваясь к статусу авторизации пользователя?

Попробуйте приостановить вызов -startUpdatingLocation, пока не узнаете, что [CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized.

Ответ 3

Я не знаю, является ли это ответом или нет, но вот подсказка... Я работаю с assetFromURL, и я получаю прерывистые сбои в загрузке изображений из библиотеки активов. Поэтому я написал немного кода для тестирования теории, которая очень быстро загружает каждый URL-адрес в библиотеке. Я начал эту ошибку с этим кодом.

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

Надеюсь, что это поможет, это просто догадка.

Ответ 4

Вы уверены, что это проблема? Мне кажется, что вы отлаживаете точку останова (фактически приостанавливаете приложение) до завершения регистрации в менеджере местоположений. Между тем, таймер истекает, и вы еще не закончили регистрацию. Если вы вынимаете точки останова, появляется ли сообщение?

Ответ 5

Вы делаете материал местоположения в основном потоке? У меня были всевозможные проблемы с бизаррой с вызовами CLLocation API из фонового потока. Я переместил несколько ключевых вызовов настройки в основной поток, тогда все сработало нормально.

Ответ 6

Я получил ту же ошибку и понял, что это произошло потому, что я забыл упомянуть, что класс реализует CLLocationManagerDelegate в файле .h.

Добавление CLLocationManagerDelegate в файл заголовка, и следующая строка, указывающая на то, что делегат решил ошибку для меня.

locationManager.delegate = self;
[locationManager startUpdatingHeading];

Ответ 7

Я получил это при реализации таймаута (выполнить селектор после задержки) в LocateMe, мой предыдущий код использовал другой метод. Я не знаю, является ли это ключом.