Ошибка авторизации CLLocationManager iOS 8
Я работаю над куском кода Swift для iOS 8. Я пытаюсь сделать что-то, что связано с местоположением, и поэтому я внедрил следующее в моем файле с быстрым представлением:
let locationManger:CLLocationManager = CLLocationManager()
var speedReceived:Double = 0
override func viewDidLoad() {
super.viewDidLoad()
locationManger.delegate = self
locationManger.desiredAccuracy = kCLLocationAccuracyBest
let authstate = CLLocationManager.authorizationStatus()
if(authstate == CLAuthorizationStatus.NotDetermined){
println("Not Authorised")
locationManger.requestWhenInUseAuthorization()
}
// Do any additional setup after loading the view, typically from a nib.
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){
var location:CLLocation = locations[locations.count - 1] as CLLocation
if(location.horizontalAccuracy > 0){
self.speedReceived = location.speed
println(self.speedReceived)
}
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("Couldn't get your location")
}
Однако я не могу заставить этот код работать. Это не сохраняет мое предпочтение использованию местоположения. он даже не предлагает мне дать разрешение на доступ к местоположению. Я пробовал обновлять свой info.plist. Но это не работает. Btw, если я всегда выбираю параметры конфиденциальности в симуляторе, он работает, если я немедленно вернусь к приложению. может ли кто-нибудь помочь? Я уверен, что эта проблема, потому что я не авторизовался на своей консоли.
Любая помощь?
Ответы
Ответ 1
Это проблема, связанная с iOS 8. Вы должны поместить ключи NSLocationAlwaysUsageDescription
или NSLocationWhenInUseUsageDescription
в ваш файл .plist
(значение может быть дополнительным сообщением, которое будет представлено в предупреждении о местоположении). Эти ключи требуются в iOS 8.
Как сказано в Руководства Apple:
Этот ключ требуется, если вы используете requestAlwaysAuthorization метод класса CLLocationManager для запроса авторизации для сервисы определения местоположения. Если этого ключа нет, и вы вызываете requestAlwaysAuthorization, система игнорирует ваш запрос и не позволяет вашему приложению использовать службы определения местоположения.
Ответ 2
Я столкнулся с подобной проблемой, которая сохранялась даже после добавления в plist ключей NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescription.
В конце концов я добавил ключ "Конфиденциальность - Местоположение использования" на plist (в дополнение к новым клавишам) и voila, это сработало! После того, как он работал, я смог удалить ключ "Конфиденциальность - описание использования местоположения" из plist и продолжить успешную авторизацию.
Ответ 3
iOS 8 изменила стратегию авторизации местоположения. Решение с обратной совместимостью:
SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
[self.locationManager respondsToSelector:requestSelector]) {
[self.locationManager performSelector:requestSelector withObject:NULL];
} else {
[self.locationManager startUpdatingLocation];
}
Напоминание: настройка NSLocationWhenInUseUsageDescription в вашем Info.plist
Ответ 4
У меня была такая же проблема.
Для записи это не официальный ответ. Первый ответ правильный. Я просто хотел добавить ссылку на проект FOSS (Objective-C), который иллюстрирует исправление.
Как уже отмечалось, мне пришлось добавить ключ. Мое приложение не нужно запускать в фоновом режиме, поэтому я добавил ключ NSLocationWhenInUseUsageDescription в свой info.plist.
Если вы добавите строку в качестве значения для этого ключа (необязательно - наличия ключа достаточно, чтобы установить панель), то эта строка появится во всплывающем окне авторизации.
Затем я добавил следующий код перед всеми моими вызовами [CLLocationManager startUpdating]:
if ( [locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)] )
{
[locationManager requestWhenInUseAuthorization];
}
Сигнал responseSoSlector важен, поскольку вызов доступен только в iOS 8.
При первом вызове отображается предупреждение. После этого он проваливается.
Обратите внимание, что я вызываю requestWhenInUseAuthorization
Он должен соответствовать значению, которое я положил в plist. Наверное, ты можешь поставить оба, но я не знаю. Мне не нужно было.
Проект здесь. Большая часть работы (не так много) находится в файле BMLTAppDelegate.m.
Это неприятный сюрприз. Многие люди не подозревают, что их приложения перестанут работать в iOS 8. Они сделают то же самое, что и вначале: дайте ему быстрый запуск в симуляторе, обратите внимание на зависание и запишите его на бета-версию.
Теперь у меня другая проблема: все мои приложения исправлены, но при сбое Xcode при попытке загрузить приложения в App Store. Я открываю РАДАР.
Xcode 6 выглядит скрупулезно. Я ожидаю, что патч выйдет довольно быстро.
Ответ 5
Поскольку мне не нравится редактировать plist напрямую, я всегда предоставляю авторизацию с помощью пользовательского интерфейса.
![введите описание изображения здесь]()
В PopUp, в котором используются доступные гранты, отображаются голландские тексты "Toegang is nodig" и "Toegang is noodzakelijk". Вы можете изменить их на любой текст, который вам нравится.
Просто добавьте источник plist,
<key>NSLocationAlwaysUsageDescription</key>
<string>To get location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>To get location</string>
Ответ 6
Для Swift 2 я заменил проверку responsesToSelector() проверкой версии iOS. Не так элегантно, но для Xcode 7 требуется 0 ошибок, 0 предупреждений
if #available(iOS 8.0, *) {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}