2015-01-15 3 views
3

У меня проблема, когда locationManager:didChangeAuthorizationStatus не вызывается после того, как пользователь (1) принимает или (2) отклоняет мой запрос на использование служб определения местоположения. Разместив разные операторы NSLog, я пришел к выводу, что метод вызывается, когда я запрашиваю авторизацию, но не тогда, когда пользователь делает выбор. У кого-то были такие же проблемы? Если да, то как вы их решили?didChangeAuthorizationStatus не вызывается после изменения статуса

Вот как я инициализировать мой location manager:

if (_locationManager == nil) { 
    NSLog(@"Creating location manager"); 
    _locationManager = [[CLLocationManager alloc] init]; 
    _locationManager.delegate = self; 
    _locationManager.distanceFilter = kCLDistanceFilterNone; 
    _locationManager.desiredAccuracy = kCLLocationAccuracyBest; 
} 

if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined) { 
    NSLog(@"Not determined"); 
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"dynamicNotifOn"]) { 
    [_locationManager requestAlwaysAuthorization]; 
    } else { 
    [_locationManager requestWhenInUseAuthorization]; 
    } 
} else if (...) {... 

и вот метод:

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 
    NSLog(@"Callback"); 
    if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) { 
    NSLog(@"Authorized"); 
    [_mainButton setIsLoading:NO]; 
    [self startGettingLocation]; 
    } else if (status == kCLAuthorizationStatusDenied || status == kCLAuthorizationStatusRestricted) { 
    NSLog(@"Denied"); 
    _currentState = CurrentStateError; 
    [_mainButton setUpButtonForState:_currentState]; 
    } 
} 

После нажатия кнопки, которая инициализирует менеджер местоположения (верхний код-блок), это что печатает консоль:

Creating location manager 
Not determined 
Callback 

И затем я делаю выбор в AlertView, что всплывает:

*nothing* 

ответ

0

Вы не должны проверить kCLAuthorizationStatusNotDetermined - просто запросить разрешение каждый раз -

if (self.locationManager == nil) { 
    NSLog(@"Creating location manager"); 
    self.locationManager = [[CLLocationManager alloc] init]; 
    self.locationManager.delegate = self; 
    self.locationManager.distanceFilter = kCLDistanceFilterNone; 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest; 

    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"dynamicNotifOn"]) { 
    [self.locationManager requestAlwaysAuthorization]; 
    } else { 
    [self.locationManager requestWhenInUseAuthorization]; 
    } 
} 

Когда я использую свой метод делегата я получаю следующий вывод -

2015-01-15 12:07:43.357 LocationAuthDemo[9942:500036] Callback 
2015-01-15 12:07:51.389 LocationAuthDemo[9942:500036] Callback 
2015-01-15 12:07:51.389 LocationAuthDemo[9942:500036] Authorized 

Выполняет ли какой-либо из методов, которые вы вызываете из элементов интерфейса для обновления делегата? Если это так, вы должны отправить их в основную очередь.

+0

Привет, и спасибо за ваш ответ. Я сделал это изменение, но я все еще борюсь с той же проблемой. После того, как пользователь принимает или отклоняет мой запрос, метод не вызывается. – Aleksander

+0

И нет, они не обновляют элементы интерфейса - он просто запускает таймер и обновляет местоположение. Мой оператор печати также не вызывается. Я попытаюсь отправить его в основную очередь, но чтобы убедиться, что это работает. – Aleksander

+0

Как вы объявляете свойство locationManager? Есть ли шанс, что он был выпущен? – Paulw11

2

Там несколько странно, что в приведенном выше примере:

  1. Делегат вызова обратно locationManager: didChangeAuthorizationStatus: называется со статусом NotDetermined?!? В документации четко написано, что метод обратного вызова делегата будет вызван ТОЛЬКО при изменении статуса авторизации, но в приведенном выше примере нет. Может быть, ошибка.

  2. В ответе Paulw11 указано, что мы всегда должны запрашивать разрешение, даже если пользователь уже разрешил приложение?!? По моему мнению, приложение сначала должно вызывать CLLocationManager.authorizationStatus и запрашивать авторизацию только в том случае, если авторизация NotDetermined (то есть пользователь все еще не разрешил наше приложение) - это также указано в документации Apple.

2

В моем случае проблема была не в основной теме. Просто убедитесь, что вы создали менеджер местоположений в основной теме.

Смежные вопросы