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?
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.
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
unter iOS11 habe ich festgestellt, dass Info.plist mindestens NSLocationAlwaysAndWhenInUseUsageDescription in Info.plist benötigt:
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:
Ich hoffe, das spart Ihnen Zeit beim Stolpern.
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>
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:
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>
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
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)
}
}