2010-06-17 8 views
12

Đây là mã mà tôi có trong appdelegate Lớp tôiTại sao đại biểu CLLocationManager không nhận được gọi trong iPhone SDK 4.0?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    CLLocationManager *locationManager = [[CLLocationManager alloc] init]; 
    locationManager.delegate = self; 
    locationManager.distanceFilter = 1000; // 1 Km 
    locationManager.desiredAccuracy = kCLLocationAccuracyKilometer; 
    [locationManager startUpdatingLocation]; 
} 

Và đây là phương pháp đại biểu tôi có trong appdelegate Lớp tôi

//This is the delegate method for CoreLocation 
- (void)locationManager:(CLLocationManager *)manager 
    didUpdateToLocation:(CLLocation *)newLocation 
      fromLocation:(CLLocation *)oldLocation 
{ 

     //printf("AppDelegate latitude %+.6f, longitude %+.6f\n", newLocation.coordinate.latitude, newLocation.coordinate.longitude); 

} 

của nó làm việc trong 3.0, 3.1, 3.1.3, nhưng nó không hoạt động trong trình mô phỏng 4.0 và cả hai thiết bị.

Lý do là gì?

+0

Cảm ơn @Scott Christopherson về một số cách tiếp cận tích cực ..... nhưng chúng tôi vẫn trở thành con rối và phải thay đổi mã của chúng tôi mỗi khi có bản phát hành SDK iPhone mới. Luôn tìm một số phương pháp không được chấp nhận hoặc không hoạt động ... – Biranchi

+0

Cảm ơn @Scott Christopherson hãy bỏ phiếu để đóng câu hỏi này .... vì không ai có thể giải quyết vấn đề này ... – Biranchi

+0

Đối mặt với cùng một vấn đề ở đây, bạn có chắc là phải mất khoảng 40 giây để cập nhật vị trí? –

Trả lời

21

Tôi đã gặp lỗi tương tự và được giải quyết ngay bây giờ. Vấn đề là tuyên bố biến locationManager cục bộ. Thay vào đó, hãy khai báo nó như là một biến lớp và đảm bảo nó được giữ lại trực tiếp hoặc thông qua việc giữ lại thuộc tính (hoặc mạnh nếu bạn sử dụng ARC). Điều đó giải quyết vấn đề! Vấn đề là de locationManager biến được phát hành và không bao giờ cập nhật các đại biểu. Đây mã:

.h file:

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 
#import <CoreLocation/CoreLocation.h> 


@interface MapViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> { 
@private 
    MKMapView *_mapView; 
    CLLocationManager *_locationManager; 
} 

@property(nonatomic, strong) CLLocationManager *locationManager; 

@end 

tập tin .m:

self.locationManager = [[CLLocationManager alloc] init]; 
_locationManager.delegate = self; 
_locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
[_locationManager startUpdatingLocation]; 

Tôi hy vọng nó giúp.

0

Bạn có chắc chắn không giải quyết được người quản lý vị trí ở đâu đó không? Mã bạn đã cho thấy nó đang được phân bổ trong phương thức didFinishLaunching ... nhưng sau đó bị lãng quên (mặc dù nó vẫn được giữ lại và do đó vẫn hoạt động).

Thậm chí bạn có thấy cửa sổ bật lên ban đầu hỏi bạn có OK để nhận vị trí người dùng không?

+0

có cố gắng mọi giải pháp có thể .... tôi có cần phải cài đặt lại SDK SDK không ??? ? – Biranchi

2

-locationManager:didFailWithError: trong đại biểu của bạn từng được gọi? Tôi chỉ nghĩ, có thể bạn đã từ chối truy cập vào dữ liệu vị trí tại một số điểm và bây giờ không được nhắc, nhưng quyền truy cập bị từ chối.

0

Đặt mã trong chế độ xemController "được đẩy vào navigationController".

Mã của tôi là.

Trong SomeViewController.h

#import <MapKit/MapKit.h> 
@interface SomeViewController : UIViewController<CLLocationManagerDelegate>{ 
} 
@property (nonatomic, strong) CLLocationManager *locationManager; 
@end 

Trong SomeViewController.m

#import "SomeViewController.h" 

@implementation SomeViewController 


-(void)findLocation{ 
    if ([CLLocationManager locationServicesEnabled]) { 
     if (!self.locationManager) { 
      self.locationManager = [[CLLocationManager alloc] init]; 
      self.locationManager.delegate = self; 
      self.locationManager.distanceFilter = kCLDistanceFilterNone; 
      self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
      [self.locationManager startUpdatingLocation]; 
     } 
    } 
} 
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{ 
    NSLog(@"didUpdateLocations"); 

    CLLocation *lo = [locations objectAtIndex:0]; 
    NSLog(@"latitude = %f, longitude = %f", lo.coordinate.latitude, lo.coordinate.longitude); 

    [manager stopUpdatingHeading]; 
} 
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 
    NSLog(@"didUpdateToLocation");} 
-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ 
    NSLog(@"didFailWithError"); 
    [manager stopUpdatingLocation]; 
} 

Vấn đề tôi nghĩ là vì ARC, locationManager được phát hành.