2017-01-12 2 views
2

iOS 10에서 위치 서비스를 분석 한 후 캐싱 동작에 약간의 불일치가있는 것으로 나타났습니다.위치 정확도가 ios에 있음

주기적인 시간 (내 경우 20 초마다) 위치를 가져 오는 위치는 반환되지만 시간 소인은 시간순으로 정렬되지 않습니다. 이는 캐싱 위치에 문제가있을 수 있음을 나타냅니다. 따라서 location-timestamp를 통해 정확도를 확인하면 이전 타임 스탬프도 저장하는 것이 좋습니다. 따라서 가져온 위치를 사용할지 여부를 결정할 수 있습니다.

아래 이미지는 내 콘솔 로그에서 가져온 것입니다. 당신이 것을 피할 필요하므로

highlighted rows have older timestamps

답변

2

예 최고의 정확도 IOS에서 약간의 시간이 캐치에서 위치를 가지고 여기에 나는 형식 ": | | location_timestamp 이제 latitude_longitudeCURRENT_TIMESTAMP 위도 롱"을 사용 위치는 정확한 위치를 나타내는 코드입니다.

업데이트 : "는 초기 위치를 반환하는 데 몇 초가 걸릴 수 있기 때문에, 위치 관리자는 일반적으로 즉시 이전에 캐시 위치 데이터를 제공하고이를 사용할 수있는대로 더 최신의 위치 데이터를 제공 따라서. 어떤 행동을 취하기 전에 위치 개체의 타임 스탬프를 확인하는 것이 좋습니다. "

참조 :

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

: 당신은 아이팟과 같은 장치 및 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

이 문제는 타임 스탬프가 위치와 일치하지 않는 경우가 있습니다. 예 : 여행하는 동안 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 
      } 
     } 
    } 
관련 문제