这是我在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模拟器和设备中工作。
是什么原因?
答案 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。