Le differenze di CoreLocation tra iOS7 e iOS8 da tenere in mente
UIKit
Con iOS8 Apple ha aggiunti moltissime nuove API ed aggiornate tante altre.
Una delle classi che ha avuto una grande modifica è CoreLocation. Infatti hanno aggiunto un nuovo metodo di richiesta autorizzazione e nuove autorizzazioni.
Adesso possiamo scegliere se utilizzare CoreLocation in modo continuativo o solo durante l’uso dell’app. Abbiamo quindi due tipi di autorizzazioni:
1. kCLAuthorizationStatusAuthorizedAlways (ha lo stesso valore del vecchio kCLAuthorizationStatusAuthorized)
2. kCLAuthorizationStatusAuthorizedWhenInUse
Con AuthorizedAlways possiamo usare tutti i servizi di CoreLocation, in foreground e in background, Region Monitoring, Visit Monitoring e Significant Location Changes.
Con AuthorizedWhenInUse possiamo invece utilizzare i servizi di geolocalizzazione base solo in foreground.
Quindi dobbiamo scegliere che tipo di servizio utilizzare ed aggiungere una chiave al file Info.plist del progetto:
Con AuthorizedAlways aggiungiamo la chiave NSLocationAlwaysUsageDescription e come valore inseriamo un testo che spiega perché vogliamo utilizzare il GPS.
Con AuthorizedWhenInUse aggiungiamo la chiave NSLocationWhenInUseUsageDescription e come per la chiave precedente, aggiungiamo un testo adeguato.
Queste chiavi sono obbligatorie, se non vengono aggiunte il sistema non funzionerà .
Per richiedere l’autorizzazione all’utente quindi possiamo usare i due metodi di CLLocationManager:
- requestWhenInUseAuthorization - requestAlwaysAuthorization
Prima di richiedere l’autorizzazione è buona prassi controllare lo stato attuale con il metodo di classe di CLLocationManager:
+ authorizationStatus
e poi, se l’utente non ha autorizzato, richiederla.
Ricodatevi che il sistema si occupa di mostrare l’alert di richiesta e decide lui quando mostrarlo e se mostrarlo.
Infatti, se provate a richiedere l’autorizzazione una seconda volta, il sistema non avviserà l’utente.
CuriositÃ
Potete localizzare le stringhe inserite in Info.plist creando un file di stringhe chiamato: InfoPlist.strings e localizzandolo.