Ortungsdienste funktionieren unter iOS 11 nicht

83

Ich habe gerade meine App mit dem iOS 11 SDK neu erstellt, um das zu entfernen blue banner, was jetzt immer angezeigt wird. Ich dachte - "Genial, das hat funktioniert", nur um herauszufinden, dass die Ortungsdienste jetzt überhaupt nicht mehr funktionieren.

Die Anwendung für iOS 10 - Hat jemand etwas gehört?

William George
quelle
Fügen Sie NSLocationAlwaysAndWhenInUseUsageDescription in Info.plist
Jayprakash Dubey

Antworten:

156

Es scheint, dass Apple noch eine weitere Datenschutzfunktion hinzugefügt hat. Der Benutzer kann jetzt unsere überschreiben requestAlwaysAuthorizationund auf requestWhenInUseAuthorization- herabstufen - was bedeutet, dass wir als Entwickler jetzt beide Beschreibungen in derInfo.plist

Ich habe festgestellt, dass sie einen neuen Schlüssel hinzugefügt haben 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.
*/

Bei Verwendung dieses neuen Schlüssels - der Ortungsdienst funktionierte jedoch immer noch nicht. Bei weiterer Suche fand ich dieses Juwel gemischt mit all den zusätzlichen Debugging-Informationen:

Diese App hat versucht, auf datenschutzrelevante Daten ohne Verwendungsbeschreibung zuzugreifen. Die Info.plist der App muss sowohl NSLocationAlwaysAndWhenInUseUsageDescription- als auch NSLocationWhenInUseUsageDescription-Schlüssel mit Zeichenfolgenwerten enthalten, die dem Benutzer erklären, wie die App diese Daten verwendet

Das widerspricht direkt dem Kommentar, den ich in der aktualisierten CLLocationManager.hDatei gefunden habe. Also habe ich ein Radar erstellt.

Gute Nachrichten, wenn Sie den Ratschlägen der Debugging-Konsole IE folgen. Fügen Sie sowohl den neuen NSLocationAlwaysAndWhenInUseUsageDescriptionals auch einen der alten Schlüssel hinzu NSLocationWhenInUseUsageDescription. Die Standortdienste funktionieren wieder.

William George
quelle
2
Ich stehe vor einer sehr ähnlichen Situation. Nur ich NSLocationAlwaysUsageDescriptionteste in iOS 10.2 und habe meiner Info.plist die Berechtigung hinzugefügt, die ich benötige. Aber ich erhalte die obige Meldung in der Konsole, dass ich auch hinzufügen muss NSLocationWhenInUseUsageDescription.
Isuru
7
Leider erhält der Benutzer jetzt einen Dialog mit drei Antworten, wobei die erste Wahl "Nur während der Verwendung der App" die wahrscheinlichste Auswirkung auf die Ungeduld des Benutzers ist. Dadurch werden Apps, die immer verwendet werden müssen, unbrauchbar, es sei denn, der Benutzer muss die Einstellungen anschließend erneut ändern. Zumindest "Immer zulassen" sollte die erste Wahl sein, wenn die App dies verlangt!
Hans Terje Bakke
1
Ich habe alle drei Beschreibungsschlüssel hinzugefügt und erhalte immer noch keine Standortaktualisierungen. Ich füge locationmanagerdelgate in viewwillAppear hinzu und entferne den Delegaten in viewwilldisapper. Wenn ich zur Einstellung gehe und die bereits ausgewählte Option Immer zulassen auswähle. Ich bekomme das Update nur einmal und dann nicht mehr. JEDE Idee, wie man das behebt. Danke im Voraus!!
LoveMeSomeFood
@Uma - rufst du an startUpdatingLocationoder requestLocation?
William George
@ WilliamGeorge Ich benutzestartUpdatingLocation
LoveMeSomeFood
43

Nur um die Schritte zur Behebung dieses Problems hinzuzufügen:

2 Möglichkeiten, es zu tun:

A) Der einfache Weg: Wählen Sie Ihre Info.plist-Datei aus, fügen Sie die Eigenschaften hinzu, beachten Sie, dass sie mit PRIVCY anstelle von LOCATION beginnen. Daher beginnen die genauen Namen dieser Variablen mit "Privacy - Location ..." usw., add jeweils hier und beschreiben, wie der Benutzer dies in der Warnung sehen würde.

B) Der harte / interessante / programmatische Weg (ich mag diesen Weg mehr):

Klicken Sie mit der rechten Maustaste auf Ihre Info.plist für Ihre App und wählen Sie dann "Quellcode anzeigen". Sie sollten alles in XML sehen.

Folgen Sie dem anderen ...... Format und fügen Sie diese Eigenschaften wie folgt hinzu:

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

Speichern Sie, klicken Sie mit der rechten Maustaste auf die Datei info.plist und wählen Sie dann Eigenschaftsliste. Dadurch sollte die Datei wieder in der Standardansicht angezeigt werden.

BEARBEITEN:

Ein anderes Mitglied fragte nach Code, hier ist es:

1) Fügen Sie in Ihrer .H-Datei Folgendes hinzu:

@property (strong, nonatomic) CLLocationManager *LocationManager;

2) Fügen Sie in Ihrer .M-Datei unter ViewDidAppear () die Funktion hinzu:

_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];

Das funktioniert gut für mich, hoffentlich würde der Code auch für Sie funktionieren.

Grüße

Heider

Heider Sati
quelle
1
Ich habe alle drei Beschreibungsschlüssel hinzugefügt und erhalte immer noch keine Standortaktualisierungen. Ich füge locationmanagerdelgate hinzu viewwillAppear und entferne den Delegaten in viewwilldisapper. Wenn ich zur Einstellung gehe und die bereits ausgewählte auswähle Allow Always. Ich bekomme das Update nur einmal und dann nicht mehr. JEDE Idee, wie man das behebt. Danke im Voraus!!
LoveMeSomeFood
Ich werde jetzt meinen Code hinzufügen, um zu veranschaulichen, was für mich funktioniert:
Heider Sati
Ich habe den gleichen Code wie Sie. Trotzdem erhalte ich keine Standortaktualisierungen, es sei denn, ich gehe nach Hause und kehre zur App zurück. Dies passiert nur in iOS 11. Ich konnte immer noch nicht herausfinden warum.
LoveMeSomeFood
Könnten Sie sich diesen Thread ansehen? stackoverflow.com/questions/46616496/… . Danke dir!
LoveMeSomeFood
Hallo Uma, einer unserer Benutzer hat das gleiche Problem auf einem der Geräte gemeldet. Ich untersuche dies und werde mich bei Ihnen melden. Ich denke, IOS11 hält uns alle im Moment extrem beschäftigt. Ich muss es herausfinden und Löse das so schnell wie möglich, bitte trage es mit mir ... danke
Heider Sati
22

Als ich unter iOS11 arbeitete, stellte ich fest, dass Info.plist mindestens NSLocationAlwaysAndWhenInUseUsageDescription in Info.plist benötigt:

Geben Sie hier die Bildbeschreibung ein

Seltsam genug, wenn Ihre App mehrsprachig ist, benötigen die lokalisierten Versionen Ihrer Zeichenfolgen alle drei in diesem Beitrag genannten SchlüsselrequestAlwaysAuthorization() und locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) schlagen im Hintergrund fehl.

Aufnahme mit deutscher Übersetzung als Beispiel:

Geben Sie hier die Bildbeschreibung ein

Ich hoffe, das spart Ihnen Zeit beim Stolpern.

iDoc
quelle
Danke, @iDoc! Das hat mir viel Zeit gespart.
Reinhard Männer
Dies ist die richtige Antwort. In iOS 11 ist Mandatry die Lokalisierung der Standortdatenschutzschlüssel.
Jberlana
Nach 10 Stunden komme ich zu diesem Beitrag ... tnx
1110
17

Arbeiten in 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>  
Keshav Gera
quelle
Vielen Dank vipulkumarmehta
Keshav Gera
12

Folge diesen Schritten:

Ich bin auf dasselbe Problem mit einer App gestoßen, die "Immer Autorisierung" benötigte, und habe es wie folgt behoben:

1. Schlüssel hinzufügen NSLocationWhenInUseUsageDescription zuInfo.plist

2. Hinzufügen NSLocationAlwaysAndWhenInUseUsageDescription zuInfo.plist

3. Hinzufügen NSLocationAlwaysUsageDescription zu Info.plist(zur Unterstützung von <iOS 11)

4. VORHER anrufen )requestWhenInUseAuthorization() requestAlwaysAuthorization(

Sie können requestAlwaysAuthorization () nicht vor requestWhenInUseAuthorization () ausführen. Sie müssen zu dieser Berechtigungsstufe eskalieren. Nachdem ich diese Änderungen vorgenommen hatte, funktionierten die Standortaktualisierungen wieder ordnungsgemäß.

Weitere Details finden Sie hier:

https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/requesting_always_authorization

mhit0
quelle
1
Daran hat sich nichts geändert :(
Cemal BAYRI
Ich habe durch Aktivieren des Flags allowBackgroundLocationUpdates gelöst. Siehe stackoverflow.com/a/50733860/2610888
Andrea Gorrieri
6

Besser sicher als leid. In iOS 11: Fügen Sie das Folgende hinzu und Sie sind gut.

<key>NSLocationWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Description</string>

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
Abhishek Bedi
quelle
4

Getestet auf iOS 12.2 mit Swift 5

Schritt 1. Sie müssen die folgenden Datenschutzberechtigungen in die plist-Datei einfügen

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

Schritt 2. Stellen Sie sicher, dass Sie den folgenden schnellen Code haben, um die aktuellen Standorte abzurufen

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)
    }
}
swiftBoy
quelle
2

Swift: 3 Ich habe das gleiche Problem konfrontiert. Ich war total durcheinander, die Lösung zu finden. Hier ist, wie ich das Problem behoben habe.

Schritt 1: Projektdatei> Funktionen> Hintergrundmodi> Standortaktualisierung auswählen

Schritt 2: Fügen Sie Info.plist die Schlüssel NSLocationWhenInUseUsageDescription, NSLocationAlwaysAndWhenInUseUsageDescription hinzu

Schritt 3 :

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true
Santosh Sahoo
quelle
allowBackgroundLocationUpdates hat mein Problem definitiv gelöst. Ich kann nicht glauben, dass es nicht in anderen Antworten und Foren gemeldet wird. In Apple-Dokumenten: "Mit dieser Eigenschaft können Sie Hintergrundaktualisierungen programmgesteuert aktivieren und deaktivieren. Sie können diese Eigenschaft beispielsweise erst dann auf true setzen, wenn der Benutzer Funktionen in Ihrer App aktiviert hat, für die Hintergrundaktualisierungen erforderlich sind." "Der Standardwert dieser Eigenschaft ist false." developer.apple.com/documentation/corelocation/…
Andrea Gorrieri