Meine App, die unter iOS 7 einwandfrei funktioniert hat, funktioniert nicht mit dem iOS 8 SDK.
CLLocationManager
gibt keinen Standort zurück und ich sehe meine App auch nicht unter Einstellungen -> Standortdienste . Ich habe eine Google-Suche zu diesem Thema durchgeführt, aber es wurde nichts gefunden. Was könnte falsch sein?
Antworten:
Am Ende habe ich mein eigenes Problem gelöst.
Anscheinend ist im iOS 8 SDK
requestAlwaysAuthorization
(für den Hintergrundspeicherort) oderrequestWhenInUseAuthorization
(Standort nur im Vordergrund) ein AufrufCLLocationManager
erforderlich, bevor Standortaktualisierungen gestartet werden.Es muss auch sein ,
NSLocationAlwaysUsageDescription
oderNSLocationWhenInUseUsageDescription
Schlüssel inInfo.plist
einer Nachricht in der Eingabeaufforderung angezeigt werden. Das Hinzufügen dieser löste mein Problem.Hoffe es hilft jemand anderem.
BEARBEITEN: Weitere Informationen finden Sie unter: Core-Location-Manager-Changes-in-ios-8
quelle
Ich zog mir mit dem gleichen Problem die Haare aus. Xcode gibt Ihnen den Fehler:
Aber selbst wenn Sie eine der oben genannten Methoden implementieren, wird der Benutzer nur dann dazu aufgefordert, wenn in der info.plist ein Eintrag für
NSLocationAlwaysUsageDescription
oder vorhanden istNSLocationWhenInUseUsageDescription
.Fügen Sie Ihrer info.plist die folgenden Zeilen hinzu, wobei die Zeichenfolgenwerte den Grund darstellen, warum Sie auf den Speicherort des Benutzers zugreifen müssen
Ich denke, diese Einträge fehlen möglicherweise, seit ich dieses Projekt in Xcode 5 gestartet habe. Ich vermute, Xcode 6 fügt möglicherweise Standardeinträge für diese Schlüssel hinzu, wurde jedoch nicht bestätigt.
Weitere Informationen zu diesen beiden Einstellungen finden Sie hier
quelle
Um sicherzustellen, dass dies abwärtskompatibel mit iOS 7 ist, sollten Sie überprüfen, ob der Benutzer iOS 8 oder iOS 7 ausführt. Beispiel:
quelle
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { ...
requestAlwaysAuthorization
Methode ist. Meine zusätzliche Lösung bestand darin, diese Zeile in derif
Anweisung anstelle eines normalen Methodenaufrufs zu verwenden :[self.locationManager performSelector:@selector(requestAlwaysAuthorization)];
. Vielleicht ist das für andere offensichtlich, aber ich habe eine Weile gebraucht, um es herauszufinden. Ich denke, es ist die richtige Lösung, bis der endgültige Xcode 6 veröffentlicht wird.__IPHONE_OS_VERSION_MAX_ALLOWED
(#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000
)Und zu Ihrer info.plist Datei
quelle
Laut den Apple-Dokumenten:
Ab iOS 8 ist das Vorhandensein eines
NSLocationWhenInUseUsageDescription
oder einesNSLocationAlwaysUsageDescription
Schlüsselwerts in der Info.plist-Datei Ihrer App erforderlich. Es ist dann auch erforderlich, die Erlaubnis des Benutzers anzufordern, bevor Sie sich für Standortaktualisierungen registrieren, entweder telefonisch[self.myLocationManager requestWhenInUseAuthorization]
oder[self.myLocationManager requestAlwaysAuthorization]
je nach Bedarf. Die Zeichenfolge, die Sie in die Info.plist eingegeben haben, wird dann im folgenden Dialogfeld angezeigt.Wenn der Benutzer die Berechtigung erteilt, läuft es wie gewohnt. Wenn sie die Berechtigung verweigern, wird der Delegat nicht über Standortaktualisierungen informiert.
quelle
Beide Schlüssel haben eine Zeichenfolge
quelle
Meine Lösung, die in Xcode 5 kompiliert werden kann:
quelle
Der alte Code zum Abfragen des Standorts funktioniert in iOS 8 nicht. Sie können diese Methode zur Standortautorisierung ausprobieren:
quelle
In iOS 8 müssen Sie zwei zusätzliche Dinge tun, damit der Standort funktioniert: Fügen Sie einen Schlüssel zu Ihrer Info.plist hinzu und fordern Sie vom Standortmanager eine Autorisierung an, um den Start zu starten
info.plist:
Fügen Sie dies Ihrem Code hinzu
quelle
Ein häufiger Fehler für Swift-Entwickler:
Stellen Sie zunächst sicher, dass Sie der Liste einen Wert für entweder
NSLocationWhenInUseUsageDescription
oder hinzufügenNSLocationAlwaysUsageDescription
.Wenn immer noch kein Fenster angezeigt wird, in dem Sie um Autorisierung gebeten werden, prüfen Sie, ob Sie die Zeile
var locationManager = CLLocationManager()
in dieviewDidLoad
Methode Ihres View Controllers einfügen. Wenn Sie dies tun, wird auch dannlocationManager.requestWhenInUseAuthorization()
nichts angezeigt, wenn Sie anrufen . Dies liegt daran, dass nach der Ausführung von viewDidLoad die Variable locationManager freigegeben (gelöscht) wird.Die Lösung besteht darin, die Zeile
var locationManager = CLLocationManager()
oben in der Klassenmethode zu platzieren.quelle
Vor
[locationManager startUpdatingLocation];
, fügen Anfrage eine iOS8 Ortungsdienste:Bearbeiten Sie die App
Info.plist
und fügen Sie den SchlüsselNSLocationAlwaysUsageDescription
mit dem Zeichenfolgenwert hinzu, der dem Benutzer angezeigt wird (z. B.We do our best to preserve your battery life.
).Wenn Ihre App nur bei geöffnetem App Ortungsdienste benötigt, ersetzen Sie:
requestAlwaysAuthorization
mitrequestWhenInUseAuthorization
undNSLocationAlwaysUsageDescription
mitNSLocationWhenInUseUsageDescription
.quelle
Ich habe an einer App gearbeitet, die auf iOS 8 aktualisiert wurde, und die Ortungsdienste funktionierten nicht mehr. Sie werden wahrscheinlich einen Fehler im Debug-Bereich bekommen, wie folgt:
Trying to start MapKit location updates without prompting for location authorization. Must call -[CLLocationManager requestWhenInUseAuthorization] or -[CLLocationManager requestAlwaysAuthorization] first.
Ich habe das am wenigsten aufdringliche Verfahren durchgeführt.
NSLocationAlwaysUsageDescription
Fügen Sie zuerst einen Eintrag zu Ihrer info.plist hinzu:Beachten Sie, dass ich den Wert für diesen Schlüssel nicht ausgefüllt habe. Dies funktioniert immer noch und ich bin nicht besorgt, da dies eine Inhouse-App ist. Außerdem gibt es bereits einen Titel, in dem nach Standortdiensten gefragt wird, sodass ich nichts Redundantes tun wollte.
Als nächstes habe ich eine Bedingung für iOS 8 erstellt:
Danach wird die
locationManager:didChangeAuthorizationStatus:
Methode aufgerufen:Und jetzt funktioniert alles gut. Lesen Sie wie immer die Dokumentation .
quelle
Lösung mit Abwärtskompatibilität:
Richten Sie den NSLocationWhenInUseUsageDescription-Schlüssel in Ihrer Info.plist ein
quelle
locationManager: (CLLocationManager *)manager didFailWithError: (NSError *)error
. Er hat jedoch vergessen, startUpdatingLocation zur if-Anweisung hinzuzufügen. Nachdem sie diese akzeptiert oder abgelehnt hat, wird startUpdateLocation nicht aufgerufen.Lösung mit Abwärtskompatibilität, die keine Xcode-Warnungen erzeugt:
Setup-
NSLocationWhenInUseUsageDescription
Taste in IhremInfo.plist
.Für iOS Version 11.0+ : Setup-
NSLocationAlwaysAndWhenInUseUsageDescription
Schlüssel in IhremInfo.plist
. zusammen mit anderen 2 Schlüsseln.quelle
Dies ist ein Problem mit ios 8 Fügen Sie dies Ihrem Code hinzu
und zu info.plist:
quelle
NSLocationUsageDescription
wird nicht auf iOS8 + verwendetUm in iOS 8 auf den Benutzerstandort zuzugreifen, müssen Sie Folgendes hinzufügen:
Dadurch wird der Benutzer um die Erlaubnis gebeten, seinen aktuellen Standort abzurufen.
quelle
Ziel-C-Verfahren Befolgen Sie die folgenden Anweisungen:
Für iOS-11 Für iOS 11 sehen Sie sich diese Antwort an: iOS 11-Standortzugriff
Sie müssen zwei Schlüssel zur Liste hinzufügen und die folgende Meldung anzeigen:
Für iOS-10 und niedriger:
Methoden delegieren
Schnelle Vorgehensweise
Befolgen Sie die folgenden Anweisungen:
Für iOS-11 Für iOS 11 sehen Sie sich diese Antwort an: iOS 11-Standortzugriff
Sie müssen zwei Schlüssel zur Liste hinzufügen und die folgende Meldung anzeigen:
Für iOS-10 und niedriger:
Methoden delegieren
quelle
Für diejenigen, die Xamarin verwenden , musste ich den Schlüssel
NSLocationWhenInUseUsageDescription
manuell zur info.plist hinzufügen, da er weder in Xamarin 5.5.3 Build 6 noch in XCode 6.1 in den Dropdown-Listen verfügbar war - nurNSLocationUsageDescription
in der Liste, und das führte dazu, dass derCLLocationManager
fortfuhr scheitern lautlos.quelle
quelle
Ein kleiner Helfer für alle, die mehr als eine Info.plist-Datei haben ...
Das erforderliche Tag wird allen Info.plist-Dateien im aktuellen Verzeichnis (und den Unterordnern) hinzugefügt.
Ein anderer ist:
Es wird Ihre Beschreibung zu allen Dateien hinzufügen.
quelle
Behalten Sie die Informationen zu Cocoa Keys immer zur Hand, um diese Updates zu erhalten. Hier ist der Link:
https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW26
Genießen.
quelle
In iOS9 (bei Verwendung von Xcode 7 und Swift 2) wird ein ähnlicher Fehler angezeigt: Der Versuch, MapKit-Standortaktualisierungen zu starten, ohne zur Standortautorisierung aufzufordern. Muss zuerst - [CLLocationManager requestWhenInUseAuthorization] oder - [CLLocationManager requestAlwaysAuthorization] aufrufen. Ich habe ein Tutorial verfolgt, aber der Tutor hat iOS8 und Swift 1.2 verwendet. Es gibt einige Änderungen in Xcode 7 und Swift 2, ich habe diesen Code gefunden und er funktioniert gut für mich (wenn jemand Hilfe benötigt):
Schließlich habe ich das in info.plist eingefügt: Informationseigenschaftsliste: NSLocationWhenInUseUsageDescription Wert: App benötigt Standortserver für Mitarbeiter
quelle
Um auf den Benutzerstandort in iOS zuzugreifen. Sie müssen zwei Schlüssel hinzufügen
NSLocationWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
in die Datei Info.plist.
Siehe dieses Bild unten.
quelle
Fügen Sie einen Schlüssel
NSLocationWhenInUseUsageDescription
oderNSLocationAlwaysUsageDescription
(Hintergrund-GPS-Verwendung) mit einer Zeichenfolge hinzu, in der Sie aufgefordert werden, fürinfo.plist
jedes Ziel GPS zu verwenden .Bitten Sie um Erlaubnis, indem Sie Folgendes ausführen:
[self initLocationManager: locationManager];
Wo
initLocationManager
ist:Denken Sie daran, dass
info.plist
die App den Benutzer nicht fragt , wenn die Schlüssel nicht für jedes Ziel vorhanden sind. Dasif
bietet Kompatibilität mit iOS 7 und dierespondsToSelector:
Methode garantiert zukünftige Kompatibilität, anstatt nur das Problem für iOS 7 und 8 zu lösen.quelle
Das Problem für mich war, dass die Klasse, die die
CLLocationManagerDelegate
war, privat war, was verhinderte, dass alle Delegatenmethoden aufgerufen wurden. Ich denke, es ist keine sehr häufige Situation, aber ich dachte, ich würde es erwähnen, falls es niemandem hilft.quelle
Ich füge Sie diesen Schlüssel in
InfoPlist.strings
in iOS 8.4, iPad mini 2. Es funktioniert auch. Ich setze keinen SchlüsselNSLocationWhenInUseUsageDescription
in meineInfo.plist
.InfoPlist.strings :
Basis auf diesem Thread , hieß es
as in iOS 7
, kann in der InfoPlist.strings lokalisiert werden. In meinem Test können diese Schlüssel direkt in der Datei konfiguriert werdenInfoPlist.strings
.AKTUALISIEREN:
Ich denke
@IOS
, die Methode ist besser. Fügen Sie den SchlüsselInfo.plist
mit leerem Wert hinzu und fügen Sie lokalisierte Zeichenfolgen hinzuInfoPlist.strings
.quelle