Ответ 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)
Таким образом, вы можете обрабатывать каждый случай, так как пользователь просто дал свое разрешение или отозвал его.