#iphone #objective-c #cocoa-touch #cllocationmanager
#iPhone #objective-c #cocoa-touch #cllocationmanager
Вопрос:
Когда мы используем службы определения местоположения в приложении, мы получаем предупреждение iOS о том, что приложение пытается использовать текущее местоположение — Разрешить / Не разрешить.
Есть ли у нас обратный вызов делегата для этих кнопок?
Я хочу обработать нажатие на «Не разрешать».
Ответ №1:
У вас нет прямого доступа к этому оповещению.
Если пользователь нажимает «Не разрешать» или если приложение иным образом не имеет разрешения на использование служб определения местоположения, то CLLocationManager
вызовет locationManager:didFailWithError:
своего делегата. Домен ошибки будет kCLErrorDomain
, а код ошибки будет kCLErrorDenied
.
Комментарии:
1. Это хороший совет, но я обнаружил, что предупреждение отображается до того, как я получу этот обратный вызов или даже обратный вызов didChangeAuthorizationStatus. Могу ли я что-нибудь еще сделать?
2. @elsurudo, вы, вероятно, уже поняли это, но для справки, Apple отображает это предупреждение, как только вы запускаете обновления местоположения в CLLocationManager. Если вы хотите визуально сообщить пользователю, почему система собирается запросить его местоположение, вам нужно создать для этого свой собственный пользовательский интерфейс и не запускать диспетчер местоположений, пока вы не будете уверены, что пользователь коснулся вашего пользовательского интерфейса.
Ответ №2:
Вы можете просто выбрать действие, как показано ниже:
- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {
if (status == kCLAuthorizationStatusAuthorizedAlways || status == kCLAuthorizationStatusAuthorizedWhenInUse) {
[self addRegion];
}
else if (status == kCLAuthorizationStatusDenied) {
NSLog(@"Location access denied");
}
}
обязательно установите делегат диспетчера местоположений.
Ответ №3:
Вам также следует проверить, разрешил ли пользователь службы определения местоположения для вашего приложения, прежде чем запускать диспетчер местоположений. Используйте CLLocationManager
метод класса locationServicesEnabled
для проверки.
Вот документ:
locationServicesEnabled
Возвращает логическое значение, указывающее, включены ли службы определения местоположения на устройстве.
(BOOL)locationServicesEnabled
Возвращаемое значение ДА, если службы определения местоположения включены, или НЕТ, если они не включены.
Обсуждение Пользователь может полностью включить или отключить службы определения местоположения из приложения «Настройки», переключив переключатель в «Настройки»> «Общие»> «Службы определения местоположения».
Перед запуском обновлений местоположения следует проверить возвращаемое значение этого метода, чтобы определить, включены ли у пользователя службы определения местоположения для текущего устройства. Если этот метод возвращает NO и вы все равно запускаете обновления местоположения, Core Location Framework предложит пользователю панель подтверждения с запросом, следует ли повторно включить службы определения местоположения.
Комментарии:
1. Это немного опасно, поскольку определяет, включены или выключены службы определения местоположения, поэтому у пользователя могут быть включены службы определения местоположения, но отключены они конкретно для вашего приложения.
2. Это совсем не опасно, фактически Apple рекомендует проверять, включены ли службы определения местоположения перед запуском диспетчера местоположений (посмотрите пример кода для LocateMe в документах). Это первое, что нужно проверить. Вы также должны проверить, нет ли kCLErrorDenied в делегате.
3. Я был немного расплывчатым, извините. Я имел в виду предупреждение не только полагаться на [CLLocationManager locationServicesEnabled] исключительно, поскольку у пользователя могут быть службы определения местоположения, включенные вообще, но отключенные для вашего приложения 🙂
4. Это правда, судя по названию, это выглядит так, как будто он выполняет полную проверку служб определения местоположения, и необходимость искать kCLErrorDenied позже также не так уж интуитивно понятна.