2011-02-02 18 views
10

Trước khi lên iOS 4.0, CoreLocation được báo cáo độ cao một cách chính xác, bây giờ nó luôn báo cáo là 0 ft.iOS CoreLocation Altitude

-(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]; 
} 

Không làm việc trên thiết bị cũng không Simulator, không ai kinh nghiệm vấn đề này?

+0

Bạn có đang thử nghiệm điều này trên thiết bị hoặc trên Trình mô phỏng không? –

+0

Thiết bị và Trình mô phỏng. – WrightsCS

Trả lời

11

Nếu bạn đang sử dụng startMonitoringSignificantLocationChanges, một tính năng mới cho iOS 4.0, thì bạn sẽ không nhận được cập nhật độ cao. Chế độ năng lượng thấp này chỉ sử dụng các tháp di động để tìm ra vị trí của người dùng và phương pháp này không báo cáo độ cao.

Nói chung, iPhone có ba cách để tìm ra vị trí của bạn - tháp di động, wi-fi và GPS. Bạn sẽ chỉ nhận được độ cao khi GPS đang được sử dụng. Vì vậy, ngay cả khi bạn đặt cài đặt desiredAccuracy của mình thực sự chính xác để buộc thiết bị sử dụng GPS, nếu người dùng ở trong nhà thì iPhone có thể sẽ không thể nhận tín hiệu GPS và sẽ dự phòng thành di động hoặc wi-fi. Trong trường hợp đó, bạn sẽ không nhận được độ cao. Cũng xem xét những người dùng đang sử dụng iPod Touch - nó chỉ có khả năng nhận vị trí qua wi-fi và do đó cũng sẽ không báo cáo độ cao.

1

Từ Core Location Data Types Reference:

Các CLLocationDistance kiểu dữ liệu (kiểu dữ liệu cho độ cao) là một double. Trình định dạng bạn đang sử dụng cho số stringWithFormat của mình là integer. Bạn cần phải đúc độ cao của mình thành một integer, trước tiên hoặc sử dụng trình định dạng double (% f).

+0

Tôi đang chuyển đổi độ cao thành số nguyên. Như tôi đã nói, điều này hoạt động hoàn hảo (ví dụ: không có mã nào thay đổi) trước iOS 4.0. – WrightsCS

+0

Ngoài ra, cách tôi có nó/đã cho/tôi độ cao hoàn hảo, được sử dụng để hiển thị ví dụ 5280 ft – WrightsCS

+0

@WrightsCS bạn đã thử định dạng kép như được đề xuất để xem liệu điều đó có tạo nên sự khác biệt không? – raidfive

1

Hai điều bạn có thể thử. Trước hết, hãy thử đặt desiredAccuracy của trình quản lý vị trí thành kCLLocationAccuracyBest.

Nếu cách này không hiệu quả, hãy thử xóa [manager stopUpdatingLocation]; và đặt NSLog trong didUpdateToLocation bằng độ cao. Đôi khi nó cần phải thu hẹp một chút trước khi nó hiển thị độ cao.

+0

kCLLocationAccuracyBest luôn được đặt và việc xóa stopUpdatingLocation không có hiệu lực. – WrightsCS

0

Vị trí chính không phải lúc nào cũng báo cáo độ cao ngay lập tức. Tôi thường kiểm tra độ cao bằng không trong phương thức ủy nhiệm "thành công" của tôi. Nếu độ cao vẫn là 0, tôi tiếp tục kiểm tra, nếu không, tôi sẽ bật CoreLocation.

Các vấn đề liên quan