2014-12-29 2 views
4

Я использую iOS SDK 8.1, пытаясь вызвать метод requestWhenInUseAuthorization(), чтобы предложить пользователю предоставить доступ к моему приложению. Я импортировал CoreLocation.framework и добавил ключи NSLocationWhenInUseUsageDescription и NSLocationAlwaysUsageDescription в info.plist. Когда я запускал приложение, он никогда не запрашивал у меня доступ к местоположению. Ниже мой код, что я пропустил?requestWhenInUseAuthorization() не работает в iOS 8 с NSLocationWhenInUseUsageDescription Key in 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 варианта: «Никогда», «При использовании приложения», «Всегда». Но ничего не было выбрано.

ответ

18

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

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

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

+1

Если менеджер определен как локальная переменная в viewDidLoad(), он будет выпущен из памяти в конце метода. Таким образом, вызовы requestWhenInUseAuthorization() и startUpdatingLocation() будут работать, но как только менеджер будет выпущен, он перестанет обновлять местоположение и никогда не вызовет делегата. –

+0

НАКОНЕЦ Я нахожу решение! Обычно, когда я использую службы определения местоположения, у меня есть синглтон, который обрабатывает все, но, пытаясь быстро прототипировать некоторые сервисы служб местоположения, я до сих пор не реализовал метод singleton, и, как вы сказали, объект не прилипает ... – Mike

0

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

enter image description here

ключ NSLocationWhenInUseUsageDescription поддерживается в прошивкой 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() 
    } 

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

1

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

override func viewWillAppear(animated: Bool) { 

    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.startUpdatingLocation() 
    } 
Смежные вопросы