2014-11-17 4 views
0

Я пытаюсь использовать основное расположение в симуляторе iOS 8, для чего я добавил на мой взгляд объект типа 'MapKit View', на вкладке проверен инспектор Atributtes вариант show user location, В моем проекте я использую ARC, ниже структура моего кода:Расположение ядра не запрашивается у Пользователя и методы не вызываются

ViewController.h

#import <UIKit/UIKit.h> 
#import <CoreLocation/CoreLocation.h> 
#import <MapKit/MapKit.h> 

@interface MeuPrimeiroViewController : UIViewController <MKMapViewDelegate, CLLocationManagerDelegate>{ 

    IBOutlet MKMapView *mapView; 
} 


@property (nonatomic, strong) CLLocationManager *locationManager; 

@end 

ViewContr oller.m

@synthesize locationManager; 

    - (void)viewDidLoad { 
     [super viewDidLoad]; 

    if ([CLLocationManager locationServicesEnabled]) { 

      NSLog(@"CLLocationManager locationServicesEnabled == ON"); 

      locationManager = [[CLLocationManager alloc] init]; 
      locationManager.delegate = self; 

      locationManager.distanceFilter = kCLDistanceFilterNone; 
      locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

      // Check for iOS 8 Vs earlier version like iOS7.Otherwise code will 
      // crash on ios 7 
      if ([locationManager respondsToSelector:@selector 
       (requestWhenInUseAuthorization)]) { 
       [locationManager requestAlwaysAuthorization]; 
      } 

      [locationManager startUpdatingLocation]; 




     }else{ 

      NSLog(@"CLLocationManager locationServicesEnabled == OFF"); 
     } 


    } 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{ 

    NSLog(@"It works this method is called"); 

} 

-(void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{ 

    NSLog(@"Error: %@",[error description]); 

} 

В моей info.plist файле добавить этот ключ (NSLocationAlwaysUsageDescription) с этим значением (String).

Если я иду атрибуты инспектора и установите флажок (показывает местоположение пользователя) я получаю сообщение об ошибке, и метода ядра местоположения не называет:

Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first. 

Если отключить флажок, это сообщение исчезнет, и методы определения местоположения снова не вызываются. Я пытаюсь изменить навигацию на londom, попробуйте изменить местоположение на free run, но ничего, что я пробовал, работал, методы не продолжают вызываться и никогда не показывали сообщение с полномочиями для использования основного местоположения. Я считаю, что я уже пробовал все, у кого есть какие-либо предложения или решение этой проблемы?

+0

Я думаю, что вам нужно еще одну запись в файле Info.plist, NSLocationWhenInUseUsageDescription. Кроме того, для статуса авторизации iOS 8 должно быть kCLAuthorizationStatusAuthorizedAlways – Puran

+0

Well @Puran Я добавляю эти ключи, и теперь у меня есть info.plist, есть 3 ключа (NSLocationWhenInUseUsageDescription., KCLAuthorizationStatusAuthorizedAlways, NSLocationAlwaysUsageDescription), я пытаюсь включить и отключить отображение местоположения пользователя и не работать , больше? –

+0

добавил код, который я использую ниже. Также kCLAuthorizationStatusAuthorizedAlways не обязательно должен быть в Info.plist, это просто тип авторизации – Puran

ответ

0

Это то, что я делаю для моего приложения и прекрасно работает

- (void)startSignificantChangeUpdates { 
    if (nil == self.locationManager) { 
     self.locationManager = [[CLLocationManager alloc] init]; 
    } 
    self.locationManager.delegate = self; 
    [self.locationManager startMonitoringSignificantLocationChanges]; 
} 

- (void)locationManager:(CLLocationManager *)manager 
    didUpdateLocations:(NSArray *)locations { 
    CLLocation* location = [locations lastObject]; 
    if (location) { 
     self.currentLocation = location; 
     NSString *latitude = [NSString stringWithFormat:@"%f", location.coordinate.latitude]; 
     NSString *longitude = [NSString stringWithFormat:@"%f", location.coordinate.longitude]; 

     self.latLong = [NSString stringWithFormat:@"%@,%@",latitude, longitude]; 
    } 
    if (!self.geocoder) 
     self.geocoder = [[CLGeocoder alloc] init]; 

    [self.geocoder reverseGeocodeLocation:location completionHandler: 
    ^(NSArray* placemarks, NSError* error){ 
     if ([placemarks count] > 0) { 
      CLPlacemark *placemark = [placemarks objectAtIndex:0]; 
      if (placemark.postalCode) { 
       self.currentZipCode = placemark.postalCode; 
      } 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"zipCodeFoundNotification" object:self.currentZipCode userInfo:nil]; 
     } else { 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"zipCodeFoundNotification" object:nil userInfo:nil]; 
     } 
    }]; 
} 

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 
    if (status != kCLAuthorizationStatusAuthorized && status != kCLAuthorizationStatusNotDetermined) { 
     if (status == kCLAuthorizationStatusDenied){ 
      self.currentZipCode = @"kCLAuthorizationStatusDenied"; 
     } else if (status == kCLAuthorizationStatusRestricted) { 
      self.currentZipCode = @"kCLAuthorizationStatusRestricted"; 
     } 
    } 
} 
Смежные вопросы