Как работать с отложенным местоположением 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]:

"Если радиус наложения слишком велик, регистрация не выполняется автоматически, поэтому ограничьте радиус до максимального значения".

Другие вопросы по тегам