web-dev-qa-db-de.com

Standortberechtigungsproblem iOS 11 und iOS 10

Ich habe ein Problem beim Anfordern von Standortberechtigungen vom Benutzer, wenn ich iOS11 verwende, das meine info.plist enthält

<key>NSLocationWhenInUseUsageDescription</key>
<string>When in use permissions</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>always permissions</string>
<key>NSLocationAlwaysAndWhenInUsageDescription</key>
<string>Always and in usage permissions</string>

Ich habe zwei Karten, eine für Kunden und eine für Mitarbeiter. Für Mitarbeiter muss ich wissen, wo sie sich befinden, auch wenn die App nicht ausgeführt wird oder im Hintergrund läuft (sie können sie beim Abmelden deaktivieren) und die Erlaubnis mit anfordern

locationManager.requestAlwaysAuthorization()

Für Kunden benötige ich nur Standorte, während die App in Gebrauch ist, und fordere die Erlaubnis mit an

locationManager.requestWhenInUseAuthorization()

In iOS 11 wird nur die Erlaubnis angefordert, wenn es verwendet wird und niemals die Erlaubnis, immer zu sein.

In iOS 10 hat es das richtige Verhalten.

Ich möchte folgendes Verhalten: Wenn Sie ein Kunde sind (nicht angemeldet), werden Sie nur nach der Nutzungserlaubnis gefragt. Wenn sie sich anmelden (Mitarbeiter), wird der Standort angefordert, auch wenn sie nicht verwendet werden.

Wenn jemand etwas Licht auf das werfen kann, was ich vermisse/falsch gemacht habe, wäre es sehr dankbar.

Beachten Sie Folgendes, wenn ich die Berechtigung NSLocationAlwaysUsageDescription entferne iOS10 und iOS11 haben das gleiche Problem, dass sie nicht immer die Berechtigung anfordern.

Ein bisschen mehr Klarheit. Ich habe die didChangeAuthorization-Delegatfunktion implementiert und sie wird aufgerufen, wenn ein Benutzer die Berechtigung zum Aufrufen von requestWhenInUseAuthorization() zulässt. Wenn ich jedoch die Funktion requestWhenInUseAuthorization() auf dem Standortmanager aufrufe, wird die Delegatmethode nicht aufgerufen, und es wird kein Warnungsdialog angezeigt an den Benutzer.

13
Ben Avery

Ich fand das Problem heraus, indem ich eine schnelle, eigenständige Anwendung entwickelte, die nur nach Berechtigungen fragte. Ich erhielt ein Fehlerprotokoll, in dem angegeben wurde, dass die von mir verwendeten Schlüssel falsch waren. 

Ich hatte NSLocationAlwaysAndWhenInUsageDescription anstelle von NSLocationAlwaysAndWhenInUseUsageDescription, was ungerade ist, weil aus docs hervorgeht, dass NSLocationAlwaysAndWhenInUsageDescription verwendet werden sollte. Das Wechseln zum korrekten Problem mit korrigierten Schlüsseln und jetzt Berechtigungen funktioniert wie erwartet für iOS 11 und 10.

Danke für all die Hilfe.

8
Ben Avery

Fügen Sie in Ihrer info.plist-Datei Folgendes hinzu:

<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>

Vergessen Sie jetzt nicht, in Ihrer Swift-Datei einen Delegaten hinzuzufügen: CLLocationManagerDelegate

Fügen Sie in Ihrer viewDiDLoad () Folgendes hinzu:

locationManager = CLLocationManager()

locationManager.delegate = self

locationManager.requestWhenInUseAuthorization()

locationManager.desiredAccuracy = kCLLocationAccuracyBest

locationManager.startUpdatingLocation()

locationManager.startMonitoringSignificantLocationChanges()

// Here you can check whether you have allowed the permission or not.

if CLLocationManager.locationServicesEnabled()
    {
        switch(CLLocationManager.authorizationStatus())
        {

        case .authorizedAlways, .authorizedWhenInUse:

            print("Authorize.")

            break

        case .notDetermined:

            print("Not determined.")

            break

        case .restricted:

            print("Restricted.")

            break

        case .denied:

            print("Denied.")
        }
    }
4
Akhil Nair

Für beide Fälle, Kunden und Mitarbeiter, müssen Sie zuerst locationManager.requestWhenInUseAuthorization() anrufen.

Fügen Sie dann, wenn es sich um Mitarbeiter handelt, einen Aufruf zu locationManager.requestAlwaysAuthorization()

Siehe https://developer.Apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization

Übersicht Führen Sie zum Konfigurieren der Berechtigung für Standortdienste die Option .__ aus. Folgendes: Fügen Sie den Schlüssel NSLocationWhenInUseUsageDescription und den Wert für .__ hinzu. NSLocationAlwaysAndWhenInUsageDescription-Schlüssel zu Ihrer Info.plist-Datei . (Xcode zeigt diese Schlüssel im Info.plist-Editor als "Privacy - Location in Use Usage Description" und "Privacy - Location Always und In Use Usage Description" an.) Wenn Ihre App iOS 10 unterstützt und zuvor fügen Sie den NSLocationAlwaysUsageDescription-Schlüssel zu Ihrem .__ hinzu. Info.plist-Datei (Xcode zeigt diesen Schlüssel im Info.plist-Editor als "Privacy - Location Always Usage Description" an.) Create und Konfigurieren Sie Ihr CLLocationManager-Objekt. Ruf den requestWhenInUseAuthorization (), um die grundlegende .__ Ihrer App zu aktivieren. Standortunterstützung. Rufen Sie nur die requestAlwaysAuthorization () - Methode auf wenn Sie Dienste verwenden, für die diese Berechtigungsstufe erforderlich ist.

0
Roee84