wake-up-neo.com

Ortungsdienste funktionieren in iOS 11 nicht

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

Die Anwendung, die für iOS 10 verwendet wurde - Hat jemand etwas gehört?

80
William George

Es scheint, dass Apple eine weitere Datenschutzfunktion hinzugefügt hat. Der Benutzer kann nun unser requestAlwaysAuthorization überschreiben und es auf requestWhenInUseAuthorization zurückstufen - das heißt, als Entwickler müssen wir nun beide Beschreibungen im Info.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 funktionierte der Ortungsdienst jedoch immer noch nicht. Bei der weiteren Suche fand ich dieses Juwel gemischt mit allen zusätzlichen Debugging-Informationen:

Diese App hat versucht, auf datenschutzrelevante Daten ohne eine 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

Dies steht in direktem Widerspruch zu dem Kommentar, den ich in der aktualisierten CLLocationManager.h - Datei gefunden habe. Also habe ich ein Radar erstellt.

Gute Nachrichten, wenn Sie den Rat der Debug-Konsole, IE, befolgen. Fügen Sie sowohl den neuen Schlüssel NSLocationAlwaysAndWhenInUseUsageDescription als auch einen der alten Schlüssel NSLocationWhenInUseUsageDescription hinzu, damit die Standortdienste wieder funktionieren.

154
William George

Nur um die Schritte zur Fehlerbehebung hinzuzufügen:

2 Möglichkeiten:

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 ..." etc, add jeweils hier, und beschreiben Sie, wie der Benutzer dies auf 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 "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 die Datei, klicken Sie mit der rechten Maustaste auf die Datei info.plist, und wählen Sie Eigenschaftenliste aus. 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 () folgende 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, was für mich gut funktioniert, hoffentlich würde der Code auch für Sie funktionieren.

Grüße

Heider

39
Heider Sati

unter iOS11 habe ich festgestellt, dass Info.plist mindestens NSLocationAlwaysAndWhenInUseUsageDescription in Info.plist benötigt:

enter image description here

Seltsam genug, wenn Ihre App mehrsprachig ist , benötigen die lokalisierten Versionen Ihrer Zeichenfolgen alle drei Schlüssel in diesem Beitrag erwähnt sonst wird requestAlwaysAuthorization() und locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) stillschweigend fehlschlagen.

Aufnahme mit deutscher Übersetzung als Beispiel:

enter image description here

Ich hoffe, das spart Ihnen Zeit beim Stolpern.

20
iDoc

Arbeiten in Swift 4.0.

   <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>  
16
Keshav Gera

Folge diesen Schritten:

Ich bin auf dasselbe Problem mit einer App gestoßen, die "Always Authorization" benötigte, und habe es folgendermaßen gelöst:

1. Fügen Sie NSLocationWhenInUseUsageDescription zu Info.plist

2. Fügen Sie NSLocationAlwaysAndWhenInUseUsageDescription zu Info.plist

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

4. Rufen Sie requestWhenInUseAuthorization() [~ # ~] vor [~ # ~] 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

11
mhit0

Sicher ist sicher .. In iOS 11: Füge Folgendes hinzu und du bist gut.

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

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

<key>NSLocationAlwaysUsageDescription</key>
<string>Description</string>
6
Abhishek Bedi

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

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

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

Schritt-3:

manager.pausesLocationUpdatesAutomatically = false
manager.allowsBackgroundLocationUpdates = true
2
Santosh Sahoo

Getestet auf iOS 12.2 mit Swift 5

Schritt 1. Sie müssen der plist-Datei die folgenden Privilegien hinzufü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. Vergewissern Sie sich, dass Sie den Code Swift 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)
    }
}
0
swiftBoy