Swift Academy · Lekcja

Pobieranie lokalizacji użytkownika

Odbieranie aktualizacji lokalizacji za pomocą CLLocationManager.

Lekcja 2 z 413 kroki

Pobieranie lokalizacji użytkownika to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Swift Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Swift Academy zawiera 4 lekcji w sumie.

Uruchamianie aktualizacji lokalizacji

Po uzyskaniu autoryzacji wywołaj startUpdatingLocation(), aby rozpocząć odbieranie ciągłego strumienia pomiarów lokalizacji. Menedżer przekazuje je za pośrednictwem delegata. Gdy aktualizacje nie są już potrzebne, zawsze wywołuj stopUpdatingLocation(), aby oszczędzać baterię.

manager.startUpdatingLocation()
// ... later
manager.stopUpdatingLocation()

Odbieranie lokalizacji w delegacie

Nowe pomiary są dostarczane w locationManager(_:didUpdateLocations:). Tablica jest uporządkowana od najstarszego do najnowszego elementu, dlatego ostatni element zawiera najnowszą lokalizację.

func locationManager(_ m: CLLocationManager,
                     didUpdateLocations locations: [CLLocation]) {
    guard let latest = locations.last else { return }
    print(latest.coordinate.latitude, latest.coordinate.longitude)
}

Obiekt CLLocation

Każdy pomiar jest obiektem CLLocation zawierającym znacznie więcej niż same współrzędne: coordinate, altitude, speed, course, timestamp oraz wartości dokładności. Należy przeanalizować te dane, aby określić, czy pomiar jest wystarczająco dobry.

func describe(_ loc: CLLocation) {
    print("lat:", loc.coordinate.latitude)
    print("lon:", loc.coordinate.longitude)
    print("alt:", loc.altitude)
    print("when:", loc.timestamp)
}

Żądana dokładność

Ustaw desiredAccuracy, aby określić wymaganą precyzję pomiarów dla Core Location. Większa dokładność zużywa więcej energii. Dostępne stałe to między innymi kCLLocationAccuracyBest, kCLLocationAccuracyNearestTenMeters, kCLLocationAccuracyHundredMeters i kCLLocationAccuracyKilometer.

manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters

Filtr odległości

Użyj distanceFilter, aby wstrzymać aktualizacje, dopóki urządzenie nie przemieści się o co najmniej określoną liczbę metrów. Ogranicza to szum i oszczędza energię w przypadkach, które nie wymagają rejestrowania każdego niewielkiego ruchu.

manager.distanceFilter = 50 // meters

Ocena jakości pomiaru

Właściwość horizontalAccuracy określa promień obszaru ufności w metrach. Wartość ujemna oznacza nieprawidłowy pomiar. Należy również odrzucać nieaktualne pomiary, sprawdzając, jak dawno został zarejestrowany znacznik timestamp.

func isUsable(_ loc: CLLocation) -> Bool {
    guard loc.horizontalAccuracy >= 0 else { return false }
    let age = -loc.timestamp.timeIntervalSinceNow
    return age < 15 && loc.horizontalAccuracy < 100
}

Pobieranie pojedynczej lokalizacji

Jeśli potrzebny jest tylko pojedynczy pomiar, a nie ciągły strumień, wywołaj requestLocation(). Menedżer przekaże jedną lokalizację do delegata, a następnie automatycznie się zatrzyma. Jest to rozwiązanie bardziej oszczędne dla baterii niż uruchamianie ciągłych aktualizacji.

manager.requestLocation()

Obsługa błędów lokalizacji

Błędy są zgłaszane w locationManager(_:didFailWithError:). Częstym błędem jest CLError.locationUnknown, który zazwyczaj ma charakter przejściowy — należy nadal czekać. CLError.denied oznacza cofnięcie uprawnień i konieczność zatrzymania aktualizacji.

func locationManager(_ m: CLLocationManager,
                     didFailWithError error: Error) {
    if let clErr = error as? CLError, clErr.code == .denied {
        m.stopUpdatingLocation()
    }
}

Monitorowanie znaczących zmian

Do śledzenia zgrubnej lokalizacji przy niskim zużyciu energii, które może wybudzić aplikację w tle, użyj startMonitoringSignificantLocationChanges(). Aktualizacja jest wywoływana dopiero po przemieszczeniu się urządzenia o około 500 metrów, dlatego rozwiązanie to dobrze sprawdza się w funkcjach zależnych od regionu.

manager.startMonitoringSignificantLocationChanges()

Kierunek i kurs

W przypadku funkcji kompasu startUpdatingHeading() dostarcza kierunek magnetyczny lub geograficzny za pośrednictwem locationManager(_:didUpdateHeading:). Należy pamiętać, że CLLocation.course (kierunek przemieszczania się) różni się od kierunku urządzenia, czyli jego orientacji.

func locationManager(_ m: CLLocationManager,
                     didUpdateHeading newHeading: CLHeading) {
    print("Heading:", newHeading.trueHeading)
}

Obliczanie odległości między punktami

CLLocation może zmierzyć odległość w linii prostej do innej lokalizacji za pomocą distance(from:), zwracając wynik w metrach. Jest to przydatne przy implementowaniu logiki bliskości bez jakiegokolwiek interfejsu mapy.

let a = CLLocation(latitude: 41.0, longitude: 28.9)
let b = CLLocation(latitude: 41.1, longitude: 29.0)
let meters = a.distance(from: b)
print("Distance:", meters)

Szybki test: pobieranie lokalizacji

Proszę sprawdzić, czy rozumieją Państwo odbieranie pomiarów lokalizacji.

Podsumowanie: pobieranie lokalizacji użytkownika

Wiedzą już Państwo, jak uzyskiwać współrzędne:

  • startUpdatingLocation() służy do odbierania strumienia pomiarów, a requestLocation() do pobrania pojedynczego pomiaru.
  • Najnowszy pomiar należy odczytywać z locations.last w delegacie.
  • Należy dostosować desiredAccuracy i distanceFilter, równoważąc zużycie energii i precyzję.
  • Przed użyciem pomiaru należy sprawdzić wartości horizontalAccuracy i timestamp.
Bezpłatny start

Ucz się Swift dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
122
Lekcje
409

Często zadawane pytania

Czy lekcja „Pobieranie lokalizacji użytkownika” jest bezpłatna?

Tak — pełny tekst „Pobieranie lokalizacji użytkownika” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Swift Academy, przejdź na CoddyKit PRO. Kurs Swift Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Pobieranie lokalizacji użytkownika”?

Odbieranie aktualizacji lokalizacji za pomocą CLLocationManager. Ćwiczysz Swift Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Swift Academy?

Nie wymagamy żadnego doświadczenia. Swift Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Pobieranie lokalizacji użytkownika”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Swift Academy?

Tak. Każda lekcja Swift Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Żądanie uprawnień do lokalizacji
  2. Pobieranie lokalizacji użytkownika
  3. Wyświetlanie map w SwiftUI
  4. Geokodowanie i regiony
← Powrót do Swift Academy