Подтвердить что ты не робот

Почему делегат 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 симуляторе и устройстве.

В чем причина?

4b9b3361

Ответ 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 выпущен.