+1 danke für das Posten eines einfachen Code-Schnipsels, um die akzeptierte Antwort zu ergänzen
AngeloS
12
Seien Sie vorsichtig mit diesem Beispiel, diese Eigenschaftswerte führen zu einem höheren Batterieverbrauch.
DanSkeel
36
WICHTIG: Sie müssen auch "stopUpdatingLocations" ausführen, da sonst die Delegate-Methode jedes Mal aufgerufen wird, wenn der Benutzer seinen Speicherort ändert. Das oben erwähnte Batterieproblem und auch wenn bei dieser Delegatmethode eine andere Methode ausgelöst wird, wird diese weiterhin aufgerufen. Happy Coding Guys !! Prost!!
Apple_iOS0304
5
Sie sind der Benutzertyp, der StackOverflow großartig macht. Code-Schnipsel sind vorbildlich und ich hoffe, dass mehr Menschen sie in ihre Antworten einbeziehen.
Danny
26
Für iOS 8.0+ müssen Sie folgende Schlüssel in die Info.plist Ihres Projekts aufnehmen: NSLocationAlwaysUsageDescriptionWenn Sie verwenden [self.locationManager requestAlwaysAuthorization]oder NSLocationWhenInUseUsageDescriptionwenn Sie verwenden [self.locationManager requestWhenInUseAuthorization]. Um iOS 6.0+ bis iOS 7.0+ zu unterstützen, müssen Sie auch den Schlüssel NSLocationUsageDescriptionoder "Datenschutz - Beschreibung der Standortnutzung" verwenden. Weitere Informationen unter Link: developer.apple.com/library/ios/documentation/General/Reference/…
Ich habe genau die oben genannten Schritte versucht. Aber ich bekomme "Benutzer denkt immer noch" in der Konsole gedruckt. Bedeutet dies, dass die App nicht berechtigt ist, den Standort zu verwenden? Wenn ja, wie erlaube ich der App, den Standort zu verwenden? Bitte helfen Sie.
HINWEIS: Bitte überprüfen Sie den Breitengrad und die Logitude des Gerätestandorts, wenn Sie Simulatormittel verwenden. Standardmäßig ist es nur keine.
Schritt 1: Import CoreLocationRahmen in .h - Datei
#import <CoreLocation/CoreLocation.h>
Schritt 2: Fügen Sie den Delegaten CLLocationManagerDelegate hinzu
Das wichtigste zuerst. Sie müssen Ihre beschreibende Zeichenfolge in die Datei info.plist für die Schlüssel einfügen NSLocationWhenInUseUsageDescriptionoder NSLocationAlwaysUsageDescriptionje nachdem, welche Art von Dienst Sie anfordern
Code
importFoundationimportCoreLocationclassLocationManager:NSObject,CLLocationManagerDelegate{
let manager:CLLocationManager
var locationManagerClosures:[((userLocation:CLLocation)->())]=[]
override init(){
self.manager =CLLocationManager()
super.init()
self.manager.delegate= self
}//This is the main method for getting the users location and will pass back the usersLocation when it is available
func getlocationForUser(userLocationClosure:((userLocation:CLLocation)->())){
self.locationManagerClosures.append(userLocationClosure)//First need to check if the apple device has location services availabel. (i.e. Some iTouch's don't have this enabled)ifCLLocationManager.locationServicesEnabled(){//Then check whether the user has granted you permission to get his locationifCLLocationManager.authorizationStatus()==.NotDetermined{//Request permission//Note: you can also ask for .requestWhenInUseAuthorization
manager.requestWhenInUseAuthorization()}elseifCLLocationManager.authorizationStatus()==.Restricted||CLLocationManager.authorizationStatus()==.Denied{//... Sorry for you. You can huff and puff but you are not getting any location}elseifCLLocationManager.authorizationStatus()==.AuthorizedWhenInUse{// This will trigger the locationManager:didUpdateLocation delegate method to get called when the next available location of the user is available
manager.startUpdatingLocation()}}}//MARK: CLLocationManager Delegate methods@objc func locationManager(manager:CLLocationManager, didChangeAuthorizationStatus status:CLAuthorizationStatus){if status ==.AuthorizedAlways|| status ==.AuthorizedWhenInUse{
manager.startUpdatingLocation()}}
func locationManager(manager:CLLocationManager, didUpdateToLocation newLocation:CLLocation, fromLocation oldLocation:CLLocation){//Because multiple methods might have called getlocationForUser: method there might me multiple methods that need the users location.//These userLocation closures will have been stored in the locationManagerClosures array so now that we have the users location we can pass the users location into all of them and then reset the array.
let tempClosures = self.locationManagerClosures
for closure in tempClosures {
closure(userLocation: newLocation)}
self.locationManagerClosures =[]}}
Verwendung
self.locationManager =LocationManager()
self.locationManager.getlocationForUser {(userLocation:CLLocation)->() in
print(userLocation)}
Ich glaube, es gibt einen Schalter () in schnellen Fällen für Fälle wie diesen: ^)
Anton Tropashko
self.locationManager = LocationManager()Verwenden Sie diese Zeile in der viewDidLoad-Methode, damit ARC die Instanz nicht entfernt und das Popup für den Speicherort zu schnell verschwindet.
Kunal Gupta
12
Die Xcode-Dokumentation verfügt über eine Fülle von Kenntnissen und Beispiel-Apps. Weitere Informationen finden Sie im Location Awareness Programming Guide .
Das LocateMe- Beispielprojekt zeigt die Auswirkungen der Änderung der verschiedenen Genauigkeitseinstellungen des CLLocationManager
Dieser Dienst fordert die Berechtigungen an und kümmert sich um den Umgang mit dem CLLocationManager, sodass Sie dies nicht tun müssen.
Verwenden Sie wie folgt:
LocationService.getCurrentLocationOnSuccess({(latitude, longitude)->() in
//Do something with Latitude and Longitude}, onFailure:{(error)->() in
//See what went wrong
print(error)})
Antworten:
Die Antwort von RedBlueThing hat für mich ganz gut funktioniert. Hier ist ein Beispielcode, wie ich es gemacht habe.
Header
Hauptdatei
In der init-Methode
Rückruffunktion
iOS 6
In iOS 6 war die Delegatenfunktion veraltet. Der neue Delegierte ist
Verwenden Sie daher die neue Position
iOS 8
In iOS 8 sollte die Berechtigung explizit abgefragt werden, bevor mit dem Aktualisieren des Speicherorts begonnen wird
Sie müssen auch eine Zeichenfolge für die
NSLocationAlwaysUsageDescription
oderNSLocationWhenInUseUsageDescription
Schlüssel zur Info.plist der App hinzufügen. Andernfalls werden Anrufe anstartUpdatingLocation
ignoriert und Ihr Delegat erhält keinen Rückruf.Und am Ende, wenn Sie mit dem Lesen des Standorts fertig sind, rufen Sie stopUpdating an einem geeigneten Ort auf.
quelle
NSLocationAlwaysUsageDescription
Wenn Sie verwenden[self.locationManager requestAlwaysAuthorization]
oderNSLocationWhenInUseUsageDescription
wenn Sie verwenden[self.locationManager requestWhenInUseAuthorization]
. Um iOS 6.0+ bis iOS 7.0+ zu unterstützen, müssen Sie auch den SchlüsselNSLocationUsageDescription
oder "Datenschutz - Beschreibung der Standortnutzung" verwenden. Weitere Informationen unter Link: developer.apple.com/library/ios/documentation/General/Reference/…In iOS 6 ist die
ist veraltet.
Verwenden Sie stattdessen den folgenden Code
Für iOS 6 ~ 8 ist die oben beschriebene Methode weiterhin erforderlich, Sie müssen jedoch die Autorisierung durchführen.
Dies ist die Delegatmethode, die die Autorisierung des Benutzers verwaltet
quelle
[locations lastObject]
?Sie verwenden das CoreLocation-Framework, um auf Standortinformationen zu Ihrem Benutzer zuzugreifen. Sie müssen ein CLLocationManager- Objekt instanziieren und die asynchrone startUpdatingLocation- Nachricht aufrufen . Über das von Ihnen angegebene CLLocationManagerDelegate erhalten Sie Rückrufe mit dem Standort des Benutzers .
quelle
Versuchen Sie diese einfachen Schritte ....
HINWEIS: Bitte überprüfen Sie den Breitengrad und die Logitude des Gerätestandorts, wenn Sie Simulatormittel verwenden. Standardmäßig ist es nur keine.
Schritt 1: Import
CoreLocation
Rahmen in .h - DateiSchritt 2: Fügen Sie den Delegaten CLLocationManagerDelegate hinzu
Schritt 3: Fügen Sie diesen Code in die Klassendatei ein
Schritt 4: Methode zum Erkennen des aktuellen Standorts
Schritt 5: Ermitteln Sie den Standort mit dieser Methode
quelle
In Swift (für iOS 8+).
Info.plist
Das wichtigste zuerst. Sie müssen Ihre beschreibende Zeichenfolge in die Datei info.plist für die Schlüssel einfügen
NSLocationWhenInUseUsageDescription
oderNSLocationAlwaysUsageDescription
je nachdem, welche Art von Dienst Sie anfordernCode
Verwendung
quelle
self.locationManager = LocationManager()
Verwenden Sie diese Zeile in der viewDidLoad-Methode, damit ARC die Instanz nicht entfernt und das Popup für den Speicherort zu schnell verschwindet.Die Xcode-Dokumentation verfügt über eine Fülle von Kenntnissen und Beispiel-Apps. Weitere Informationen finden Sie im Location Awareness Programming Guide .
Das LocateMe- Beispielprojekt zeigt die Auswirkungen der Änderung der verschiedenen Genauigkeitseinstellungen des CLLocationManager
quelle
iOS 11.x Swift 4.0 Info.plist benötigt diese beiden Eigenschaften
Und dieser Code ... stellt natürlich sicher, dass Sie ein CLLocationManagerDelegate sind
Und natürlich auch diesen Code, den Sie in viewDidLoad () einfügen können.
Und diese beiden für den requestLocation, um dich zum Laufen zu bringen, auch bekannt als, dass du nicht von deinem Platz aufstehen musst :)
quelle
Sie können diesen Service nutzen, den ich geschrieben habe, um alles für Sie zu erledigen.
Dieser Dienst fordert die Berechtigungen an und kümmert sich um den Umgang mit dem CLLocationManager, sodass Sie dies nicht tun müssen.
Verwenden Sie wie folgt:
quelle
Für Swift 5 gibt es hier eine kurze Kurzklasse, um den Standort zu ermitteln:
quelle