Właśnie przebudowałem moją aplikację za pomocą zestawu SDK iOS 11, próbując usunąć to, blue banner
co teraz zawsze się pojawia. Pomyślałem - „Świetnie, że zadziałało” tylko po to, by odkryć, że usługi lokalizacyjne teraz w ogóle nie działają.
Aplikacja działała na iOS 10 - słyszałeś coś?
Odpowiedzi:
Wydawałoby się, że firma Apple dodała kolejną funkcję prywatności. Użytkownik może teraz zastąpić naszą
requestAlwaysAuthorization
i obniżyć ją dorequestWhenInUseAuthorization
- co oznacza, że jako programista musimy teraz dostarczyć oba opisy wInfo.plist
Okazało się, że dodali nowy klucz
NSLocationAlwaysAndWhenInUseUsageDescription
/* * Either the NSLocationAlwaysAndWhenInUseUsageDescription key or both the * NSLocationAlwaysUsageDescription and NSLocationWhenInUseUsageDescription * keys must be specified in your Info.plist; otherwise, this method will do * nothing, as your app will be assumed not to support Always authorization. */
Jednak po użyciu tego nowego klucza - usługa lokalizacji nadal nie działała, po dalszych poszukiwaniach znalazłem ten klejnot zmieszany ze wszystkimi dodatkowymi informacjami o debugowaniu:
Co bezpośrednio przeczy komentarzowi, który znalazłem w zaktualizowanym
CLLocationManager.h
pliku. Więc stworzyłem radar.Dobra wiadomość, jeśli zastosujesz się do porad konsoli debugowania, IE. dodaj zarówno nowy klucz, jak
NSLocationAlwaysAndWhenInUseUsageDescription
i jeden ze starych kluczyNSLocationWhenInUseUsageDescription
, usługi lokalizacyjne zaczną ponownie działać.źródło
NSLocationAlwaysUsageDescription
dodałem do mojej Info.plist, której potrzebuję. Ale pojawia się powyższy komunikat w konsoli z informacją, że muszę również dodaćNSLocationWhenInUseUsageDescription
.startUpdatingLocation
czyrequestLocation
?startUpdatingLocation
Aby dodać kroki, jak to naprawić:
2 sposoby:
A) Prosty sposób: wybierz plik Info.plist, dodaj właściwości, pamiętaj, że zaczynają się od PRIVCY zamiast LOCATION… dlatego dokładne nazwy tych zmiennych zaczynają się od „Prywatność - Lokalizacja…” itd., Dodaj tutaj i opisz, jak użytkownik zobaczy to w ostrzeżeniu.
B) Trudny / ciekawy / programowy sposób (bardziej mi się podoba ten sposób):
Kliknij prawym przyciskiem myszy Info.plist dla swojej aplikacji, a następnie wybierz „Wyświetl kod źródłowy”, wszystko powinno być widoczne w XML,
Postępuj zgodnie z innym formatem ...... i dodaj te właściwości w następujący sposób:
<key>NSLocationAlwaysUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSLocationWhenInUseUsageDescription</key> <string>Program requires GPS to track cars and job orders</string> <key>NSMicrophoneUsageDescription</key> <string>This app uses your Microphone to allow Voice over IP communication with the Program Admin system</string>
Zapisz, a następnie kliknij prawym przyciskiem myszy plik info.plist, a następnie wybierz opcję Lista właściwości. Powinno to spowodować przywrócenie pliku do widoku domyślnego.
EDYTOWAĆ:
Inny członek poprosił o kod, oto on:
1) W pliku .H dodaj:
@property (strong, nonatomic) CLLocationManager *LocationManager;
2) W pliku .M dodaj w funkcji ViewDidAppear ():
_LocationManager = [[CLLocationManager alloc] init]; [_LocationManager setDelegate:self]; _LocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; _LocationManager.pausesLocationUpdatesAutomatically = NO; [_LocationManager requestAlwaysAuthorization]; _LocationManager.headingFilter = 5; _LocationManager.distanceFilter = 0; [_LocationManager startUpdatingLocation]; [_LocationManager startUpdatingHeading];
To działa dobrze dla mnie, mam nadzieję, że kod zadziała również dla ciebie.
pozdrowienia
Heider
źródło
viewwillAppear
i usuwam delegata wviewwilldisapper
. Jeśli przejdę do ustawień i wybiorę już wybraneAllow Always
. Aktualizację dostaję tylko raz i więcej. Jakiś pomysł jak to naprawić. Z góry dziękuję!!pracując pod iOS11 odkryłem, że Info.plist potrzebuje co najmniej NSLocationAlwaysAndWhenInUseUsageDescription w Info.plist:
Co dziwne, gdy Twoja aplikacja jest wielojęzyczna, zlokalizowane wersje twoich ciągów wymagają wszystkich trzech kluczy wymienionych w tym poście w innym przypadku
requestAlwaysAuthorization()
ilocationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus)
po cichu zawiodą.Ujęcie pokazujące niemieckie tłumaczenie jako przykład:
Mam nadzieję, że to zaoszczędzi ci czasu, gdy się potykasz.
źródło
Praca w Swift 4.0.3
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Description</string> <key>NSLocationAlwaysUsageDescription</key> <string>Will you allow this app to always know your location?</string> <key>NSLocationWhenInUseUsageDescription</key> <string>Do you allow this app to know your current location?</string>
źródło
Wykonaj następujące kroki:
Napotkałem ten sam problem z aplikacją, która wymagała „Zawsze autoryzacji”, i rozwiązałem go, wykonując następujące kroki:
1. Dodaj
NSLocationWhenInUseUsageDescription
klucz doInfo.plist
2. Dodaj
NSLocationAlwaysAndWhenInUseUsageDescription
doInfo.plist
3. Dodaj
NSLocationAlwaysUsageDescription
doInfo.plist
(aby obsługiwać <iOS 11)4. Zadzwoń
requestWhenInUseAuthorization()
PRZEDrequestAlwaysAuthorization(
)Nie można wykonać requestAlwaysAuthorization () przed requestWhenInUseAuthorization (). Musisz przejść do tego poziomu uprawnień. Po wprowadzeniu tych zmian aktualizacje lokalizacji znów zaczęły działać poprawnie.
Więcej szczegółów można znaleźć tutaj:
https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization
źródło
Lepiej bezpiecznie niż przepraszam .. W iOS 11: Dodaj poniżej i jesteś dobry.
<key>NSLocationWhenInUseUsageDescription</key> <string>Description</string> <key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Description</string> <key>NSLocationAlwaysUsageDescription</key> <string>Description</string>
źródło
Testowano na iOS 12.2 ze Swift 5
Krok 1. Musisz dodać następujące uprawnienia prywatności w pliku plist
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>Application requires user’s location for better user experience.</string> <key>NSLocationAlwaysUsageDescription</key> <string>Application requires user’s location for better user experience.</string> <key>NSLocationWhenInUseUsageDescription</key> <string>Application requires user’s location for better user experience.</string>
Krok 2. Upewnij się, że masz następujący szybki kod, aby uzyskać aktualne lokalizacje
import UIKit import MapKit import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate { // MARK: Variables declearations @IBOutlet weak var mapView: MKMapView! var locationManager: CLLocationManager! // MARK: View Controller life cycle methods override func viewDidLoad() { super.viewDidLoad() //TODO: Make user you must add following three privacy permissions in plist //NSLocationWhenInUseUsageDescription //NSLocationAlwaysAndWhenInUseUsageDescription //NSLocationAlwaysUsageDescription getCurrentLocation() } func getCurrentLocation() { if (CLLocationManager.locationServicesEnabled()) { locationManager = CLLocationManager() locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestAlwaysAuthorization() locationManager.startUpdatingLocation() } } // MARK: Location Manager Delegate methods func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { let locationsObj = locations.last! as CLLocation print("Current location lat-long is = \(locationsObj.coordinate.latitude) \(locationsObj.coordinate.longitude)") showOnMap(location: locationsObj) } func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) { print("Get Location failed") } func showOnMap(location: CLLocation ) { let center = CLLocationCoordinate2D(latitude: location.coordinate.latitude, longitude: location.coordinate.longitude) let region = MKCoordinateRegion(center: center, span: MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)) mapView.setRegion(region, animated: true) } }
źródło
Swift: 3 Napotkałem ten sam problem. Byłem totalnie schrzaniony, szukając rozwiązania. oto, jak rozwiązałem problem.
krok 1: Plik projektu> Możliwości> tryby tła> wybierz Aktualizacja lokalizacji
krok 2: Dodaj klucze NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription do Info.plist
krok 3 :
manager.pausesLocationUpdatesAutomatically = false manager.allowsBackgroundLocationUpdates = true
źródło