Usługi lokalizacji nie działają w iOS 11


83

Właśnie przebudowałem moją aplikację za pomocą zestawu SDK iOS 11, próbując usunąć to, blue bannerco 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ś?


Dodaj NSLocationAlwaysAndWhenInUseUsageDescription w Info.plist
Jayprakash Dubey

Odpowiedzi:


156

Wydawałoby się, że firma Apple dodała kolejną funkcję prywatności. Użytkownik może teraz zastąpić naszą requestAlwaysAuthorizationi obniżyć ją do requestWhenInUseAuthorization- 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:

Ta aplikacja próbowała uzyskać dostęp do danych wrażliwych na prywatność bez opisu użytkowania. Aplikacja Info.plist musi zawierać klucze NSLocationAlwaysAndWhenInUseUsageDescription i NSLocationWhenInUseUsageDescription z wartościami ciągów wyjaśniającymi użytkownikowi, w jaki sposób aplikacja używa tych danych

Co bezpośrednio przeczy komentarzowi, który znalazłem w zaktualizowanym CLLocationManager.hpliku. Więc stworzyłem radar.

Dobra wiadomość, jeśli zastosujesz się do porad konsoli debugowania, IE. dodaj zarówno nowy klucz, jak NSLocationAlwaysAndWhenInUseUsageDescriptioni jeden ze starych kluczy NSLocationWhenInUseUsageDescription, usługi lokalizacyjne zaczną ponownie działać.


2
Mam bardzo podobną sytuację. Tylko testuję w iOS 10.2 i NSLocationAlwaysUsageDescriptiondodałem do mojej Info.plist, której potrzebuję. Ale pojawia się powyższy komunikat w konsoli z informacją, że muszę również dodać NSLocationWhenInUseUsageDescription.
Isuru,

7
Niestety, użytkownik otrzymuje teraz dialog z trzema odpowiedziami, gdzie najbardziej prawdopodobne jest, że zostanie trafiony z powodu niecierpliwości użytkownika do rozpoczęcia pracy: „Tylko podczas korzystania z aplikacji”. Co spowoduje, że aplikacje, które wymagają zawsze w użyciu, będą bezużyteczne, chyba że użytkownik przejdzie później przez wszystkie kłopoty związane ze zmianą ustawienia. Przynajmniej „Zawsze zezwalaj” powinno być najlepszym wyborem, gdy o to prosi aplikacja.
Hans Terje Bakke

1
Dodałem wszystkie trzy klucze opisu i nadal nie otrzymuję aktualizacji lokalizacji. Dodaję locationmanagerdelgate w viewwillAppear i usuwam delegata w viewwilldisapper. Jeśli przejdę do ustawienia i wybiorę już wybraną opcję Zezwalaj zawsze. Aktualizację dostaję tylko raz i więcej. Jakiś pomysł jak to naprawić. Z góry dziękuję!!
LoveMeSomeFood

@Uma - dzwonisz startUpdatingLocationczy requestLocation?
William George

@WilliamGeorge UżywamstartUpdatingLocation
LoveMeSomeFood

44

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


1
Dodałem wszystkie trzy klucze opisu i nadal nie otrzymuję aktualizacji lokalizacji. Dodaję locationmanagerdelgate viewwillAppear i usuwam delegata w viewwilldisapper. Jeśli przejdę do ustawień i wybiorę już wybrane Allow Always. Aktualizację dostaję tylko raz i więcej. Jakiś pomysł jak to naprawić. Z góry dziękuję!!
LoveMeSomeFood

Dodam teraz mój kod, aby zilustrować, co działa dla mnie:
Heider Sati

Mam taki sam kod jak Twój. Mimo to nie otrzymuję aktualizacji lokalizacji, chyba że wrócę do domu i wrócę do aplikacji. Dzieje się tak tylko w iOS 11. Nadal nie mogłem zrozumieć, dlaczego.
LoveMeSomeFood

Możesz rzucić okiem na ten wątek? stackoverflow.com/questions/46616496/… . Dziękuję Ci!
LoveMeSomeFood

Cześć Uma, Jeden z naszych użytkowników zgłosił ten sam problem na jednym z urządzeń, badam to i skontaktuję się z Tobą, myślę, że IOS11 sprawia, że ​​jesteśmy w tej chwili bardzo zajęci ... Będę musiał się dowiedzieć i rozwiąż to jak najszybciej, proszę o wyrozumiałość ... dzięki
Heider Sati,

23

pracując pod iOS11 odkryłem, że Info.plist potrzebuje co najmniej NSLocationAlwaysAndWhenInUseUsageDescription w Info.plist:

wprowadź opis obrazu tutaj

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()i locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) po cichu zawiodą.

Ujęcie pokazujące niemieckie tłumaczenie jako przykład:

wprowadź opis obrazu tutaj

Mam nadzieję, że to zaoszczędzi ci czasu, gdy się potykasz.


Dzięki, @iDoc! To zaoszczędziło mi dużo czasu.
Reinhard Männer

To jest prawidłowa odpowiedź, w iOS 11 jest obowiązek zlokalizowania kluczy prywatności lokalizacji.
jberlana

Po 10 godzinach docieram do tego postu ... tnx
1110

17

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>  

Dzięki vipulkumarmehta
Keshav Gera

13

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 do Info.plist(aby obsługiwać <iOS 11)

4. Zadzwoń requestWhenInUseAuthorization() PRZED requestAlwaysAuthorization( )

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


1
Nic się z tym nie zmieniło :(
Cemal BAYRI

Rozwiązałem, włączając flagę allowBackgroundLocationUpdates. Zobacz stackoverflow.com/a/50733860/2610888
Andrea Gorrieri

6

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>

5

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)
    }
}

2

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

allowBackgroundLocationUpdates definitywnie rozwiązało mój problem, nie mogę uwierzyć, że nie został zgłoszony w innych odpowiedziach i na forach. Z dokumentów Apple: „Używasz tej właściwości do programowego włączania i wyłączania aktualizacji w tle. Na przykład możesz ustawić tę właściwość na wartość true tylko wtedy, gdy użytkownik włączy funkcje w Twojej aplikacji, w których są potrzebne aktualizacje w tle”. „Wartość domyślna tej właściwości to fałsz”. developer.apple.com/documentation/corelocation/…
Andrea Gorrieri
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.