2010-06-17 95 views
12

這是我的代碼在我AppDelegate類爲什麼在iPhone SDK 4.0中未調用CLLocationManager委託?

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

這是委託方法我在我的AppDelegate類

//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); 

} 

其在3.0工作,3.1,3.1.3,但它不適用於4.0模擬器和設備。

是什麼原因?

+0

感謝@Scott Christopherson提供了一些積極的方法.....但是我們仍然成爲木偶,每次有新的iPhone SDK發佈時都必須更改我們的代碼。總是會發現某些方法已被棄用或無法正常工作... – Biranchi 2010-06-17 05:07:13

+0

Thanks @Scott Christopherson請投票結束這個問題....因爲沒有人可以解決這個問題... – Biranchi 2010-06-17 05:08:34

+0

面對同樣的問題,你確定需要40秒才能更新位置嗎? – 2010-07-08 06:03:14

回答

21

我有一個類似的錯誤,現在就解決了。問題是在本地聲明locationManager變量。將其聲明爲類變量,並確保它直接保留或通過屬性保留(或者如果使用ARC,則保留更強)。解決了這個問題!問題是de locationManager變量被釋放並且從未更新委託。下面的代碼:

.h文件中:

#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 

.m文件:

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

我希望它能幫助。

0

你確定你沒有在某處釋放位置管理器嗎?你所擁有的代碼顯示它被分配在didFinishLaunching ...方法中,但卻被遺忘了(雖然它仍然保留,所以仍然可以工作)。

你甚至可以看到最初的彈出窗口詢問你是否可以獲取用戶位置?

+0

是的嘗試了所有可能的解決方案.... 我需要重新安裝iPhone SDK嗎? ? – Biranchi 2010-06-17 05:09:47

2

您的委託中有沒有-locationManager:didFailWithError:被叫?我只是在想,也許你在某個時候拒絕了對位置數據的訪問,現在沒有得到提示,但訪問被拒絕。

0

將代碼放入一個viewController「,它被推送到navigationController」。

我的代碼是。

在SomeViewController.h

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

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

我認爲這個問題是因爲ARC的,的LocationManager被釋放。

相關問題