a chiedere il permesso per i servizi di localizzazione che si utilizzano:
yourSharedLocationManager.requestWhenInUseAuthorization()
Se lo stato è attualmente indeterminato un avviso indicherà che richiede all'utente di consentire l'accesso. Se l'accesso viene negato, l'app verrà notificata in CLLocationManagerDelegate, allo stesso modo se l'autorizzazione viene negata in qualsiasi momento in cui verrà aggiornato qui.
Esistono due stati separati da verificare per determinare le autorizzazioni correnti.
- Se l'utente dispone dei servizi generali di localizzazione abilitati o non
CLLocationManager.locationServicesEnabled()
- Se l'utente ha concesso l'autorizzazione corretta per la vostra applicazione ..
CLLocationManager.authorizationStatus() == .authorizedWhenInUse
Si potrebbe aggiungere un'estensione è una comoda opzione:
extension CLLocationManager {
static func authorizedToRequestLocation() -> Bool {
return CLLocationManager.locationServicesEnabled() &&
(CLLocationManager.authorizationStatus() == .authorizedAlways || CLLocationManager.authorizationStatus() == .authorizedWhenInUse)
}
}
Qui si accede quando l'utente ha prima chiesto direzioni:
private func requestUserLocation() {
//when status is not determined this method runs to request location access
locationManager.requestWhenInUseAuthorization()
if CLLocationManager.authorizedToRequestLocation() {
//have accuracy set to best for navigation - accuracy is not guaranteed it 'does it's best'
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
//find out current location, using this one time request location will start the location services and then stop once have the location within the desired accuracy -
locationManager.requestLocation()
} else {
//show alert for no location permission
showAlertNoLocation(locationError: .invalidPermissions)
}
}
Qui è il delegato:
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if !CLLocationManager.authorizedToRequestLocation() {
showAlertNoLocation(locationError: .invalidPermissions)
}
}
Sì! Grazie! Il mio problema è che mi stava cercando di chiamare locatoinServicesEnabled il mio manager, vale a dire 'manager.locationServicesEnabled()' piuttosto che 'CLLocationManager.loationServicesEnabled()' risolto! –
Ho capito che il tuo codice è solo un esempio, ma è leggermente fuorviante ... Penso che sia meglio quando 'authorizationStatus' è * set * a' not Determined', invece di loggarlo sarebbe meglio chiedere all'utente 'Allow/Non consentire " – Honey
@Honey, certo che potresti ovviamente usarlo come preferisci e come hai detto il codice è solo un esempio per mostrare come potrebbe essere usato. –