Почему делегат CLLocationManager не получает вызов в iPhone SDK 4.0?
Это код, который у меня есть в классе AppDelegate
- (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 симуляторе и устройстве.
В чем причина?
Ответы
Ответ 1
У меня была аналогичная ошибка, и она решена сейчас. Проблема заключается в том, что локальная переменная locationManager объявляется локально. Вместо этого объявляйте его как переменную класса и убедитесь, что он сохраняется либо напрямую, либо через свойство сохраняет (или сильный, если вы используете ARC). Это решает проблему! Проблема заключалась в том, что переменная 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 file:
self.locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[_locationManager startUpdatingLocation];
Надеюсь, это поможет.
Ответ 2
Вызывается ли -locationManager:didFailWithError:
в вашем делетете? Я просто думаю, может быть, вы в какой-то момент отказали в доступе к данным о местоположении и теперь не получите запрос, но доступ запрещен.
Ответ 3
Вы уверены, что вы не освобождаете менеджера местоположений? Код, который у вас есть, показывает, что он выделяется в методе didFinishLaunching..., но затем забывается (хотя он все еще сохраняется и поэтому должен работать).
Вы даже видите, что начальное всплывающее окно спрашивает вас, правильно ли это получить местоположение пользователя?
Ответ 4
Поместите коды в 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 выпущен.