Moja aplikacja, która działała dobrze na iOS 7, nie działa z zestawem SDK iOS 8.
CLLocationManager
nie zwraca lokalizacji i nie widzę mojej aplikacji w Ustawieniach -> Usługi lokalizacji . Przeszukałem ten problem w Google, ale nic nie wyszło. Co może być nie tak?
Odpowiedzi:
Skończyłem rozwiązywanie własnego problemu.
Najwyraźniej w iOS 8 SDK
requestAlwaysAuthorization
(dla lokalizacji w tle) lubrequestWhenInUseAuthorization
(lokalizacja tylko na pierwszym planie)CLLocationManager
wymagane jest połączenie przed rozpoczęciem aktualizacji lokalizacji.Nie musi też być
NSLocationAlwaysUsageDescription
alboNSLocationWhenInUseUsageDescription
kluczemInfo.plist
z wiadomości mają być wyświetlane w wierszu polecenia. Dodanie ich rozwiązało mój problem.Mam nadzieję, że pomoże to komuś innemu.
EDYCJA: Aby uzyskać bardziej szczegółowe informacje, spójrz na: Core-Location-Manager-Changes-in-ios-8
źródło
Wyciągałam włosy z tym samym problemem. Xcode wyświetla błąd:
Ale nawet jeśli zastosujesz jedną z powyższych metod, nie wyświetli monitu, chyba że w info.plist znajduje się wpis dla
NSLocationAlwaysUsageDescription
lubNSLocationWhenInUseUsageDescription
.Dodaj następujące wiersze do info.plist, gdzie wartości ciągów reprezentują powód, dla którego musisz uzyskać dostęp do lokalizacji użytkowników
Myślę, że tych wpisów mogło brakować, odkąd rozpocząłem ten projekt w Xcode 5. Domyślam się, że Xcode 6 może dodawać domyślne wpisy dla tych kluczy, ale nie zostały potwierdzone.
Więcej informacji na temat tych dwóch ustawień można znaleźć tutaj
źródło
Aby upewnić się, że jest to wstecznie kompatybilne z iOS 7, powinieneś sprawdzić, czy użytkownik korzysta z iOS 8 lub iOS 7. Na przykład:
źródło
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
requestAlwaysAuthorization
jest metoda. Mój dodatkowy rozwiązaniem było wykorzystanie tej linii wif
rachunku zamiast normalnego wywołania metody:[self.locationManager performSelector:@selector(requestAlwaysAuthorization)];
. Może jest to oczywiste dla innych ludzi, ale zajęło mi to trochę czasu, aby się zorientować. Myślę, że to właściwe rozwiązanie do czasu wydania ostatecznego Xcode 6.__IPHONE_OS_VERSION_MAX_ALLOWED
(#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
)I do Twojego pliku info.plist
źródło
Według dokumentów Apple:
Począwszy od systemu iOS 8, wymagana jest obecność wartości klucza
NSLocationWhenInUseUsageDescription
lubNSLocationAlwaysUsageDescription
w pliku Info.plist aplikacji. Konieczne jest również zwrócenie się do użytkownika o zgodę przed rejestracją aktualizacji lokalizacji, dzwoniąc[self.myLocationManager requestWhenInUseAuthorization]
lub[self.myLocationManager requestAlwaysAuthorization]
zależnie od potrzeb. Ciąg wprowadzony do Info.plist zostanie wyświetlony w kolejnym oknie dialogowym.Jeśli użytkownik udzieli pozwolenia, będzie to działać jak zwykle. Jeśli odmówią pozwolenia, delegat nie jest informowany o aktualizacjach lokalizacji.
źródło
Oba klucze biorą ciąg
źródło
Moje rozwiązanie, które można skompilować w Xcode 5:
źródło
Stary kod zapytania o lokalizację nie działa w systemie iOS 8. Możesz wypróbować tę metodę autoryzacji lokalizacji:
źródło
W iOS 8 musisz zrobić dwie dodatkowe rzeczy, aby uruchomić lokalizację: Dodaj klucz do Info.plist i poproś o autoryzację od menedżera lokalizacji z prośbą o uruchomienie
info.plist:
Dodaj to do swojego kodu
źródło
Jeden typowy błąd dla programistów Swift:
Najpierw upewnij się, że dodałeś wartość do plist dla jednego
NSLocationWhenInUseUsageDescription
lub dwóchNSLocationAlwaysUsageDescription
.Jeśli nadal nie widzisz wyskakującego okna z prośbą o autoryzację, sprawdź, czy wstawiasz wiersz
var locationManager = CLLocationManager()
wviewDidLoad
metodzie kontrolera widoku . Jeśli to zrobisz, nawet jeśli zadzwoniszlocationManager.requestWhenInUseAuthorization()
, nic się nie pojawi. Wynika to z faktu, że po wykonaniu viewDidLoad zmienna locationManager jest zwalniana (usuwana).Rozwiązaniem jest zlokalizowanie linii
var locationManager = CLLocationManager()
na górze metody klasy.źródło
Wcześniej
[locationManager startUpdatingLocation];
dodaj żądanie usług lokalizacyjnych iOS8:Edytuj aplikację
Info.plist
i dodaj kluczNSLocationAlwaysUsageDescription
z wartością ciągu, która będzie wyświetlana użytkownikowi (na przykładWe do our best to preserve your battery life.
)Jeśli Twoja aplikacja potrzebuje usług lokalizacyjnych tylko wtedy, gdy aplikacja jest otwarta, zamień:
requestAlwaysAuthorization
zrequestWhenInUseAuthorization
iNSLocationAlwaysUsageDescription
zNSLocationWhenInUseUsageDescription
.źródło
Pracowałem nad aplikacją, która została uaktualniona do iOS 8, a usługi lokalizacyjne przestały działać. Prawdopodobnie pojawi się błąd w obszarze debugowania w następujący sposób:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
Zrobiłem najmniej inwazyjną procedurę. Najpierw dodaj
NSLocationAlwaysUsageDescription
wpis do swojej info.plist:Zauważ, że nie podałem wartości tego klucza. To nadal działa i nie martwię się, ponieważ jest to aplikacja wewnętrzna. Jest też tytuł z prośbą o korzystanie z usług lokalizacyjnych, więc nie chciałem robić nic zbędnego.
Następnie utworzyłem warunek dla iOS 8:
Następnie
locationManager:didChangeAuthorizationStatus:
metoda wywołuje:A teraz wszystko działa dobrze. Jak zawsze sprawdź dokumentację .
źródło
Rozwiązanie z kompatybilnością wsteczną:
Skonfiguruj klucz NSLocationWhenInUseUsageDescription w Info.plist
źródło
locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error
. Zapomniał jednak dodać startUpdatingLocation do instrukcji if, więc po ich zaakceptowaniu lub odrzuceniu tak naprawdę nie wywołuje startUpdateLocation.Rozwiązanie z wsteczną kompatybilnością, które nie generuje ostrzeżeń Xcode:
Ustaw
NSLocationWhenInUseUsageDescription
klucz w swoimInfo.plist
.W wersji iOS 11.0+ :
NSLocationAlwaysAndWhenInUseUsageDescription
klucz instalacyjny w swoimInfo.plist
. wraz z innymi 2 kluczami.źródło
To jest problem z iOS 8 Dodaj to do swojego kodu
i do info.plist:
źródło
NSLocationUsageDescription
nie jest używany w iOS8 +Aby uzyskać dostęp do lokalizacji użytkownika w iOS 8, musisz dodać,
Spowoduje to zapytanie użytkownika o pozwolenie na uzyskanie jego aktualnej lokalizacji.
źródło
Procedura celu C Postępuj zgodnie z poniższymi instrukcjami:
W systemie iOS-11 W systemie iOS 11 zapoznaj się z odpowiedzią: Dostęp do lokalizacji w systemie iOS 11
Musisz dodać dwa klucze do listy i podać komunikat jak na poniższym obrazku:
Dla iOS-10 i niższych:
Deleguj metody
Szybka procedura
Postępuj zgodnie z poniższymi instrukcjami:
W systemie iOS-11 W systemie iOS 11 zapoznaj się z odpowiedzią: Dostęp do lokalizacji w systemie iOS 11
Musisz dodać dwa klucze do listy i podać komunikat jak na poniższym obrazku:
Dla iOS-10 i niższych:
Deleguj metody
źródło
Dla tych, którzy używają Xamarin , musiałem dodać klucz
NSLocationWhenInUseUsageDescription
ręcznie do info.plist, ponieważ nie był on dostępny w menu rozwijanych w Xamarin 5.5.3 Build 6 lub XCode 6.1 -NSLocationUsageDescription
był tylko na liście, a to spowodowało, żeCLLocationManager
nadal zawodzić cicho.źródło
źródło
Mały pomocnik dla wszystkich, którzy mają więcej niż jeden plik Info.plist ...
Dodanie potrzebnego znacznika do wszystkich plików Info.plist w bieżącym katalogu (i podfolderach).
Innym jest:
Dodanie twojego opisu do wszystkich plików.
źródło
Informacje o kluczach kakaowych przechowuj zawsze w zasięgu ręki, aby uzyskać te aktualizacje, oto link:
https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26
Cieszyć się.
źródło
W iOS9 pojawia się podobny błąd (praca z Xcode 7 i Swift 2): Próbuję uruchomić aktualizacje lokalizacji MapKit bez monitowania o autoryzację lokalizacji. Należy wywołać - [CLLocationManager requestWhenInUseAuthorization] lub - [CLLocationManager requestAlwaysAuthorization]. Śledziłem samouczek, ale nauczyciel korzystał z iOS8 i Swift 1.2. Istnieją pewne zmiany w Xcode 7 i Swift 2, znalazłem ten kod i działa dla mnie dobrze (jeśli ktoś potrzebuje pomocy):
Na koniec umieściłem to w info.plist: Lista właściwości informacji: NSLocationWhenInUseUsageDescription Wartość: Aplikacja potrzebuje serwerów lokalizacji dla personelu
źródło
Aby uzyskać dostęp do lokalizacji użytkowników w iOS. Musisz dodać dwa klucze
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
do pliku Info.plist.
Zobacz to poniżej obrazu.
źródło
Dodaj klucz
NSLocationWhenInUseUsageDescription
lubNSLocationAlwaysUsageDescription
(użycie GPS w tle) ze sznurkiem z prośbą o użycie GPS na każdyminfo.plist
z każdego celu.Poproś o pozwolenie, uruchamiając:
[self initLocationManager: locationManager];
Gdzie
initLocationManager
jest:Pamiętaj, że jeśli nie ma kluczy
info.plist
dla każdego celu, aplikacja nie zapyta użytkownika.if
Zapewnia kompatybilność z iOS 7 irespondsToSelector:
metoda gwarantuje kompatybilność w przyszłości, a nie tylko rozwiązania problemu dla iOS 7 i 8.źródło
Problemem było dla mnie to, że klasa, która była tą klasą,
CLLocationManagerDelegate
była prywatna, co uniemożliwiło wywołanie wszystkich metod delegowania. Chyba nie jest to bardzo częsta sytuacja, ale pomyślałem, że wspomnę o tym na wypadek, gdyby ktokolwiek pomógł.źródło
Dodam te klucz
InfoPlist.strings
w iOS 8.4, mini iPad 2. To działa też. Nie ustawiam żadnego klucza, na przykładNSLocationWhenInUseUsageDescription
w moimInfo.plist
.InfoPlist.strings :
as in iOS 7
Oparty na tym wątku , jak powiedział , można zlokalizować w pliku InfoPlist.strings. W moim teście klucze te można skonfigurować bezpośrednio w plikuInfoPlist.strings
.AKTUALIZACJA:
Myślę, że
@IOS
metoda jest lepsza. Dodaj klucz doInfo.plist
pustej wartości i dodaj zlokalizowane ciągi doInfoPlist.strings
.źródło