2017-01-12 51 views
2

在分析iOS 10中的位置服務之後,發現緩存行爲中存在一些不一致。iOS中的位置時間戳準確性

在週期性時間(在我的情況下,每20秒)提取位置,但它們的時間戳不按時間順序排列。這表明緩存位置可能有問題。因此,如果您通過位置時間戳檢查準確性,則還可以更好地保存以前的時間戳。這樣你就可以決定提取的位置是否可以使用。

下面的圖片取自我的控制檯日誌。在這裏,我使用的格式 「Lat Long網:latitude_longitude | location_timestamp |現在:CURRENT_TIMESTAMP

highlighted rows have older timestamps

回答

2

是在最佳精度IOS一段時間採取從捕獲的位置,所以你需要避免這裏的位置是準確位置的代碼。

更新: 「因爲它可能需要幾秒鐘返回初始位置,外景經理通常立即提供在先緩存的位置數據,然後變得可用提供更先進的最新位置數據。因此。在採取任何行動之前檢查任何位置對象的時間戳總是一個好主意。「

參考:

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

你爲什麼這樣做?讓_ = 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

這背後的問題是,有時時間戳不匹配的位置!例如。在旅行時突然記錄速度> 300km/h,並且準確度最高。

我的位置進行排序,並只將採取最後一個,如果不是太舊:

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 
      } 
     } 
    }