Ошибка авторизации 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()
}