2012-05-24 24 views
5

Hiện tại, đang phát triển một ứng dụng cần có vị trí cuối cùng từ CLLocationManager (không cần theo dõi thường xuyên). Nó không quan trọng bao nhiêu tuổi, chính xác. Tôi không cần và muốn bắt đầu theo dõi - tôi chỉ cần lấy một số vị trí cuối cùng từ một bộ nhớ cache và đó là nó. IMHO, CLLocationManager là một thành phần được chia sẻ trong iOS và nếu một số ứng dụng sử dụng theo dõi vị trí thì một ứng dụng khác sẽ có thể sử dụng vị trí gần đây nhất từ ​​CLLocationManager.location. Nó chỉ đủ để cấp phát/init CLLocationManager và lấy vị trí của nó. Tuy nhiên nó không phải. Tôi đã thử nghiệm trên iPhone4 - bắt đầu bản đồ google, thấy vị trí hiện tại của tôi, sau đó đi đến ứng dụng của tôi, nhưng sau khi [[CLLocationManager alloc] init] thuộc tính vị trí là 0.Nếu ứng dụng bắt đầu theo dõi vị trí để có được BẤT CỨ vị trí đã biết cuối cùng của CLLocationManager?

CẬP NHẬT: đã thử [locationManager startUpdatingLocation]; và [locationManager stopUpdatingLocation]; nhưng kết quả là như nhau. Tôi đoán, giải pháp duy nhất là bắt đầu theo dõi thường xuyên?

UPDATE2: Lạ nhưng không có cảnh báo với "Ứng dụng muốn sử dụng dịch vụ vị trí" sau khi phân bổ/init của CLLocationManager. Đây là đoạn mã của tôi:

CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 

[locationManager startUpdatingLocation]; 
[locationManager stopUpdatingLocation]; 
NSLog(@"%@", locationManager.location); //prints nil 
+0

tôi khuyên bạn nên nhìn vào [Làm thế nào để tìm vị trí hiện tại của bạn với CoreLocation] (http://stackoverflow.com/questions/6516967/how-to-find- vị trí hiện tại của bạn với vị trí corelocation) và lưu trữ vị trí được tìm thấy trong một 'NSArray'. –

Trả lời

2

Trước tiên, bạn nên kiểm tra xem vị trí của bạn có được lưu trước là 'tĩnh' không.

Nếu có, bạn đã hoàn tất.

Nếu không, bạn nên startUpdatingLocation và sau đó, trong gọi lại didUpdateToLocation:fromLocation:, stopUpdatingLocation khi bạn nhận được vị trí.

Trải nghiệm của tôi nói đó là cách tốt nhất để chỉ có một vị trí.

CẬP NHẬT để phù hợp với CẬP NHẬT TÁC GIẢ:

Bạn không nên stopUpdatingLocation ngay sau startUpdatingLocation. startUpdatingLocation bắt đầu một dịch vụ ở chế độ nền, vì vậy bạn nên đợi cho đến khi bạn nhận được một vị trí, vì vậy hãy lập hoá đơn cho nó theo các phương thức gọi lại.

+0

Bạn có ý nghĩa gì về vị trí 'tĩnh'? Nếu tôi đi đến bản đồ google và có thể nhìn thấy vị trí hiện tại của tôi thì nên được coi là vị trí tĩnh? Bản đồ của Google chắc chắn sử dụng dịch vụ định vị, do đó, phải có ít nhất một vị trí tĩnh trong CLLocationManager sau đó. – Centurion

+0

Tôi có nghĩa là một vị trí mà ứng dụng của bạn không nhận được thông qua cuộc gọi lại 'didUpdateToLocation: fromLocation:'. Và có, Google Maps sử dụng dịch vụ vị trí, nhưng nó không đảm bảo rằng ứng dụng của bạn có thể nhận được vị trí thu được bởi bất kỳ ứng dụng nào khác. – sonxurxo

+1

Nhân tiện, tôi chắc chắn 99% cảnh báo sẽ xuất hiện khi bạn bắt đầu ** bằng ** locationManager, không phải khi bạn phân bổ và khởi động nó. – sonxurxo

1

Để sử dụng bất kỳ CLLocationManager nào, bạn cần triển khai CLLocationManagerDelegate ở đâu đó.

-[CLLocationManager startUpdatingLocation] bắt đầu quá trình không đồng bộ. Nếu bạn dừng nó trong cùng chu kỳ runloop, quá trình sẽ không bao giờ được bắt đầu và đó là lý do bạn không bao giờ thấy hộp thoại cho phép.

Nó đi một cái gì đó như thế này:

@interface MyClass : NSObject <CLLocationManagerDelegate> { 
    CLLocationManager *manager; 
    CLLocation *lastLocation; 
} 

@end 

@implementation 

- (id)init { 
    self = [super init]; 
    if (self) { 
     manager = [[CLLocationManager alloc] init]; 
     manager.delegate = self; 
     [manager startUpdatingLocation]; 
    } 
    return self; 
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation; 
{ 
    lastLocation = newLocation; 
    [manager stopUpdatingLocation]; 
} 

// in your real implementation be sure to handle the error cases as well. 
@end 
Các vấn đề liên quan