Los methods de delegado de la location principal no reciben llamadas en iOS 8.3 Xcode 6.3.1

Estoy tratando de get la location actual del usuario utilizando el Marco de location principal en Xcode 6.3.1, hice lo siguiente:

  1. Se agregó el marco de location principal en Target -> General -> Frameworks y bibliotecas vinculadas
  2. Mi file ViewController.h es como se muestra a continuación,

    #import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> @interface ViewController : UIViewController<CLLocationManagerDelegate> @property (weak, nonatomic) IBOutlet UILabel *lblLatitude; @property (weak, nonatomic) IBOutlet UILabel *lblLongitude; @property (weak, nonatomic) IBOutlet UILabel *lblAddress; @property (strong, nonatomic) CLLocationManager *locationManager; @end 
  3. Mi file ViewController.m es como se muestra a continuación,

     - (void)viewDidLoad { [super viewDidLoad]; self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; if(IS_OS_8_OR_LATER){ NSUInteger code = [CLLocationManager authorizationStatus]; if (code == kCLAuthorizationStatusNotDetermined && ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)] || [self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)])) { if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationAlwaysUsageDescription"]){ [self.locationManager requestAlwaysAuthorization]; } else if([[NSBundle mainBundle] objectForInfoDictionaryKey:@"NSLocationWhenInUseUsageDescription"]) { [self.locationManager requestWhenInUseAuthorization]; } else { NSLog(@"Info.plist does not contain NSLocationAlwaysUsageDescription or NSLocationWhenInUseUsageDescription"); } } } [self.locationManager startUpdatingLocation]; } #pragma mark - CLLocationManagerDelegate - (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { NSLog(@"didFailWithError: %@", error); UIAlertView *errorAlert = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Failed to Get Your Location" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [errorAlert show]; } - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { NSLog(@"didUpdateToLocation: %@", newLocation); CLLocation *currentLocation = newLocation; if (currentLocation != nil) { lblLatitude.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.longitude]; lblLongitude.text = [NSString stringWithFormat:@"%.8f", currentLocation.coordinate.latitude]; } } @end 

También había agregado las siguientes keys en mi file info.plist

  • NSLocationWhenInUseUsageDescription
  • NSLocationAlwaysUsageDescription

imagen de plist

Comprobó todo lo que se ofrece aquí , aquí , aquí , y mucho más

Entonces, ¿hay alguien que tenga una solución para este problema, amablemente ayuda? Perdí la cabeza buscando esto durante todo el día.

    ¡Sí! Tengo la solución, aquí está mi código completo y las cosas agregadas para que funcione. Un agradecimiento especial a @MBarton por su gran ayuda. También gracias a @ Vinh Nguyen por invertir su precioso time en resolver mi problema.

    Se agregó el Marco de location principal en Target-> General-> Marcos y bibliotecas vinculados

    Agregado en el file .plist

     NSLocationAlwaysUsageDescription 

    Ver Captura de pantalla:

    captura de pantalla

    En mi ViewController.h

     #import <UIKit/UIKit.h> #import <MapKit/MapKit.h> #import <MapKit/MKAnnotation.h> // #define IS_OS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) @interface ViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate> { __weak IBOutlet UINavigationItem *navigationItem; } @property (weak, nonatomic) IBOutlet MKMapView *mapView; @property(nonatomic, retain) CLLocationManager *locationManager; @end 

    Luego en ViewController.m

     #import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize mapView; - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. [self setUpMap]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } -(void)setUpMap { mapView.delegate = self; self.locationManager = [[CLLocationManager alloc] init]; self.locationManager.delegate = self; #ifdef __IPHONE_8_0 // if(IS_OS_8_OR_LATER) { if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { // Use one or the other, not both. Depending on what you put in info.plist [self.locationManager requestAlwaysAuthorization]; } #endif [self.locationManager startUpdatingLocation]; mapView.showsUserLocation = YES; [mapView setMapType:MKMapTypeStandard]; [mapView setZoomEnabled:YES]; [mapView setScrollEnabled:YES]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:YES]; self.locationManager.distanceFilter = kCLDistanceFilterNone; self.locationManager.desinetworkingAccuracy = kCLLocationAccuracyBest; [self.locationManager startUpdatingLocation]; NSLog(@"%@", [self deviceLocation]); //View Area MKCoordinateRegion region = { { 0.0, 0.0 }, { 0.0, 0.0 } }; region.center.latitude = self.locationManager.location.coordinate.latitude; region.center.longitude = self.locationManager.location.coordinate.longitude; region.span.longitudeDelta = 0.005f; region.span.longitudeDelta = 0.005f; [mapView setRegion:region animated:YES]; } - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(userLocation.coordinate, 800, 800); [self.mapView setRegion:[self.mapView regionThatFits:region] animated:YES]; } - (NSString *)deviceLocation { return [NSString stringWithFormat:@"latitude: %f longitude: %f", self.locationManager.location.coordinate.latitude, self.locationManager.location.coordinate.longitude]; } 

    ¡Ufff …! Tengo la solución después de luchar con muchos códigos desde los últimos 5 días …