Żą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
- Żądanie uprawnień do lokalizacji
- Pobieranie lokalizacji użytkownika
- Wyświetlanie map w SwiftUI
- Geokodowanie i regiony