requestWhenInUseAuthorization() не работает в iOS 8 с ключом NSLocationWhenInUseUsageDescription в Info.plist

Я использую iOS SDK 8.1, пытаясь вызвать метод requestWhenInUseAuthorization(), чтобы предложить пользователю предоставить доступ к моему приложению. Я импортировал CoreLocation.framework и добавил ключи NSLocationWhenInUseUsageDescription и NSLocationAlwaysUsageDescription в info.plist. Когда я запускал приложение, оно никогда не предлагало мне доступ к местоположению. Ниже мой код, что я пропустил?

import UIKit
import CoreLocation
import MapKit

class ViewController: UIViewController, CLLocationManagerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        var manager = CLLocationManager()
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest

        let authorizationStatus = CLLocationManager.authorizationStatus()
        switch authorizationStatus {
        case .Authorized:
            println("authorized")
        case .AuthorizedWhenInUse:
            println("authorized when in use")
        case .Denied:
            println("denied")
        case .NotDetermined:
            println("not determined")
        case .Restricted:
            println("restricted")
        }

        manager.requestWhenInUseAuthorization()
        manager.startUpdatingLocation()

    }

    func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
        let location = locations[0] as CLLocation
        println("Latitude: \(location.coordinate.latitude). Longitude: \(location.coordinate.longitude).")
    }

    func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
        switch status {
        case .Authorized:
            println("authorized")
        case .AuthorizedWhenInUse:
            println("authorized when in use")
        case .Denied:
            println("denied")
        case .NotDetermined:
            println("not determined")
        case .Restricted:
            println("restricted")
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}

Консоль показала «не определено» только один раз и больше ничего. Итак, я зашел в iPhone Simulator => Настройки => Конфиденциальность => Местоположение => Мое приложение. Он показал мне 3 варианта: «Никогда», «При использовании приложения», «Всегда». Но ничего не выбрали.


person toadead    schedule 29.12.2014    source источник


Ответы (3)


Задача решена. Мой manager был объявлен как локальная переменная внутри метода viewDidLoad(), но это должно было быть свойством уровня класса.

После того, как я переместил декларацию manager из viewDidLoad(), мое приложение заработало.

Не уверен, как именно manager.requestWhenInUseAuthorization() работает за сценой и почему именно manager, определенные в viewDidLoad(), не работают. Надеюсь, кто-нибудь, кто знает эту деталь, просветит меня.

person toadead    schedule 30.12.2014
comment
Если менеджер определен как локальная переменная в viewDidLoad(), он будет освобожден из памяти в конце метода. Таким образом, вызовы requestWhenInUseAuthorization() и startUpdatingLocation() будут работать, но как только менеджер будет освобожден, он перестанет обновлять местоположение и никогда не вызовет делегата. - person Eneko Alonso; 07.05.2015
comment
НАКОНЕЦ-ТО я нахожу решение! Обычно, когда я использую службы определения местоположения, у меня есть синглтон, который обрабатывает все, но при попытке быстрого прототипирования некоторых вещей службы определения местоположения я не дошел до реализации метода синглтона, и, таким образом, как вы сказали, объект не остался ... - person Mike; 08.06.2015

Установка этих свойств в viewWillAppear вместо viewDidLoad исправила это для меня, спасибо!

override func viewWillAppear(animated: Bool) {

    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()
  }
person 7RedBits.com    schedule 23.11.2017

Я также столкнулся с той же проблемой. Я добавил два ключа вместе в info.plist.

введите здесь описание изображения

Ключ NSLocationWhenInUseUsageDescription поддерживается в iOS 8.0 и более поздних версиях. Если ваш файл Info.plist содержит как этот ключ, так и ключ NSLocationUsageDescription, система использует этот ключ и игнорирует ключ NSLocationUsageDescription.

Переставил код:

let locationManager: CLLocationManager = CLLocationManager()
  let authorizationStatus = CLLocationManager.authorizationStatus()

override func viewDidLoad() {
    super.viewDidLoad()

    locationManager.delegate = self
    if(authorizationStatus == .Denied)
    {
      print("DENIED")
      locationManager.requestWhenInUseAuthorization()
    }

  }
override func viewWillAppear(animated: Bool) {

    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.requestWhenInUseAuthorization()
    locationManager.startUpdatingLocation()
  }

Очистите проект и запустите снова.

person A.G    schedule 31.03.2016