I servizi GPS e di geolocalizzazione nelle app mobili sono API per determinare la posizione fisica di un dispositivo utilizzando satelliti, Wi-Fi e reti mobili. Secondo la Google Android Location Guide (2025), oltre il 60% delle app mobili utilizza i dati di posizione per personalizzare i contenuti. Il Fused Location Provider su Android combina più fonti per migliorare la precisione e ridurre il consumo energetico.
Punti chiave
GPS (Global Positioning System) è un sistema di navigazione satellitare composto da 31 satelliti attivi in orbita a un’altitudine di circa 20.200 km. Sui dispositivi mobili, il chip GPS riceve i segnali dai satelliti e calcola le coordinate in base alla trilaterazione — misurazione del tempo di percorrenza del segnale da più satelliti. I servizi di geolocalizzazione nei sistemi operativi mobili aggiungono i dati dei punti di accesso Wi-Fi e delle torri cellulari al GPS per un posizionamento più rapido (A-GPS) e una migliore precisione in ambienti interni. Secondo GPS.gov (2024), la precisione del GPS civile è di 3-5 metri in condizioni di cielo sereno e fino a 15 metri in aree urbane dense.
I dispositivi mobili moderni supportano non solo il sistema GPS americano, ma anche altri sistemi globali di navigazione satellitare: il GLONASS russo (24 satelliti), il Galileo europeo (28 satelliti) e il BeiDou cinese. Il supporto simultaneo di più sistemi migliora la precisione e la velocità del posizionamento — il dispositivo può utilizzare fino a 40 satelliti di diversi sistemi per calcolare la sua posizione. Su iOS e Android, la selezione del sistema satellitare avviene automaticamente a livello del chip hardware, gli sviluppatori non devono gestirlo.
Il processo di determinazione della posizione su un dispositivo mobile comprende diverse fasi: raccolta dei dati dalle fonti (satelliti, Wi-Fi, celle), filtraggio e correzione degli errori, calcolo delle coordinate e consegna del risultato all’app. Il sistema operativo gestisce questo processo tramite un servizio di geolocalizzazione unificato che ottimizza tutte le fonti per risparmiare la batteria. Di seguito sono descritte le tre principali fonti di dati di posizione.
La navigazione satellitare offre la massima precisione (3-5 metri), ma richiede una visione chiara del cielo. In ambienti interni o aree urbane dense, il segnale GPS può essere indebolito o completamente perso. Il tempo per il primo fix (TTFF) è di 30-60 secondi per un avvio a freddo e di 5-10 secondi per un avvio a caldo. L’A-GPS (GPS assistito) accelera l’avvio scaricando i dati delle effemeridi dei satelliti via Internet invece di attendere i dati dai satelliti.
Il posizionamento Wi-Fi utilizza un database di indirizzi MAC di punti di accesso con coordinate note. La precisione è di 10-50 metri all’interno della copertura Wi-Fi. Le torri cellulari forniscono una precisione da 100 metri a diversi chilometri a seconda della densità delle torri. La combinazione di tutte le fonti (Fused Location) consente di ottenere coordinate con precisione ragionevole e consumo energetico minimo — specialmente quando il chip GPS è spento o i segnali satellitari non sono disponibili.
Su entrambe le piattaforme, i servizi di geolocalizzazione sono implementati tramite API di sistema con diversi gradi di astrazione. Android utilizza FusedLocationProviderClient di Google Play Services, iOS utilizza CLLocationManager di Core Location. Entrambe le API consentono di richiedere una posizione una tantum o di abbonarsi ad aggiornamenti periodici. Di seguito è riportato un esempio di ottenimento delle coordinate su Android utilizzando il Fused Location Provider in Kotlin.
val fusedClient = LocationServices.getFusedLocationProviderClient(this)
val locationRequest = LocationRequest.Builder(
Priority.PRIORITY_HIGH_ACCURACY
)
.setIntervalMillis(5000)
.setMinUpdateIntervalMillis(2000)
.build()
val locationCallback = object : LocationCallback() {
override fun onLocationResult(result: LocationResult) {
result.lastLocation?.let { location ->
Log.d("Posizione", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
Nell’esempio, LocationRequest viene configurato con PRIORITY_HIGH_ACCURACY — questo attiva il GPS per la massima precisione. setIntervalMillis imposta l’intervallo di aggiornamento desiderato (5 secondi), setMinUpdateIntervalMillis imposta l’intervallo minimo (2 secondi). Il callback onLocationResult viene invocato ogni volta che il sistema riceve nuove coordinate. È importante verificare l’autorizzazione prima di chiamare requestLocationUpdates — altrimenti l’app si bloccherà con una SecurityException.
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// SEGNO: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
Su iOS, desiredAccuracy determina la precisione della richiesta: kCLLocationAccuracyBest utilizza tutte le fonti disponibili (GPS + Wi-Fi + celle). Dopo aver richiesto l’autorizzazione tramite requestWhenInUseAuthorization, il sistema mostra un dialogo all’utente. Il delegato didUpdateLocations riceve un array di oggetti CLLocation con coordinate, altitudine, velocità e direzione. Per fermare gli aggiornamenti, chiamare stopUpdatingLocation per risparmiare la batteria.
L’accesso alla geolocalizzazione richiede l’autorizzazione esplicita dell’utente su entrambe le piattaforme. Su Android vengono utilizzate le autorizzazioni ACCESS_FINE_LOCATION (GPS) e ACCESS_COARSE_LOCATION (Wi-Fi/celle). A partire da Android 10, l’accesso in background richiede un’autorizzazione separata ACCESS_BACKGROUND_LOCATION. Su iOS sono disponibili tre livelli: requestWhenInUseAuthorization (solo quando l’app è attiva), requestAlwaysAuthorization (in background) e timestamp temporanei per il posizionamento preciso. Apple richiede una descrizione obbligatoria in Info.plist: NSLocationWhenInUseUsageDescription o NSLocationAlwaysAndWhenInUseUsageDescription. Senza queste chiavi, la richiesta di autorizzazione viene ignorata.
L’uso continuo del GPS scarica significativamente la batteria — fino al 30% all’ora di funzionamento continuo alla massima precisione. Per ottimizzare il consumo energetico, si consiglia di utilizzare la geolocalizzazione solo quando necessario e di interrompere gli aggiornamenti quando l’app va in background. Su Android, FusedLocationProviderClient passa automaticamente tra GPS e fonti di rete in base alla disponibilità e alla priorità della richiesta. Su iOS, utilizzare il servizio di cambiamento significativo della posizione (startMonitoringSignificantLocationChanges) per aggiornamenti con consumo energetico minimo — la precisione è inferiore (fino a 500 metri), ma la batteria quasi non si consuma. Praticare anche l’elaborazione in batch: raccogliere le coordinate a intervalli di 5-10 minuti e inviarle al server in un’unica richiesta tramite WorkManager su Android o BGTaskScheduler su iOS. Ridurre la frequenza delle richieste da 1 secondo a 30 secondi riduce il consumo energetico della geolocalizzazione dell’85%.
La geolocalizzazione è utilizzata in un’ampia gamma di app mobili: dai navigatori ai servizi di consegna. Gli scenari più comuni includono la visualizzazione dell’utente sulla mappa, la pubblicità geotargettizzata, il tracciamento dei corrieri, il geofencing per le notifiche push e il tracciamento dell’attività fisica. Ogni scenario richiede il proprio approccio in termini di precisione e frequenza di aggiornamento. Di seguito è riportata una tabella con le raccomandazioni di configurazione per diversi tipi di app.
| Tipo di app | Precisione | Intervallo | Modalità background |
|---|---|---|---|
| Navigatore | HIGH (GPS) | 1-2 sec | Sì |
| Consegna | BALANCED (GPS+Wi-Fi) | 10-30 sec | Sì |
| Meteo | LOW (Wi-Fi/celle) | Una volta | No |
| Social network | BALANCED | All’apertura | No |
| Fitness | HIGH (GPS) | 5-10 sec | Sì |
Quando si progetta la funzionalità di geolocalizzazione, è importante considerare che gli utenti possono revocare l’autorizzazione in qualsiasi momento tramite le impostazioni di sistema. L’app deve gestire correttamente le situazioni in cui la geolocalizzazione non è disponibile e mostrare una spiegazione chiara del perché la funzionalità è limitata.
Geofencing è una tecnologia per creare confini virtuali su una mappa. Quando questi confini vengono superati, l’app riceve una notifica. Su Android, i geofence sono implementati tramite GeofencingClient di Google Play Services, su iOS — tramite CLCircularRegion di Core Location. Quando si entra o si esce da una zona, il sistema riattiva l’app e invia un evento anche se l’app è chiusa o minimizzata. Questo viene utilizzato per notifiche push all’avvicinamento a un negozio, promemoria di attività basati sulla posizione e automazione di dispositivi IoT. Il numero massimo di geofence è limitato: 100 su Android, 20 su iOS contemporaneamente. Il raggio minimo della zona è di 50 metri su entrambe le piattaforme — altrimenti il sistema potrebbe non attivarsi a causa di imprecisioni nella determinazione della posizione. Quando si entra in una zona, il sistema avvia un Intent su Android o chiama il delegato locationManager:didEnterRegion su iOS.
Domande frequenti
Il GPS in uno smartphone è un ricevitore integrato dei segnali del sistema di navigazione satellitare che determina le coordinate con una precisione di 3-5 metri. I dispositivi supportano anche GLONASS, Galileo e BeiDou per migliorare la precisione e la velocità di posizionamento.
Il GPS è solo un metodo satellitare per determinare le coordinate. I servizi di geolocalizzazione combinano GPS, posizionamento Wi-Fi e dati delle torri cellulari per una determinazione della posizione più rapida ed efficiente dal punto di vista energetico, specialmente in ambienti interni.
Chiamare requestWhenInUseAuthorization() o requestAlwaysAuthorization() su un’istanza di CLLocationManager. Innanzitutto, aggiungere NSLocationWhenInUseUsageDescription in Info.plist con una spiegazione chiara del motivo per cui è necessaria la geolocalizzazione.
Utilizzare FusedLocationProviderClient su Android e il servizio di cambiamento significativo della posizione su iOS. Aumentare l’intervallo tra le richieste a 10-30 secondi, disattivare gli aggiornamenti quando lo schermo è spento e applicare l’invio in batch delle coordinate al server.
Sì, senza GPS è possibile determinare la posizione approssimativa utilizzando i punti di accesso Wi-Fi (precisione 10-50 metri) o le torri cellulari (precisione 100-5000 metri). Su Android, viene utilizzato ACCESS_COARSE_LOCATION per questo scopo.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche