2012-03-21 10 views
8

사용자의 위치를 ​​모니터링하는 앱을 작성 중입니다. startMonitoringSignificantLocationChanges를 사용하는 CLLocationManager 개체가 있으므로 앱이 실행되고 있지 않을 때 백그라운드에서 위치 업데이트를 얻을 수 있습니다. 내 응용 프로그램 didFinishLaunchingWithOptions을 설정 했으므로 위치 키를 얻으면 관리자를 불러 사용자의 위치를 ​​얻습니다. 모든 것이 잘 작동하지만 문제는 배경에서 위치를 얻을 때마다이 위치의 수평 정확도가 매우 나쁘다는 것입니다. 대부분의 경우 1414m이다.위치. 배경에서 위치를 가져올 때 수평 정확도가 너무 낮습니다.

위치가 배경에서 오는 경우 왜 수평 정확도가 그렇게 나쁜지 누가 알 수 있습니까? 백그라운드에서 더 정확하게 위치를 파악할 수있는 방법이 있습니까?

앱이 실행되는 동안 내가 얻은 모든 위치가 매우 정확합니다. 위치가 배경에서 오는 경우에만 발생합니다. 그게 내 도시에있는 셀 타워의 수와 관련이 있니? 장치가 wifi 노드의 gps를 사용하지 않아 백그라운드에서 위치를 얻고 있다고 생각했습니다.

어쨌든, 여기에 도움을 주시면 감사하겠습니다. 의견을 보내주십시오.

감사합니다.

+0

여기 다른 사람의 연구 http://longweekendmobile.com/2010/07/22/iphone-background-gps-accurate-to-500-meters-not-enough-for-foot-traffic/ 언급 "CLLocationManager에는 매우 짧은 시간에 여러 이벤트를보고하는 경향이 있습니다. 백그라운드에서 (10 초 미만) ... 두 번째 이벤트는 첫 번째 이벤트 인 " –

+0

"보다 훨씬 정확합니다. 거기에 몇 가지 매우 유용한 정보가있었습니다. 그들은 그 위치가 배경에서 얻을 때 500m까지 정확하다는 것을 언급했지만 그것은 당신이 사는 도시에 달려 있습니다. 브라질의 브라질리아에서 내 응용 프로그램을 테스트 해봤는데 지금까지 얻은 최고의 정확도는 1200m이었습니다. –

답변

11

CLLocationManager 의해 반환 위치의 정확도는 기본적으로 kCLLocationAccuracyBest되고 장치의 가능한 정확도로 desiredAccuracy에 의해 결정된다. 예를 들어 기기의 배터리가 부족하면 위치가 정확하지 않을 수 있으며 다른 앱에서 캐시 된 경우 정확한 위치를 얻을 수 있습니다.

그러나 엄청나게 정확한 좌표를 얻으면 배터리에서 상당한 양의 전력이 소모되어 장치가 방전됩니다. 백그라운드에서의 어플리케이션은 아마도 배터리 성능을 향상시키기 위해 훨씬 더 낮은 정확도의 해상도로 제한됩니다.

정확한 위치는 GPS 무선을 사용하기 위해 많은 전력을 필요로하지만 정확하지 않은 위치는 근처의 무선 핫스팟 및 휴대 전화 범위 내의 셀 타워에 의존 할 수 있습니다.

응용 프로그램이 백그라운드에서 다시 시작되면 시스템에서 얻는 결과의 정확도를 높이려고합니다. 까다로운 개념이지만 휴대 전화에서지도 애플리케이션을 살펴보십시오. 처음에는 내 위치를 나타내는 원이 매우 큽니다. 시스템이 더 정확한 위치 감각을 갖게되면 원이 작아집니다. 이 시각화는보다 정확한 위치를 얻기 위해 더 많은 전력을 사용하는 전화를 나타냅니다.

CLLocationManager과 비슷한 현상이 나타날 수 있습니다. 백그라운드에서 앱을 다시 시작하면 정확하지 않은 위치 정보가 표시되어 더 정확한 업데이트를받을 수 있습니다.

애플이 API를 디자인 할 때 편리함과 배터리 수명 사이의 절충안이다. 사용자의 위치에 대한 첫 번째 업데이트는지도 애플리케이션을 사용하고 위치가 캐시되지 않은 한 정확하지 않을 수 있습니다.

내가 줄 수있는 최선의 조언은 위치 관리자로부터 이후 업데이트를 수신하고 그에 따라 UI를 업데이트하는 것입니다. 행운을 빕니다!

9

이름으로 : startMonitoringSignificantLocationChanges 알림은 사용자의 위치가 마지막으로 확인 된 위치와 크게 다르다는 것을 알려주는 것입니다. 원하는 정확도에 따라 위치를 업데이트하라는 통지를받을 때 귀하의 업무입니다. 통지는 귀하를 대신하지 않습니다.상황이 적절하게 처리 될 수 있도록 위치가 변경되었음을 알려드립니다. 더 나은 정확도를 얻는 방법을 모르는 경우 LocateMe에 대한 Apple 샘플 코드를 확인하는 것이 좋습니다. 정확성을 저장하는 스 니펫 (bestEffortAtLocation)을 사용하면 더 나은 결과가 올 때까지 대리인이 호출 될 때마다 정확성을 테스트합니다 그래서

http://developer.apple.com/library/ios/#samplecode/LocateMe/Introduction/Intro.html#//apple_ref/doc/uid/DTS40007801-Intro-DontLinkElementID_2

당신은 통지 및 필요성을 얻을 :이 코드 조각들이 샘플 코드 LocateMe에서 직접하기 때문에 또는 시간 초과가 발생 :

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { 
    // store all of the measurements, just so we can see what kind of data we might receive 
    [locationMeasurements addObject:newLocation]; 
    // test the age of the location measurement to determine if the measurement is cached 
    // in most cases you will not want to rely on cached measurements 
    NSTimeInterval locationAge = -[newLocation.timestamp timeIntervalSinceNow]; 
    if (locationAge > 5.0) return; 
    // test that the horizontal accuracy does not indicate an invalid measurement 
    if (newLocation.horizontalAccuracy < 0) return; 
    // test the measurement to see if it is more accurate than the previous measurement 
    if (bestEffortAtLocation == nil || bestEffortAtLocation.horizontalAccuracy > newLocation.horizontalAccuracy) { 
     // store the location as the "best effort" 
     self.bestEffortAtLocation = newLocation; 
     // test the measurement to see if it meets the desired accuracy 
     // 
     // IMPORTANT!!! kCLLocationAccuracyBest should not be used for comparison with location coordinate or altitidue 
     // accuracy because it is a negative value. Instead, compare against some predetermined "real" measure of 
     // acceptable accuracy, or depend on the timeout to stop updating. This sample depends on the timeout. 
     // 
     if (newLocation.horizontalAccuracy <= locationManager.desiredAccuracy) { 
      // we have a measurement that meets our requirements, so we can stop updating the location 
      // 
      // IMPORTANT!!! Minimize power usage by stopping the location manager as soon as possible. 
      // 
      [self stopUpdatingLocation:NSLocalizedString(@"Acquired Location", @"Acquired Location")]; 
      // we can also cancel our previous performSelector:withObject:afterDelay: - it's no longer necessary 
      [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(stopUpdatingLocation:) object:nil]; 
     } 
    } 
    // update the display with the new location data 
} 

신용 애플로 이동 더 나은 결과를 얻으려면 정확도를 업데이트하고 더 나은 결과를 얻을 수 있는지 확인해야합니다. 티.

+0

Hubert, 답장을 보내 주셔서 감사합니다. 이것은 실제로 내 응용 프로그램에서 사용하고있는 정확한 코드이며, 응용 프로그램을 실행하면 잘 작동합니다. 그러나 배경에 놓고 볼 때 대리인이 호출 될 때마다 정확성을 테스트하지만 그 정확성은 항상 나쁜 것입니다. 애쉬가 여기 아래로 말한 것이 옳다고 생각합니다. 앱이 백그라운드에있을 때 휴대 전화는 배터리를 절약하기 위해 GPS를 사용하여 위치를 검색하지 않으며 휴대 전화 기지국에서만받은 위치의 정확도는 적어도 내 도시에서는 좋지 않습니다. 어쩌면 더 많은 셀 타워가있는 도시에서이 정확도가 조금 더 좋을 수도 있습니다. –

+0

내 조언이 도움이 되었기 때문에 기쁘게 생각합니다. 답변을 수락 된 대답으로 표시하는 것이 좋습니다. –

관련 문제