Pour demander l'autorisation des services de localisation que vous utilisez:
yourSharedLocationManager.requestWhenInUseAuthorization()
Si l'état est actuellement indéterminé, une alerte s'affichera, invitant l'utilisateur à autoriser l'accès. Si l'accès est refusé, votre application sera notifiée dans CLLocationManagerDelegate, de même si l'autorisation est refusée à tout moment, vous serez mis à jour ici.
Vous devez vérifier deux états distincts pour déterminer les autorisations actuelles.
- Si l'utilisateur a activé ou non les services de localisation générale
CLLocationManager.locationServicesEnabled()
- Si l'utilisateur a accordé l'autorisation appropriée pour votre application.
CLLocationManager.authorizationStatus() == .authorizedWhenInUse
Vous pouvez ajouter une extension est une option pratique:
extension CLLocationManager {
static func authorizedToRequestLocation() -> Bool {
return CLLocationManager.locationServicesEnabled() &&
(CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse)
}
}
Ici, il est accessible lorsque l'utilisateur a demandé pour la première fois un itinéraire:
private func requestUserLocation() {
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.authorizedToRequestLocation() {
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
locationManager.requestLocation()
} else {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
Voici le délégué:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if !CLLocationManager.authorizedToRequestLocation() {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
manager.locationServicesEnabled()
plutôt queCLLocationManager.loationServicesEnabled()
résolu!