iOS
Core Location
Ricerca…
Sintassi
- desiredAccuracy
- distanceFilter
- requestLocation ()
- startUpdatingLocation ()
- allowDeferredLocationUpdates (untilTraveled: timeout :)
- startMonitoringSignificantLocationChanges ()
- allowDeferredLocationUpdates (untilTraveled: timeout :)
- authorizedAlways
- authorizedWhenInUse
- locationManager (_: didChangeAuthorization :)
Osservazioni
Simula una posizione in fase di esecuzione
- Esegui l'app da Xcode.
- Nella barra di debug, fai clic sul pulsante "Simula posizione".
- Scegli una posizione dal menu.
Link CoreLocation Framework
Importare il modulo CoreLocation nelle classi che utilizzano la funzionalità CoreLocation.
//Swift
import CoreLocation
//Objective-C
#import <CoreLocation/CoreLocation.h>
Richiedi il permesso di utilizzare i servizi di localizzazione
Verifica lo stato di autorizzazione dell'app con:
//Swift
let status: CLAuthorizationStatus = CLLocationManager.authorizationStatus()
//Objective-C
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
Verifica lo stato rispetto alle seguenti costanti:
//Swift
switch status {
case .NotDetermined:
// Do stuff
case .AuthorizedAlways:
// Do stuff
case .AuthorizedWhenInUse:
// Do stuff
case .Restricted:
// Do stuff
case .Denied:
// Do stuff
}
//Objective-C
switch (status) {
case kCLAuthorizationStatusNotDetermined:
//The user hasn't yet chosen whether your app can use location services or not.
break;
case kCLAuthorizationStatusAuthorizedAlways:
//The user has let your app use location services all the time, even if the app is in the background.
break;
case kCLAuthorizationStatusAuthorizedWhenInUse:
//The user has let your app use location services only when the app is in the foreground.
break;
case kCLAuthorizationStatusRestricted:
//The user can't choose whether or not your app can use location services or not, this could be due to parental controls for example.
break;
case kCLAuthorizationStatusDenied:
//The user has chosen to not let your app use location services.
break;
default:
break;
}
Ottenere l'autorizzazione del servizio di localizzazione mentre l'app è in uso
Il metodo più semplice consiste nell'inizializzare il gestore località come proprietà del controller della vista radice e inserire la richiesta di autorizzazione nel suo viewDidLoad
.
Questo fa apparire il controller degli avvisi che richiede il permesso:
//Swift
let locationManager = CLLocationManager()
locationManager.requestWhenInUseAuthorization()
//Objective-C
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[locationManager requestWhenInUseAuthorization];
Aggiungi la chiave NSLocationWhenInUseUsageDescription al tuo Info.plist . Il valore verrà utilizzato nell'etichetta del message
del controller di message
.
Ottenere sempre l'autorizzazione del servizio di localizzazione
Per chiedere il permesso di utilizzare i servizi di localizzazione anche quando l'app non è attiva, utilizzare invece la seguente chiamata:
//Swift
locationManager.requestAlwaysAuthorization()
//Objective-C
[locationManager requestAlwaysAuthorization];
Quindi aggiungi la chiave NSLocationAlwaysUsageDescription al tuo Info.plist . Anche in questo caso, il valore verrà utilizzato nell'etichetta del message
del controller di message
.
Aggiungi la tua posizione personalizzata usando il file GPX
Per verificare i servizi di localizzazione, abbiamo bisogno di un dispositivo reale, ma a scopo di test possiamo anche usare il simulatore e aggiungere la nostra posizione seguendo i seguenti passaggi:
- aggiungi un nuovo file GPX nel tuo progetto.
- nel file GPX aggiungi waypoint come
<?xml version="1.0"?>
<gpx version="1.1" creator="Xcode">
<!--
Provide one or more waypoints containing a latitude/longitude pair. If you provide one
waypoint, Xcode will simulate that specific location. If you provide multiple waypoints,
Xcode will simulate a route visitng each waypoint.
-->
<wpt lat="52.599878" lon="4.702029">
<name>location name (eg. Florida)</name>
</wpt>
- quindi vai al prodotto -> Schema -> Modifica schema e in RUN imposta la posizione predefinita come nome del tuo file GPX.
Servizi di localizzazione in background
Per utilizzare i servizi di localizzazione standard mentre l'applicazione è in background, è necessario innanzitutto attivare le Background Modes
nella scheda Funzionalità delle impostazioni di destinazione e selezionare Location updates
.
Oppure, aggiungilo direttamente a Info.plist.
<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
Quindi è necessario configurare CLLocationManager
Obiettivo C
//The Location Manager must have a strong reference to it.
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
//Request Always authorization (iOS8+)
if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[_locationManager requestAlwaysAuthorization];
}
//Allow location updates in the background (iOS9+)
if ([_locationManager respondsToSelector:@selector(allowsBackgroundLocationUpdates)]) {
_locationManager.allowsBackgroundLocationUpdates = YES;
}
[_locationManager startUpdatingLocation];
veloce
self.locationManager.delegate = self
if #available (iOS 8.0,*) {
self.locationManager.requestAlwaysAuthorization()
}
if #available (iOS 9.0,*) {
self.locationManager.allowsBackgroundLocationUpdates = true
}
self.locationManager.startUpdatingLocation()