Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: toadeadОтветов: 3

Я использую 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 варианта: "Никогда", "При использовании приложения", "Всегда". Но ничего не выбрали.

swiftcore-locationios8

Ответы

Ответ 1 · рейтинг 19 · toadead

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

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

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

Ответ 2 · рейтинг 1 · 7RedBits.com

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

override func viewWillAppear(animated: Bool) {

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

Ответ 3 · A.G

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы