мгновенно обрабатывать разрешения на размещение в быстрых

Я пытаюсь реализовать базовое представление карты и добавить текущее местоположение пользователя к карте в качестве аннотации. Я добавил ключ request.heninuse к моему info.plist и импортировал coreLocation.

На мой взгляд, контроллер действительно загрузил метод, у меня есть следующее:

locManager.requestWhenInUseAuthorization()
var currentLocation : CLLocation

if(CLLocationManager.authorizationStatus() == CLAuthorizationStatus.AuthorizedWhenInUse){

    currentLocation = locManager.location
    println("currentLocation is \(currentLocation)")      
}
else{
    println("not getting location")
    // a default pin
}

Я получаю подсказку re. разрешение на получение местоположения. Поскольку это происходит, я получаю сообщение о том, что не получаю местоположение, очевидно, потому что это выполняется до того, как пользователь получит возможность нажать "ОК". Если я вернусь к приложению и вернусь, я смогу найти место и добавить его на карту. Тем не менее, я хочу, чтобы пользователь впервые нажал OK, чтобы иметь возможность захватить текущее местоположение и добавить его на карту там и тогда. Как я могу это достичь? У меня есть следующий способ добавления булавки:

func addPin(location2D: CLLocationCoordinate2D){
    self.mapView.delegate = self
    var newPoint = MKPointAnnotation()
    newPoint.coordinate = location2D
    self.mapView.addAnnotation(newPoint)
}

Ответ 1

Для этого вам необходимо реализовать метод didChangeAuthorizationStatus для вашего делегата менеджера местоположений, который вызывается вскоре после инициализации CLLocationManager.

Во-первых, в верхней части файла не забудьте добавить: import CoreLocation

Для этого в своем классе, где вы используете местоположение, добавьте протокол делегата. Тогда в viewDidLoad методе (или applicationDidFinishLaunching, если вы находитесь в AppDelegate) инициализировать менеджер местоположения и установить его delegate свойство self:

class myCoolClass: CLLocationManagerDelegate {
    var locManager: CLLocationManager!

    override func viewDidLoad() {
        locManager = CLLocationManager()
        locManager.delegate = self
    }
 }

Наконец, примените метод locationManager (_ didChangeAuthorizationStatus _) в теле вашего класса, который вы объявили ранее, этот метод будет вызываться, когда статус авторизации будет изменен, чтобы как только пользователь нажал кнопку. Вы можете реализовать его следующим образом:

func locationManager(manager: CLLocationManager!, didChangeAuthorizationStatus status: CLAuthorizationStatus) {
    switch status {
    case .NotDetermined:
        // If status has not yet been determied, ask for authorization
        manager.requestWhenInUseAuthorization()
        break
    case .AuthorizedWhenInUse:
        // If authorized when in use
        manager.startUpdatingLocation()
        break
    case .AuthorizedAlways:
        // If always authorized
        manager.startUpdatingLocation()
        break
    case .Restricted:
        // If restricted by e.g. parental controls. User can't enable Location Services
        break
    case .Denied:
        // If user denied your app access to Location Services, but can grant access from Settings.app
        break
    default:
        break
    }
}

Swift 4 - новый синтаксис enum

Для Swift 4 просто переключите первую букву каждого случая перечисления на нижний регистр (.notDetermined,.authorizedWhenInUse,.authorizedAlways,.restricted и.denied)

Таким образом, вы можете обрабатывать каждый случай, так как пользователь просто дал свое разрешение или отозвал его.