2017-01-12 14 views
2

После анализа служб определения местоположения в iOS 10 выяснилось, что некоторая несогласованность в поведении кэширования.Точность временной отметки местоположения в ios

Получение мест в течение периодического времени (в моем случае каждые 20 секунд) возвращает местоположения, но их временные метки не находятся в хронологическом порядке. Это указывает на то, что места кэширования могут иметь проблемы. Поэтому, если вы проверяете точность с помощью метки времени местоположения, лучше сохранить предыдущие временные метки. Чтобы вы могли решить, может ли использоваться выбранное местоположение или нет.

Ниже изображение взято из моего журнала консоли. Здесь я использовал формат «Lat Long: latitude_longitude | location_timestamp | сейчас: CURRENT_TIMESTAMP»

highlighted rows have older timestamps

ответ

2

Да некоторое время в лучшей точности КСНА взять место от улова, так что вам нужно, чтобы избежать этого местоположение здесь - код для точного местоположения.

Update: «Потому что это может занять несколько секунд, чтобы вернуться в исходное местоположение, менеджер местоположения обычно сразу доставляет ранее кэшированные данные о местоположении, а затем предоставляет больше данных о местоположении уточненный как она становится доступной поэтому. всегда рекомендуется проверять метку времени любого объекта местоположения, прежде чем предпринимать какие-либо действия ».

Ссылка:

https://developer.apple.com/reference/corelocation/cllocationmanager

Примечание: вы можете изменять точность для устройства, как Ipod и IPad

//MARK: Location delgates 
    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
    { 
     if locations.count > 0 
     { 
      let location = locations[locations.count-1] 

      let maxAge:TimeInterval = 60; 
      let requiredAccuracy:CLLocationAccuracy = 100; 

      let locationIsValid:Bool = Date().timeIntervalSince(location.timestamp) < maxAge && location.horizontalAccuracy <= requiredAccuracy; 
      if locationIsValid 
      { 
       NSLog(",,, location : %@",location); 
       NSLog("valid locations....."); 

      } 
     } 
    } 
+1

Чтобы выполнить этот ответ вы могли бы добавить эту цитату из https://developer.apple.com/reference/corelocation/cllocationmanager "Поскольку для возврата первоначального местоположения может потребоваться несколько секунд, диспетчер местоположений обычно передает ранее данные кэшированного местоположения, а затем предоставляет более современные данные о местоположении по мере их появления. Поэтому всегда полезно отметьте метку времени любого объекта местоположения, прежде чем предпринимать какие-либо действия ». – Starlord

+0

@Joakim спасибо за комментарий, я обновил ответ. –

+0

Зачем вы это делаете? let _ = locations.first – netshark1000

0

Да как @chirag шах прокомментировал нам обязательно нужно сделать проверить. Мое предложение состоит в том, что мы должны знать, что технология кэширования была изменена. А также недостаточно проверять метку времени, мы должны сосредоточиться на случае сбоя. Вот цель кода C

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ 

    CLLocation* location = [locations lastObject]; 
    NSDate* locationTimestamp = location.timestamp; 
    NSTimeInterval cachedBefore = [locationTimestamp timeIntervalSinceNow]; 
    if (fabs(cachedBefore) < 60.0) { 
     // Implement your code here 
    }else{ 
     // Try again or wait for fetching location 
    } 
} 
0

Проблема в том, что иногда метки времени не соответствуют местоположению! Например. во время путешествия вы внезапно записываете скорости> 300 км/ч и наилучшая точность.

Я бы отсортировать места и только бы последний, если не слишком стар:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

     let sortedLocations = locations.sorted { (l1, l2) -> Bool in 
      return l1.timestamp.compare(l2.timestamp) != .orderedDescending 
     } 

     if let newestLocation = sortedLocations.last{ 

      if Date().timeIntervalSince(newestLocation.timestamp) < 60{ 
       //TODO: Use the location 
      } 
     } 
    }