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)


arrow_upward
19
arrow_downward

Задача решена. Мой 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

arrow_upward
1
arrow_downward

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

override func viewWillAppear(animated: Bool) {

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

arrow_upward
0
arrow_downward

Я также столкнулся с той же проблемой. Я добавил два ключа вместе в 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