Как работать с отложенным местоположением iOS 6?
Я пытаюсь использовать новую функцию iOS 6 для обновлений отложенного местоположения, но продолжаю получать эту ошибку:
didFinishDeferredUpdatesWithError: Ошибка Domain=kCLErrorDomain Code=11 "Операция не может быть завершена. (kCLErrorDomain error 11.)"
Я использую следующий код:
- (DeviceAPI *) init
{
locationManager = [[CLLocationManager alloc] init];
[locationManager setDelegate:self];
[locationManager setDesiredAccuracy:kCLLocationAccuracyBest];
[locationManager startUpdatingLocation];
[locationManager allowDeferredLocationUpdatesUntilTraveled:(CLLocationDistance)100000 timeout:(NSTimeInterval)100000];
return self;
}
И это callback
функция:
- (void)locationManager: (CLLocationManager *) manager
didFinishDeferredUpdatesWithError:(NSError *)error
{
NSLog(@"didFinishDeferredUpdatesWithError :%@", [error description]);
}
Любая помощь?
5 ответов
Согласно форумам разработчиков Apple для iOS 6.0 SDK, отложенные обновления местоположения доступны только:
- на аппаратном обеспечении iPhone 5
- под управлением iOS 6.0 или выше
- желаемая точность установлена на
kCLLocationAccuracyBest
или жеkCLLocationAccuracyBestForNavigation
потому что для этого требуется GPS-чип. IPad без сотовых данных не имеет GPS-чипа. - вызвать метод "startUpdatingLocation"
- дождитесь появления обновлений местоположения со скоростью примерно 1 раз в секунду
- затем начните откладывать обновления
Смотрите: https://devforums.apple.com/message/751974
Смотрите документы: allowDeferredLocationUpdates(untilTraveled:timeout:)
Похоже, вам нужно аппаратное обеспечение iPhone 5 и ожидание появления обновлений местоположения с частотой 1 Гц.
Кроме того, как уже упоминалось в другом постере, вам необходимо реализоватьlocationManager:didUpdateLocations:
Метод в вашем делегате.
Наиболее распространенное место, чтобы назвать это [
allowDeferredLocationUpdates
] метод в вашем делегатеlocationManager(_:didUpdateLocations:)
метод. После обработки любых новых местоположений вызовите этот метод, если вы хотите отложить будущие обновления до тех пор, пока не будут выполнены критерии расстояния или времени. Если поступают новые события и ваше приложение находится в фоновом режиме, события кэшируются и их доставка соответствующим образом откладывается.Из документов.Я добавил заметки внутри
[]
,
Перед вызовом allowDeferredLocationUpdatesUntilTraveled:timeout: установите для фильтра расстояния значение kCLDistanceFilterNone, затем он будет работать.
Вы установили местоположение в поле UIBackgroundModes info.plist?
В моем тестировании я обнаружил, что отложенные обновления работают только в iOS 6.0.1 или выше, но не в 6.0. Я протестировал на 2 телефонах 1, который я обновил, и 1, который я оставил, используя 6.0 для тестирования. Я полагаю, что это причина того, что симулятор не работает, и если ваш телефон еще не обновлен, вполне вероятно, что это тоже не работает.
Также убедитесь, что вы реализуете
- locationManager:didUpdateLocations:
а не устарела
- locationManager:didUpdateToLocation:fromLocation:
как это требуется для использования с отложенными обновлениями местоположения.
Я нашел это описание в одном примере Framework для вызова [CLRegion initCircularRegionWithCenter]:
"Если радиус наложения слишком велик, регистрация не выполняется автоматически, поэтому ограничьте радиус до максимального значения".