0Pricing
Swift Academy · Lekcja

Żądanie uprawnień do lokalizacji

Prawidłowa obsługa uprawnień i prywatności.

Żądanie uprawnień do lokalizacji to bezpłatna lekcja Swift Academy na CoddyKit. To lekcja 1 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.

Dlaczego lokalizacja wymaga uprawnień

Na platformach Apple dostęp do lokalizacji użytkownika jest operacją wrażliwą z punktu widzenia prywatności. Aplikacja musi jawnie poprosić o autoryzację, zanim Core Location zacznie dostarczać jakiekolwiek współrzędne. Przy pierwszej prośbie system wyświetla okno dialogowe z prośbą o pozwolenie.

  • Użytkownik przyznaje autoryzację osobno każdej aplikacji.
  • Nie można programowo ominąć tego procesu.
import CoreLocation

let manager = CLLocationManager()

Klucze opisów użycia w Info.plist

Przed poproszeniem o autoryzację należy dodać do Info.plist ciąg znaków opisu użycia. Te ciągi są wyświetlane użytkownikowi w oknie dialogowym uprawnień. Dwa najważniejsze klucze to:

  • NSLocationWhenInUseUsageDescription — dostęp wyłącznie na pierwszym planie.
  • NSLocationAlwaysAndWhenInUseUsageDescription — także dostęp w tle.

Pominięcie właściwego klucza powoduje ciche niepowodzenie żądania albo awarię aplikacji.

<!-- Info.plist -->
<key>NSLocationWhenInUseUsageDescription</key>
<string>We use your location to show nearby places.</string>

Tworzenie CLLocationManager

CLLocationManager to główny obiekt koordynujący usługi lokalizacji. Należy utworzyć jedną instancję, przechowywać do niej silne odwołanie i przypisać delegata, aby odbierać wywołania zwrotne.

final class LocationService: NSObject {
    let manager = CLLocationManager()

    override init() {
        super.init()
        manager.delegate = self
    }
}

Żądanie autoryzacji When-In-Use

Wywołaj requestWhenInUseAuthorization(), aby poprosić o dostęp na pierwszym planie. System wyświetla okno dialogowe tylko raz, a następnie zapamiętuje wybór. Jeśli decyzja została już podjęta, wywołanie nie wykonuje żadnej operacji.

func requestPermission() {
    manager.requestWhenInUseAuthorization()
}

Żądanie autoryzacji Always

W przypadku aktualizacji w tle (geofencingu i ciągłego śledzenia) należy wywołać requestAlwaysAuthorization(). Apple wymaga, aby najpierw uzyskać autoryzację When-In-Use, a dopiero potem rozszerzyć ją do Always. Należy korzystać z tego rozwiązania oszczędnie i uzasadnić je w opisie użycia.

func requestAlways() {
    manager.requestAlwaysAuthorization()
}

Odczytywanie stanu autoryzacji

Bieżący stan uprawnień jest dostępny w manager.authorizationStatus (jest to właściwość instancji w iOS 14 i nowszych). Możliwe wartości to między innymi .notDetermined, .denied, .restricted, .authorizedWhenInUse i .authorizedAlways.

let status = manager.authorizationStatus
switch status {
case .notDetermined: print("Ask the user")
case .denied, .restricted: print("No access")
case .authorizedWhenInUse, .authorizedAlways: print("Good to go")
@unknown default: break
}

CLLocationManagerDelegate

Zmiany autoryzacji są przekazywane asynchronicznie przez delegata. Należy zaimplementować locationManagerDidChangeAuthorization(_:), aby reagować na wybór użytkownika. Nie wolno zakładać, że uprawnienia zostaną przyznane natychmiast po wysłaniu żądania.

extension LocationService: CLLocationManagerDelegate {
    func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
        switch manager.authorizationStatus {
        case .authorizedWhenInUse, .authorizedAlways:
            manager.startUpdatingLocation()
        default:
            print("Not authorized")
        }
    }
}

Obsługa stanu Denied lub Restricted

Jeśli użytkownik odmówi dostępu, nie można ponownie wyświetlić prośby. Należy zamiast tego wykryć stan .denied i pokierować użytkownika do aplikacji Settings. Stan .restricted oznacza, że dostęp został zablokowany przez kontrolę rodzicielską lub profil MDM; również tego ograniczenia nie można usunąć z poziomu aplikacji.

func handle(_ status: CLAuthorizationStatus) {
    if status == .denied {
        // Deep-link the user to Settings > Privacy > Location
        print("Open Settings to enable location")
    }
}

Autoryzacja dokładności (precyzyjna a zmniejszona)

Od iOS 14 użytkownicy mogą przyznać wyłącznie zmniejszoną (przybliżoną) dokładność. Należy sprawdzić manager.accuracyAuthorization. Jeśli rzeczywiście potrzebne są precyzyjne dane (np. do nawigacji zakręt po zakręcie), należy wywołać requestTemporaryFullAccuracyAuthorization(withPurposeKey:) z kluczem zdefiniowanym w Info.plist.

if manager.accuracyAuthorization == .reducedAccuracy {
    manager.requestTemporaryFullAccuracyAuthorization(
        withPurposeKey: "PreciseForNavigation"
    )
}

Sprawdzanie, czy usługi lokalizacji są włączone

Niezależnie od uprawnień aplikacji przełącznik usług lokalizacji dla całego urządzenia może być wyłączony. Należy sprawdzać CLLocationManager.locationServicesEnabled() w kolejce działającej w tle, ponieważ wywołanie tej metody w głównym wątku może blokować jego działanie. Jeśli usługi są wyłączone, żadna aplikacja nie otrzymuje lokalizacji.

DispatchQueue.global().async {
    if CLLocationManager.locationServicesEnabled() {
        print("System location is on")
    } else {
        print("System location is off")
    }
}

Pełny przebieg autoryzacji

Łącząc wszystkie elementy: należy utworzyć menedżera, ustawić delegata, poprosić o autoryzację When-In-Use, a następnie rozpocząć aktualizacje w wywołaniu zwrotnym autoryzacji. Jest to kanoniczny schemat dla każdej funkcji korzystającej z lokalizacji.

final class LocationService: NSObject, CLLocationManagerDelegate {
    let manager = CLLocationManager()
    override init() {
        super.init()
        manager.delegate = self
        manager.requestWhenInUseAuthorization()
    }
    func locationManagerDidChangeAuthorization(_ m: CLLocationManager) {
        if m.authorizationStatus == .authorizedWhenInUse {
            m.startUpdatingLocation()
        }
    }
}

Szybki test: autoryzacja

Proszę sprawdzić, czy rozumieją Państwo przebieg autoryzacji.

Podsumowanie: żądanie autoryzacji

Poznali Państwo bezpieczny sposób żądania uprawnień do lokalizacji:

  • Należy dodać NSLocationWhenInUseUsageDescription (oraz wariant Always, jeśli jest potrzebny) do Info.plist.
  • Należy utworzyć CLLocationManager, przechowywać do niego silne odwołanie i ustawić jego delegata.
  • Należy wywołać requestWhenInUseAuthorization(), a następnie rozszerzyć autoryzację do Always tylko wtedy, gdy jest to wymagane.
  • Należy reagować w locationManagerDidChangeAuthorization(_:) i obsługiwać przypadki odmowy, ograniczenia oraz zmniejszonej dokładności.

Często zadawane pytania

Czy lekcja „Żądanie uprawnień do lokalizacji” jest bezpłatna?

Tak — pełny tekst „Żądanie uprawnień do lokalizacji” 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 „Żądanie uprawnień do lokalizacji”?

Prawidłowa obsługa uprawnień i prywatności. Ć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 1 z 4.

Ile czasu zajmuje lekcja „Żądanie uprawnień do lokalizacji”?

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