GPS i usługi lokalizacyjne w aplikacjach mobilnych — to API do określania fizycznego położenia urządzenia za pomocą satelitów, Wi-Fi i sieci komórkowych. Według danych Google Android Location Guide (2025), ponad 60% aplikacji mobilnych wykorzystuje dane o lokalizacji do personalizacji treści. Fused Location Provider na Androidzie łączy kilka źródeł w celu zwiększenia dokładności i zmniejszenia zużycia energii.
Najważniejsze
GPS (Global Positioning System) — to satelitarny system nawigacyjny składający się z 31 aktywnych satelitów na orbicie o wysokości około 20 200 km. W urządzeniach mobilnych układ GPS odbiera sygnały z satelitów i oblicza współrzędne na podstawie trilateracji — pomiaru czasu propagacji sygnału z kilku satelitów. Usługi lokalizacyjne w mobilnych systemach operacyjnych dodają do GPS dane z punktów dostępu Wi-Fi i stacji bazowych sieci komórkowej w celu przyspieszenia określania współrzędnych (A-GPS) oraz poprawy dokładności wewnątrz pomieszczeń. Według danych GPS.gov (2024), dokładność cywilnego GPS wynosi 3-5 metrów przy czystym niebie i do 15 metrów w warunkach gęstej zabudowy.
Nowoczesne urządzenia mobilne obsługują nie tylko amerykański system GPS, ale także inne globalne systemy nawigacyjne: rosyjski GLONASS (24 satelity), europejski Galileo (28 satelitów) i chiński BeiDou. Obsługa kilku systemów jednocześnie zwiększa dokładność i szybkość określania współrzędnych — urządzenie może wykorzystać do 40 satelitów z różnych systemów do obliczenia pozycji. W systemach iOS i Android wybór systemu satelitarnego odbywa się automatycznie na poziomie układu sprzętowego, programista nie musi tym zarządzać.
Proces określania położenia na urządzeniu mobilnym składa się z kilku etapów: zbieranie danych ze źródeł (satelity, Wi-Fi, sieci komórkowe), filtrowanie i korekcja błędów, obliczanie współrzędnych i przekazywanie wyniku do aplikacji. System operacyjny zarządza tym procesem poprzez jednolity serwis geolokalizacyjny, który optymalizuje pracę wszystkich źródeł w celu oszczędzania baterii. Poniżej opisano trzy główne źródła danych o położeniu.
Nawigacja satelitarna zapewnia maksymalną dokładność (3-5 metrów), ale wymaga bezpośredniej widoczności nieba. Wewnątrz pomieszczeń lub w gęstej zabudowie miejskiej sygnał GPS może być osłabiony lub całkowicie utracony. Czas pierwszego określenia pozycji (TTFF) wynosi 30-60 sekund przy zimnym starcie i 5-10 sekund przy gorącym. A-GPS (Assisted GPS) przyspiesza start poprzez pobieranie efemeryd satelitów przez internet zamiast oczekiwania na dane z satelitów.
Wi-Fi pozycjonowanie wykorzystuje bazę danych adresów MAC punktów dostępu o znanych współrzędnych. Dokładność wynosi 10-50 metrów w zasięgu Wi-Fi. Stacje bazowe sieci komórkowej zapewniają dokładność od 100 metrów do kilku kilometrów w zależności od gęstości rozmieszczenia stacji. Kombinacja wszystkich źródeł (Fused Location) pozwala uzyskać współrzędne z rozsądną dokładnością przy minimalnym zużyciu energii — szczególnie gdy układ GPS jest wyłączony lub sygnał satelitarny jest niedostępny.
Na obu platformach usługi lokalizacyjne są zaimplementowane poprzez systemowe API o różnym stopniu abstrakcji. Android wykorzystuje FusedLocationProviderClient z Google Play Services, iOS — CLLocationManager z Core Location. Oba API umożliwiają żądanie jednorazowej pozycji lub subskrypcję regularnych aktualizacji. Poniżej znajduje się przykład uzyskiwania współrzędnych na Androidzie za pomocą Fused Location Provider w Kotlinie.
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("Lokalizacja", "Lat: ${location.latitude}, Lng: ${location.longitude}")
}
}
}
if (checkLocationPermission()) {
fusedClient.requestLocationUpdates(
locationRequest, locationCallback,
Looper.getMainLooper()
)
}
W przykładzie LocationRequest jest konfigurowany z priorytetem HIGH_ACCURACY — włącza to GPS dla maksymalnej dokładności. setIntervalMillis ustawia żądany interwał aktualizacji (5 sekund), setMinUpdateIntervalMillis — minimalny (2 sekundy). Callback onLocationResult jest wywoływany za każdym razem, gdy system otrzyma nowe współrzędne. Ważne jest sprawdzenie uprawnienia przed wywołaniem requestLocationUpdates — w przeciwnym razie aplikacja zgłosi wyjątek SecurityException.
import CoreLocation
let locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.requestWhenInUseAuthorization()
locationManager.startUpdatingLocation()
// MARK: - CLLocationManagerDelegate
func locationManager(
_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]
) {
guard let location = locations.last else { return }
print("Location: \(location.coordinate.latitude), \(location.coordinate.longitude)")
}
Na iOS desiredAccuracy określa dokładność żądania: kCLLocationAccuracyBest wykorzystuje wszystkie dostępne źródła (GPS + Wi-Fi + sieci komórkowe). Po żądaniu uprawnienia przez requestWhenUseAuthorization system wyświetla użytkownikowi dialog. Delegat didUpdateLocations otrzymuje tablicę obiektów CLLocation ze współrzędnymi, wysokością, prędkością i kursem. Aby zatrzymać aktualizacje, wywołuje się stopUpdatingLocation, aby oszczędzić baterię.
Dostęp do geolokalizacji wymaga wyraźnej zgody użytkownika na obu platformach. Na Androidzie używane są uprawnienia ACCESS_FINE_LOCATION (GPS) i ACCESS_COARSE_LOCATION (Wi-Fi/sieci komórkowe). Począwszy od Androida 10, dostęp w tle wymaga osobnego uprawnienia ACCESS_BACKGROUND_LOCATION. Na iOS dostępne są trzy poziomy: requestWhenInUseAuthorization (tylko przy aktywnej aplikacji), requestAlwaysAuthorization (w tle) oraz znaczniki czasu dla precyzyjnego pozycjonowania. Apple wymaga obowiązkowego opisu w Info.plist: NSLocationWhenInUseUsageDescription lub NSLocationAlwaysAndWhenInUseUsageDescription. Bez tych kluczy żądanie uprawnienia jest ignorowane.
Ciągłe korzystanie z GPS znacznie skraca czas pracy baterii — nawet do 30% na godzinę ciągłej pracy przy maksymalnej dokładności. W celu optymalizacji zużycia energii zaleca się używanie geolokalizacji tylko wtedy, gdy jest to konieczne, i zaprzestawanie aktualizacji po przejściu aplikacji w tło. Na Androidzie FusedLocationProviderClient automatycznie przełącza się między GPS a źródłami sieciowymi w zależności od dostępności i priorytetu żądania. Na iOS używaj significant-change location service (startMonitoringSignificantLocationChanges) do aktualizacji przy minimalnym zużyciu energii — dokładność jest niższa (do 500 metrów), ale bateria prawie się nie zużywa. Praktykuj również przetwarzanie wsadowe: zbieraj współrzędne w interwale 5-10 minut i wysyłaj na serwer jednym żądaniem przez WorkManager na Androidzie lub BGTaskScheduler na iOS. Zmniejszenie częstotliwości żądań z 1 sekundy do 30 sekund redukuje zużycie energii geolokalizacji o 85%.
Geolokalizacja jest stosowana w szerokim spektrum aplikacji mobilnych: od nawigatorów po usługi dostawy. Najbardziej popularne scenariusze obejmują wyświetlanie użytkownika na mapie, geotargetowanie reklam, śledzenie kurierów, strefy geograficzne dla powiadomień push i śledzenie aktywności fitness. Każdy scenariusz wymaga własnego podejścia do dokładności i częstotliwości aktualizacji. Poniżej znajduje się tabela z zaleceniami konfiguracji dla różnych typów aplikacji.
| Typ aplikacji | Dokładność | Interwał | Tryb tła |
|---|---|---|---|
| Nawigator | HIGH (GPS) | 1-2 sek | Tak |
| Dostawa | BALANCED (GPS+Wi-Fi) | 10-30 sek | Tak |
| Pogoda | LOW (Wi-Fi/sieci komórkowe) | Jednorazowo | Nie |
| Media społecznościowe | BALANCED | Przy otwarciu | Nie |
| Fitness | HIGH (GPS) | 5-10 sek | Tak |
Projektując funkcjonalność geolokalizacyjną, należy uwzględnić, że użytkownicy mogą w każdej chwili cofnąć uprawnienie w ustawieniach systemu. Aplikacja powinna poprawnie obsługiwać sytuację, gdy geolokalizacja jest niedostępna, i wyświetlać zrozumiałe wyjaśnienie, dlaczego funkcjonalność jest ograniczona.
Geofencing — technologia tworzenia wirtualnych granic na mapie, po przekroczeniu których aplikacja otrzymuje powiadomienie. Na Androidzie strefy geograficzne są implementowane przez GeofencingClient z Google Play Services, na iOS — przez CLCircularRegion z Core Location. Przy wejściu lub wyjściu ze strefy system budzi aplikację i wysyła zdarzenie, nawet jeśli aplikacja jest zamknięta lub zminimalizowana. Jest to używane do powiadomień push przy zbliżaniu się do sklepu, przypomnień o zadaniach na podstawie lokalizacji oraz automatyzacji urządzeń IoT. Maksymalna liczba stref geograficznych jest ograniczona: na Androidzie — 100, na iOS — 20 jednocześnie. Minimalny promień strefy wynosi 50 metrów na obu platformach, w przeciwnym razie system może nie zadziałać z powodu niedokładności określania położenia. Przy wejściu w strefę system uruchamia Intent na Androidzie lub wywołuje delegata locationManager:didEnterRegion na iOS.
Często zadawane pytania
GPS w smartfonie to wbudowany odbiornik sygnałów satelitarnego systemu nawigacyjnego, określający współrzędne z dokładnością do 3-5 metrów. Na urządzeniach dostępne są również GLONASS, Galileo i BeiDou w celu zwiększenia dokładności i szybkości pozycjonowania.
GPS to tylko metoda satelitarna określania współrzędnych. Usługi lokalizacyjne łączą GPS, pozycjonowanie Wi-Fi i dane ze stacji bazowych sieci komórkowej dla szybszego i bardziej energooszczędnego określania położenia, szczególnie wewnątrz pomieszczeń.
Wywołaj requestWhenInUseAuthorization() lub requestAlwaysAuthorization() na instancji CLLocationManager. Wcześniej dodaj NSLocationWhenInUseUsageDescription w Info.plist z zrozumiałym tekstem uzasadnienia użycia geolokalizacji.
Używaj FusedLocationProviderClient na Androidzie i significant-change location service na iOS. Zwiększ interwał między żądaniami do 10-30 sekund, wyłączaj aktualizacje, gdy ekran jest wyłączony, i stosuj wsadowe wysyłanie współrzędnych na serwer.
Tak, bez GPS można określić przybliżone położenie na podstawie Wi-Fi (dokładność 10-50 metrów) lub stacji bazowych sieci komórkowej (dokładność 100-5000 metrów). Na Androidzie do tego celu używa się ACCESS_COARSE_LOCATION.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również