Significant Location Change (SLC) to usługa iOS do monitorowania dużych przemieszczeń urządzenia, która powiadamia aplikację tylko przy znaczących zmianach współrzędnych geograficznych. W przeciwieństwie do śledzenia GPS w czasie rzeczywistym, SLC wykorzystuje stacje bazowe telefonii komórkowej do określania lokalizacji, co zapewnia minimalne zużycie energii. Według dokumentacji Apple Developer, 2025, Significant Location Change pozwala aplikacji otrzymywać aktualizacje geopozycji bez ciągłej pracy GPS, oszczędzając do 90% baterii w porównaniu z ciągłym śledzeniem.
Najważniejsze
Significant Location Change (SLC) to energooszczędna usługa geolokalizacji iOS wbudowana we framework Core Location. Jest przeznaczona dla aplikacji, które muszą śledzić duże przemieszczenia użytkownika bez ciągłego używania modułu GPS. SLC aktywuje się automatycznie przy przejściu między stacjami bazowymi telefonii komórkowej i powiadamia aplikację przez delegata CLLocationManagerDelegate metodą didUpdateLocations.
W przeciwieństwie do GPS-level tracking (standardowy startUpdatingLocation), SLC nie wymaga ciągłej aktywności procesora i układu GPS. iOS wykorzystuje sygnały stacji bazowych do określenia przybliżonej lokalizacji i uruchamia aplikację tylko po wykryciu znaczącej różnicy współrzędnych. Pozwala to aplikacji „spać” między aktualizacjami, zużywając minimum energii.
SLC jest dostępne na wszystkich urządzeniach z modemem komórkowym od iOS 5. Na iPod Touch i iPad Wi-Fi Only usługa jest niedostępna, ponieważ do określania współrzędnych wykorzystywane są właśnie stacje bazowe. Core Location automatycznie decyduje, które zdarzenia uznać za znaczące — programista nie może skonfigurować czułości SLC ani określić minimalnej odległości dla wyzwalacza.
SLC idealnie nadaje się do aplikacji, które nie potrzebują wysokiej dokładności geopozycji: trackery pogody, usługi dostawy, aplikacje do wyszukiwania najbliższych obiektów, analityka odwiedzanych miejsc. SLC jest również używane przez system iOS do aktywacji geostref (Geofencing) w trybie oszczędzania energii. Aplikacje nawigacyjne wymagają dokładniejszego śledzenia GPS.
Significant Location Change działa na podstawie analizy identyfikatorów stacji bazowych (Cell ID), które urządzenie otrzymuje przy podłączeniu do sieci. iOS utrzymuje bazę danych współrzędnych stacji bazowych i może określić przybliżoną lokalizację bez włączania GPS. Gdy urządzenie przechodzi do nowej stacji, system porównuje nową i poprzednią lokalizację, a jeśli różnica jest znacząca, uruchamia aplikację do przetworzenia zdarzenia.
System wykorzystuje podejście klastrowe: przestrzeń geograficzna jest dzielona na klastry o określonym promieniu. SLC generuje zdarzenie tylko przy przekroczeniu granicy klastra, a nie przy każdym mikro-przemieszczeniu wewnątrz niego. Zapobiega to lawinowym wywołaniom aplikacji podczas poruszania się w obrębie jednej strefy zasięgu (np. w budynku lub dzielnicy). Dokładność SLC wynosi od 500 metrów do kilku kilometrów w zależności od gęstości stacji bazowych.
Gdy iOS określi znaczącą zmianę, budzi aplikację ze stanu tła (jeśli nie jest uruchomiona) i przekazuje zdarzenie delegatowi Core Location. Aplikacja otrzymuje krótki czas na przetworzenie (około 10–30 sekund czasu w tle) — w tym czasie należy zdążyć przetworzyć współrzędne i, w razie potrzeby, zaplanować dokładniejszą aktualizację przez GPS.
SLC ma przywilej budzenia aplikacji ze stanu Suspended lub Background. Jeśli aplikacja została zabita przez system z powodu braku pamięci, SLC uruchomi ją ponownie (relaunch) w tle. W tym celu aplikacja musi być subskrybowana na UIApplication.LaunchOptionsKey.location w metodzie didFinishLaunchingWithOptions. Po przetworzeniu zdarzenia system może ponownie przełączyć aplikację w stan Suspended.
Wyzwalacze SLC są określane wyłącznie przez system iOS — programista nie może programowo wpływać na to, jaką zmianę współrzędnych uznać za „znaczącą”. Istnieją jednak udokumentowane scenariusze, w których SLC gwarantowanie generuje zdarzenie. Zrozumienie tych wyzwalaczy pomaga programiście zaprojektować poprawne działanie aplikacji.
Cell tower change — główny wyzwalacz SLC. Gdy urządzenie przełącza się między stacjami bazowymi (podczas poruszania się po mieście, trasie), system sprawdza, czy współrzędne między starą a nową stacją wystarczająco się zmieniły. Jeśli tak — generowane jest zdarzenie. W warunkach miejskich z gęstą siecią stacji SLC może działać co 1–3 kilometry.
Jeśli jakakolwiek inna aplikacja lub usługa systemowa (np. „Znajdź iPhone'a”, nawigacja) włączy moduł GPS, SLC również może otrzymać aktualizację dokładnych współrzędnych. Jest to efekt uboczny: GPS określa dokładną lokalizację, a iOS przekazuje ją wszystkim aplikacjom subskrybującym SLC. Jednak poleganie na tym wyzwalaczu jest niewskazane — nie jest gwarantowane.
Chociaż SLC nie korzysta bezpośrednio z Wi-Fi, zmiana sieci Wi-Fi może pośrednio wywołać zdarzenie, jeśli urządzenie otrzyma nowe współrzędne przez Apple Location Service (lokalizacja na podstawie baz danych Wi-Fi). iOS hashuje współrzędne punktów dostępowych Wi-Fi i wykorzystuje je do doprecyzowania pozycji między zmianami stacji.
| Wyzwalacz | Gwarancja | Opóźnienie | Dokładność |
|---|---|---|---|
| Zmiana stacji bazowej | Wysoka | 1–30 s | 500 m – 3 km |
| GPS innych aplikacji | Niska | Natychmiast | Do 10 m |
| Zmiana Wi-Fi | Średnia | Do 5 min | 100–500 m |
iOS udostępnia kilka mechanizmów do uzyskiwania geolokalizacji, każdy o własnej dokładności, zużyciu energii i scenariuszach użycia. Significant Location Change zajmuje niszę między przybliżoną aproksymacją przez stacje bazowe a dokładnym śledzeniem GPS, oferując optymalny balans dla aplikacji, które nie potrzebują wysokiej dokładności w czasie rzeczywistym.
Standard Location Service (startUpdatingLocation()) wykorzystuje GPS, Wi-Fi i stacje bazowe do maksymalnie dokładnego określania współrzędnych. Dokładność do 10 metrów, ale zużycie energii jest wysokie — moduł GPS jest stale aktywny. Nadaje się do nawigacji, trackerów fitness, aplikacji AR. SLC, przeciwnie, nie używa GPS stale i ma dokładność 500 metrów i niższą.
Region Monitoring śledzi wejście i wyjście z określonych stref geograficznych. W przeciwieństwie do SLC, programista sam określa granice regionów (promień od 100 metrów). Geofencing wykorzystuje SLC jako mechanizm pomocniczy — system najpierw określa przybliżoną lokalizację przez SLC, a następnie włącza GPS do dokładnego określenia wejścia/wyjścia ze strefy. Maksymalna liczba śledzonych regionów — 20.
Visit Monitoring — specjalistyczna usługa iOS 8+, która śledzi odwiedzanie miejsc (przybycie i opuszczenie). Wykorzystuje kombinację SLC i innych sygnałów do określenia, kiedy użytkownik zatrzymał się w jakimś miejscu i kiedy je opuścił. Visit Monitoring jest bardziej energooszczędny niż SLC, ponieważ generuje mniej zdarzeń i wykorzystuje uczenie maszynowe na urządzeniu.
| Usługa | Dokładność | Zużycie energii | Tło |
|---|---|---|---|
| SLC | 500 m – 3 km | Bardzo niskie | Tak |
| Standard GPS | Do 10 m | Wysokie | Wymaga zgody |
| Geofencing | Od 100 m | Niskie | Tak |
| Visit Monitoring | Do 100 m | Bardzo niskie | Tak |
SLC to najbardziej energooszczędny sposób uzyskiwania geolokalizacji na iOS, nie licząc Visit Monitoring. Według Apple, SLC zużywa około 0,1–0,5% baterii na godzinę w typowym scenariuszu użycia, podczas gdy ciągłe śledzenie GPS może zużywać 5–10% na godzinę. Oszczędność osiągana jest dzięki temu, że moduł GPS włącza się tylko na krótki czas w celu weryfikacji współrzędnych przy każdym zdarzeniu.
iOS zarządza zużyciem energii SLC przez optymalizację baterii. Jeśli system zauważy, że aplikacja zbyt często przetwarza zdarzenia SLC (np. urządzenie porusza się pociągiem i częsta zmiana stacji generuje wiele zdarzeń), iOS może tymczasowo zmniejszyć częstotliwość powiadomień. Jest to automatyczny mechanizm — programista nie może go wyłączyć.
Z każdą główną wersją iOS Apple zaostrza politykę dostępu do geolokalizacji w tle. Od iOS 13 okno dialogowe prośby o zgodę na korzystanie z lokalizacji w tle uległo zmianie: użytkownik musi jawnie wybrać „Zawsze” (Always), a nie tylko „Podczas korzystania z aplikacji” (While Using). Bez zgody Always SLC nie będzie działać, gdy aplikacja jest w tle lub zabita przez system.
Rozważmy pełną implementację Significant Location Change w Swift. Przykład obejmuje konfigurację CLLocationManager, prośbę o zgodę Always, uruchomienie monitorowania, obsługę zdarzeń i wsparcie ponownego uruchomienia aplikacji po zabiciu przez system. Kod wykorzystuje nowoczesny Swift z async/await do przetwarzania współrzędnych i zadaniami w tle przez BGTaskScheduler.
import CoreLocation
import UIKit
class LocationManager: NSObject, CLLocationManagerDelegate {
private let manager = CLLocationManager()
override init() {
super.init()
manager.delegate = self
manager.pausesLocationUpdatesAutomatically = true
manager.desiredAccuracy = kCLLocationAccuracyThreeKilometers
}
func requestAlwaysAuthorization() {
manager.requestAlwaysAuthorization()
}
func startSignificantLocationUpdates() {
manager.startMonitoringSignificantLocationChanges()
}
func locationManager(_ manager: CLLocationManager,
didUpdateLocations locations: [CLLocation]) {
guard let location = locations.last else { return }
Task.detached {
await LocationProcessor.handleLocationUpdate(location)
}
}
func locationManager(_ manager: CLLocationManager,
didFailWithError error: Error) {
Logger.log("SLC error: \(error.localizedDescription)")
}
}
Jeśli aplikacja została zabita przez system, SLC automatycznie uruchomi ją ponownie przy wystąpieniu nowego zdarzenia. W AppDelegate należy dodać sprawdzenie uruchomienia przez zdarzenie location poprzez UIApplication.LaunchOptionsKey.location. Po ponownym uruchomieniu aplikacja powinna zainicjalizować CLLocationManager i wywołać startMonitoringSignificantLocationChanges() w celu kontynuowania monitorowania.
class AppDelegate: NSObject, UIApplicationDelegate {
private let manager = LocationManager()
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions:
[UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if launchOptions?.keys.contains(.location) == true {
Logger.log("App relaunched by SLC event")
}
manager.requestAlwaysAuthorization()
manager.startSignificantLocationUpdates()
return true
}
}
Prawidłowe użycie Significant Location Change wymaga równowagi między funkcjonalnością a energooszczędnością. Apple ściśle kontroluje dostęp do geolokalizacji w tle, a aplikacje nadużywające SLC lub używające go bez wyraźnej potrzeby ryzykują odrzucenie przy publikacji w App Store.
W Info.plist należy dodać ciągi uzasadnienia: NSLocationAlwaysAndWhenInUseUsageDescription i NSLocationWhenInUseUsageDescription. Opis powinien jasno wyjaśniać, dlaczego aplikacja potrzebuje dostępu do lokalizacji w tle. App Review czyta te ciągi i może odrzucić aplikację, jeśli uzasadnienie jest niewystarczające lub sformułowania są niejasne. Przykład: „Ta aplikacja używa SLC do aktualizacji prognozy pogody podczas Twojego przemieszczania się.”
Nie uruchamiaj kosztownych operacji (lokalizacja GPS, żądania sieciowe) przy każdym zdarzeniu SLC. SLC może generować dziesiątki zdarzeń na godzinę podczas poruszania się środkami transportu. Używaj debaunsingu: zapisuj czas ostatniej pełnej aktualizacji i pomiń przetwarzanie, jeśli od poprzedniej aktualizacji minęło mniej niż 5–10 minut. Oszczędzi to baterię i ruch sieciowy.
Do długotrwałego przetwarzania po zdarzeniu SLC używaj BGTaskScheduler. Gdy aplikacja otrzyma zdarzenie SLC, może zaplanować zadanie w tle przez BGProcessingTaskRequest lub BGAppRefreshTaskRequest. Pozwala to odłożyć operacje zasobożerne (synchronizacja z serwerem, analiza trasy) na najbliższe okno wykonania w tle, nie blokując głównego wątku odpowiedzi na SLC.
Często zadawane pytania
Significant Location Change (SLC) to energooszczędna usługa iOS do monitorowania dużych przemieszczeń urządzenia na podstawie stacji bazowych telefonii komórkowej. Zużywa do 90% mniej energii niż ciągłe śledzenie GPS i nadaje się do aplikacji, które nie potrzebują wysokiej dokładności geopozycji.
Dokładność SLC waha się od 500 metrów do 3 kilometrów w zależności od gęstości stacji bazowych. W warunkach miejskich dokładność jest wyższa (bliżej 500 m), na obszarach wiejskich — niższa (do kilku kilometrów). SLC nie jest przeznaczone do dokładnego określania współrzędnych — to zasób do przybliżonego monitorowania przemieszczeń.
Wywołaj CLLocationManager.requestAlwaysAuthorization() po dodaniu ciągu NSLocationAlwaysAndWhenInUseUsageDescription w Info.plist. Od iOS 13 użytkownik musi jawnie wybrać „Zawsze” (Always) w oknie systemowym. Bez tej zgody SLC nie działa w tle.
Tak, SLC może ponownie uruchomić aplikację, jeśli została zabita przez system z powodu braku pamięci. Przy uruchomieniu sprawdź UIApplication.LaunchOptionsKey.location w metodzie didFinishLaunchingWithOptions i wywołaj startMonitoringSignificantLocationChanges() w celu kontynuowania monitorowania.
SLC wykorzystuje tylko stacje bazowe i nie włącza GPS stale, co daje oszczędność baterii do 90%. Dokładność — od 500 m do 3 km. Standard Location Service używa GPS, Wi-Fi i stacji bazowych, dokładność do 10 m, ale zużywa znacznie więcej energii. SLC nadaje się do monitorowania w tle, GPS — do nawigacji.
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ż