2011-02-02 6 views
10

iOS 4.0 버전 이전에, CoreLocation가 제대로 고도를보고했다, 지금은 항상 0피트로보고합니다. 는 아이폰 OS CoreLocation 고도

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation*)newLocation fromLocation:(CLLocation *)oldLocation 
{ 
    NSString *tLatitude = [NSString stringWithFormat:@"%3.5f", newLocation.coordinate.latitude]; 
    NSString *tLongitude = [NSString stringWithFormat:@"%3.5f", newLocation.coordinate.longitude]; 
    /* the following returns 0 */ 
    NSString *tAltitude = [NSString stringWithFormat:@"%i", newLocation.altitude]; 

    /* theres more code, but it's not relevant, 
         and this worked prior to iOS 4.0*/ 
    [manager stopUpdatingLocation]; 
} 

이 장치도 시뮬레이터 작동하지, 다른 사람의 경험은이 문제입니까? Core Location Data Types Reference 가입일

+0

기기 또는 시뮬레이터에서 테스트 중이십니까? –

+0

장치 및 시뮬레이터. – WrightsCS

답변

11

iOS 4.0에 새로운 기능인 startMonitoringSignificantLocationChanges을 사용하는 경우 고도 업데이트가 제공되지 않습니다. 이 저전력 모드는 셀 타워를 사용하여 사용자의 위치를 ​​파악하기 만하며이 방법은 고도를보고하지 않습니다.

더 일반적으로 iPhone에는 셀 타워, Wi-Fi, GPS 등 내 위치를 파악하는 세 가지 방법이 있습니다. GPS를 사용할 때만 고도가 표시됩니다. 따라서 사용자가 desiredAccuracy 설정을 사용하여 기기가 GPS를 사용하도록 강제 설정하는 경우에도 사용자가 실내에있을 경우 iPhone에서 GPS 신호를 수신하지 못하고 셀 또는 Wi-Fi로 폴백 할 수 있습니다. 이 경우, 고도는 알 수 없습니다. 또한 iPod Touch를 사용하는 사용자를 고려해보십시오. Wi-Fi를 통해 위치 정보를 얻는 기능 만 있으므로 고도를보고하지 않습니다.

1

:

CLLocationDistance 데이터 타입 (고도 데이터 유형)가 double이다. stringWithFormat에 사용하는 포맷터는 integer입니다. 먼저 integer으로 표고를 캐스팅하거나 double (% f) 포맷터를 사용해야합니다.

+0

고도를 정수로 변환 중입니다. 앞에서 말했듯이, iOS 4.0 이전에는 이것이 완벽하게 작동했습니다 (즉, 코드가 변경되지 않았습니다). – WrightsCS

+0

또한, 내가 가지고있는 방법/준 완벽한 고도, 예를 들어 5280 피트 – WrightsCS

+0

@ WrightsCS 표시하는 데 사용되는 차이가 있는지 보려면 제안 된대로 더블 포맷터를 시도 해 봤나? – raidfive

1

시도 할 수있는 두 가지. 먼저 위치 관리자의 desiredAccuracykCLLocationAccuracyBest으로 설정하십시오.

그래도 작동하지 않으면 [manager stopUpdatingLocation];을 제거하고 NSLog을 고도와 함께 didUpdateToLocation에 넣으십시오. 때로는 고도를 표시하기 전에 조금 좁혀 야합니다.

+0

kCLLocationAccuracyBest가 항상 설정되었으며 stopUpdatingLocation을 제거해도 아무런 효과가 없습니다. – WrightsCS

0

코어 위치가 항상 고도를보고하는 것은 아닙니다. 보통 "성공"대리자 메서드에서 제로 고도를 확인합니다. 고도가 여전히 0이면 계속 확인하고, 그렇지 않으면 CoreLocation을 사용합니다.