iOS 8 Ошибка при запросе авторизации

У меня большие проблемы с запросом авторизации службы определения местоположения. Я знаю, что на этом форуме есть и другие сообщения, но я не решил свою проблему с их решением.

Это ошибка, возникающая в xCode:

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

Я добавил оба необходимых ключа для Plist.

Еще один важный момент заключается в том, что когда я запускаю его в симуляторе, я могу вручную зайти в настройки и включить службы определения местоположения, и тогда приложение заработает. Однако, когда я перезапускаю приложение, оно не работает, и я получаю то же сообщение, что и выше.

Я хочу предложить пользователю возможность включить службы определения местоположения. К сожалению, этот код не запрашивает авторизацию для служб определения местоположения.

Пожалуйста, помогите, я рву на себе волосы уже несколько часов. 1

 - (void)viewDidLoad {
[super viewDidLoad];

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

if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
    [self.locationManager requestAlwaysAuthorization];
}
[self.locationManager startUpdatingLocation];



//Initialize the map and specifiy bounds
self.myMapView =[[MKMapView alloc]initWithFrame:self.view.bounds];

//specifcy resizing
self.myMapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

//show the User's location and set tracking mode
self.myMapView.showsUserLocation = YES;
self.myMapView.userTrackingMode = MKUserTrackingModeFollow;

//add the VIEW!!
[self.view addSubview:self.myMapView];



 }

И вот функция, которую я хочу вызвать

 - (void)requestAlwaysAuthorization
 {
     CLAuthorizationStatus status = [CLLocationManager authorizationStatus];

// If the status is denied or only granted for when in use, display an alert
if (status == kCLAuthorizationStatusAuthorizedWhenInUse || status ==        kCLAuthorizationStatusDenied) {
    NSString *title;
    title = (status == kCLAuthorizationStatusDenied) ? @"Location services are off" :   @"Background location is not enabled";
    NSString *message = @"To use background location you must turn on 'Always' in the Location Services Settings";

    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:title
                                                        message:message
                                                       delegate:self
                                              cancelButtonTitle:@"Cancel"
                                              otherButtonTitles:@"Settings", nil];
    [alertView show];
}
// The user has not enabled any location services. Request background authorization.
else if (status == kCLAuthorizationStatusNotDetermined) {
    [self.locationManager requestAlwaysAuthorization];
    }
}

 - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
 {
  if (buttonIndex == 1) {
     // Send the user to the Settings for this app
     NSURL *settingsURL = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
     [[UIApplication sharedApplication] openURL:settingsURL];
 }
 }

person tennis779    schedule 03.11.2014    source источник


Ответы (1)


-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status

Это метод делегирования службы определения местоположения. Вы можете получить свой AuthorizationStatus от status. Например, kCLAuthorizationStatusDenied

Вы просто звоните

[self.locationManager requestAlwaysAuthorization];in viewзагружается и отслеживает AuthorizationStatus в методе делегирования выше, если пользователь отклоняет вашу службу определения местоположения, показывает предупреждение

person Leo    schedule 03.11.2014
comment
Когда я реализую этот метод, а затем вызываю didChangeAuthorizaitionStatus, он не входит в этот метод делегата. Переходит ли он к этому методу после завершения viewDidLoad или переходит к методу сразу после изменения статуса. Очевидно, что службы определения местоположения не устанавливаются даже после вызова этого запроса. - person tennis779; 03.11.2014
comment
Каждый раз после viewdidload будет вызываться этот метод делегата. Вы просто вызываете [self.locationManager requestAlwaysAuthorization] в представлении laod. Не используйте if ([self.locationManager responsesToSelector:@selector(requestAlwaysAuthorization)]); , появится оповещение, информирующее пользователя о том, что этому приложению требуется служба поиска. - person Leo; 03.11.2014
comment
Не вызывайте метод делегата, он будет автоматически вызван при открытии приложения. Вам просто нужно написать свой код в метод делегата, чтобы действовать с другой кодировкой. - person Leo; 03.11.2014