为什么在iPhone SDK 4.0中没有调用CLLocationManager委托?

时间:2010-06-17 04:45:35

标签: iphone core-location cllocationmanager cllocation

这是我在AppDelegate Class

中的代码
- (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 Class中的委托方法

    //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模拟器和设备中工作。

是什么原因?

5 个答案:

答案 0 :(得分: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];

我希望它有所帮助。

答案 1 :(得分:2)

您的代理中的-locationManager:didFailWithError:是否会被调用?我只是想,也许你在某个时候拒绝访问位置数据,现在没有得到提示,但访问被拒绝。

答案 2 :(得分:1)

我很疯狂,试图弄清楚为什么只有几个使用CLLocationManager的类中的一个永远无法调用CLLocationManagerDelegate方法的 any

事实证明:该类是从非主线程初始化的,因此它的CLLocationManager是在非主线程上创建的……它甚至可能是一个临时线程。无论如何,用下面的代码包装初始化我的类的调用就是让我的CLLocationManager委托方法被调用的全部过程。

pip install numpy --upgrade

因此,最重要的是:不要在主线程以外的任何对象上创建CLLocationManager,否则您将永远无法调用委托方法!我曾经知道这一点……很久了……感叹。浪费了一天才能再次解决这个问题!由于我阅读的所有CLLocationManager SO都没有提出来,因此我将其张贴在这里。希望它能对某人有所帮助!

答案 3 :(得分:0)

你确定你没有在位置取消分配位置管理器吗?您所拥有的代码显示它是在didFinishLaunching ...方法中分配的,但后来却被遗忘了(虽然它仍然保留,因此仍然可以使用)。

您是否看到初始弹出窗口询问您是否可以获取用户位置?

答案 4 :(得分: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。