2017-01-12 4 views
2

iOS 10で位置情報サービスを分析した後、キャッシングの動作にいくつかの矛盾があることがわかりました。iosでの位置タイムスタンプの精度

(私の場合、20秒ごとに)定期的に場所を取得すると、場所が返されますが、タイムスタンプは時間順に並べられません。これは、キャッシングの場所に問題がある可能性があることを示します。したがって、以前のタイムスタンプも保存するためにlocation-timestampを使用して正確性をチェックした方が良いでしょう。フェッチされた場所を使用するかどうかを決めることができます。

以下は、コンソールログから撮影したものです。

highlighted rows have older timestamps

答えて

2

あなたがいることを避けるために必要があるので、はい最高精度のIOSのいくつかの時間がキャッチから場所を取るここで私は「CURRENT_TIMESTAMP:今すぐ| | location_timestamplatitude_longitude緯度ロング」の形式を使用しました場所は正確な場所を示すコードです。

更新: 「それは最初の位置を返すために数秒かかることがあるので、ロケーションマネージャは、通常、直前にキャッシュされた位置データを提供し、それが利用可能になるなど、より最新の位置データを提供するため。何らかの行動をとる前に、ロケーションオブジェクトのタイムスタンプをチェックすることは、常に良い考えです」

参考:

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