web-dev-qa-db-fra.com

Obtenir la position/les coordonnées actuelles de l'utilisateur

Comment puis-je enregistrer l'emplacement actuel de l'utilisateur et l'afficher sur une carte?

Je suis capable d'afficher des coordonnées prédéfinies sur une carte, je ne sais tout simplement pas comment recevoir des informations de l'appareil.

De plus, je sais que je dois ajouter quelques éléments dans une pliste. Comment puis je faire ça?

159
Awais Hussain

Pour obtenir l'emplacement actuel d'un utilisateur, vous devez déclarer:

let locationManager = CLLocationManager()

Dans viewDidLoad(), vous devez instancier la classe CLLocationManager, comme suit:

// Ask for Authorisation from the User.
self.locationManager.requestAlwaysAuthorization() 

// For use in foreground
self.locationManager.requestWhenInUseAuthorization()

if CLLocationManager.locationServicesEnabled() {
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    locationManager.startUpdatingLocation()
}

Ensuite, dans la méthode CLLocationManagerDelegate, vous pouvez obtenir les coordonnées de l'emplacement actuel de l'utilisateur:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
    print("locations = \(locValue.latitude) \(locValue.longitude)")
}

Dans le fichier info.plist, vous devrez ajouter NSLocationAlwaysUsageDescription Et votre message d’alerte personnalisé comme; AppName (application de démonstration) aimerait utiliser votre position actuelle.

183
Annu

vous devriez faire ces étapes:

  1. ajouter CoreLocation.framework à BuildPhases -> Lier binaire avec bibliothèques (n'est plus nécessaire à partir de XCode 7.2.1)
  2. importer CoreLocation dans votre classe - probablement ViewController.Swift
  3. ajoutez CLLocationManagerDelegate à votre déclaration de classe
  4. ajouter NSLocationWhenInUseUsageDescription et NSLocationAlwaysUsageDescription à la liste d'adresses
  5. gestionnaire de site init:

    locationManager = CLLocationManager()
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()
    locationManager.startUpdatingLocation()
    
  6. obtenir l'emplacement de l'utilisateur par:

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let locValue:CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
    }
    
93
itzhar

Voici comment je suis 

obtenir la position actuelle et s'afficher sur la carte dans Swift 2.0

Assurez-vous que vous avez ajouté le framework CoreLocation et MapKit à votre projet} (Cela n'est pas obligatoire avec XCode 7.2.1)

import Foundation
import CoreLocation
import MapKit

class DiscoverViewController : UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var map: MKMapView!
    var locationManager: CLLocationManager!

    override func viewDidLoad()
    {
        super.viewDidLoad()

        if (CLLocationManager.locationServicesEnabled())
        {
            locationManager = CLLocationManager()
            locationManager.delegate = self
            locationManager.desiredAccuracy = kCLLocationAccuracyBest
            locationManager.requestAlwaysAuthorization()
            locationManager.startUpdatingLocation()
        }
    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
    {

        let location = locations.last! as 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))

        self.map.setRegion(region, animated: true)
    }
}

Voici l'écran de résultat

 a screenshot of the map, centered in Mumbai

34
swiftBoy

@wonderwhy I have added my code screenshot. pls check it. You will have to add <code>NSLocationWhenInUseUsageDescription in the plist for authorisation.</code>

NSLocationWhenInUseUsageDescription = Demander l'autorisation d'utiliser le service de localisation lorsque les applications sont en arrière-plan. dans votre fichier plist.

Si cela fonctionne, votez s'il vous plaît sur la réponse.

28
Annu

Première bibliothèque d'importation Corelocation et MapKit:

import MapKit
import CoreLocation

hériter de CLLocationManagerDelegate à notre classe

class ViewController: UIViewController, CLLocationManagerDelegate

créer une variable locationManager, ce seront vos données de localisation 

var locationManager = CLLocationManager()

créer une fonction pour obtenir les informations de localisation, soyez précis cette syntaxe exacte fonctionne:

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

dans votre fonction créer une constante pour l'emplacement actuel des utilisateurs

let userLocation:CLLocation = locations[0] as CLLocation // note that locations is same as the one in the function declaration  

arrêter la mise à jour de l'emplacement, cela empêche votre appareil de changer constamment de fenêtre pour centrer votre emplacement pendant le déplacement (vous pouvez l'omettre si vous souhaitez qu'il fonctionne autrement)

manager.stopUpdatingLocation()

obtenir les coordonnées des utilisateurs de userLocatin que vous avez défini

let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)

définissez le niveau de zoom souhaité pour votre carte:

let span = MKCoordinateSpanMake(0.2,0.2) combinez ces deux pour obtenir la région:

let region = MKCoordinateRegion(center: coordinations, span: span)//this basically tells your map where to look and where from what distance

maintenant définir la région et choisissez si vous voulez y aller avec animation ou non

mapView.setRegion(region, animated: true)

fermez votre fonction }

à partir de votre bouton ou d’une autre manière, vous souhaitez définir le paramètre locationManagerDeleget

permet maintenant d'afficher l'emplacement

désigner la précision

locationManager.desiredAccuracy = kCLLocationAccuracyBest

autoriser:

 locationManager.requestWhenInUseAuthorization()

pour pouvoir autoriser le service de localisation, vous devez ajouter ces deux lignes à votre plist

 enter image description here

obtenir l'emplacement:

locationManager.startUpdatingLocation()

montrez-le à l'utilisateur: 

mapView.showsUserLocation = true

Ceci est mon code complet:

import UIKit
import MapKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    @IBOutlet weak var mapView: MKMapView!

    var locationManager = CLLocationManager()


    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    @IBAction func locateMe(sender: UIBarButtonItem) {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestWhenInUseAuthorization()
        locationManager.startUpdatingLocation()

        mapView.showsUserLocation = true

    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let userLocation:CLLocation = locations[0] as CLLocation

        manager.stopUpdatingLocation()

        let coordinations = CLLocationCoordinate2D(latitude: userLocation.coordinate.latitude,longitude: userLocation.coordinate.longitude)
        let span = MKCoordinateSpanMake(0.2,0.2)
        let region = MKCoordinateRegion(center: coordinations, span: span)

        mapView.setRegion(region, animated: true)

    }
}
25
Milad Masoodi

Swift 3.0

Si vous ne souhaitez pas afficher l'emplacement de l'utilisateur sur la carte, mais que vous souhaitez simplement le stocker dans Firebase ou ailleurs, suivez ces étapes:

import MapKit
import CoreLocation

Maintenant, utilisez CLLocationManagerDelegate sur votre VC et vous devez remplacer les trois dernières méthodes présentées ci-dessous. Vous pouvez voir comment la méthode requestLocation () vous permet d'obtenir l'emplacement actuel de l'utilisateur à l'aide de ces méthodes.

class MyVc: UIViewController, CLLocationManagerDelegate {

  let locationManager = CLLocationManager()

 override func viewDidLoad() {
    super.viewDidLoad()

    isAuthorizedtoGetUserLocation()

    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    }
}

 //if we have no permission to access user location, then ask user for permission.
func isAuthorizedtoGetUserLocation() {

    if CLLocationManager.authorizationStatus() != .authorizedWhenInUse     {
        locationManager.requestWhenInUseAuthorization()
    }
}


//this method will be called each time when a user change his location access preference.
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
    if status == .authorizedWhenInUse {
        print("User allowed us to access location")
        //do whatever init activities here.
    }
}


 //this method is called by the framework on         locationManager.requestLocation();
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    print("Did location updates is called")
    //store the user location here to firebase or somewhere 
}

func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Did location updates is called but failed getting location \(error)")
}

}

Vous pouvez maintenant coder l'appel ci-dessous dès que l'utilisateur se connecte à votre application. Lorsque requestLocation () est appelé, il appelle en outre didUpdateLocations ci-dessus et vous pouvez stocker l'emplacement sur Firebase ou ailleurs.

if CLLocationManager.locationServicesEnabled() {
            locationManager.requestLocation();
 }

si vous utilisez GeoFire, dans la méthode didUpdateLocations ci-dessus, vous pouvez stocker l'emplacement comme ci-dessous. 

geoFire?.setLocation(locations.first, forKey: uid) where uid is the user id who logged in to the app. I think you will know how to get UID based on your app sign in implementation. 

Dernier point mais non le moindre, accédez à votre Info.plist et activez «Confidentialité-Emplacement lors de l'utilisation de la description d'utilisation».

Lorsque vous utilisez le simulateur pour le tester, vous obtenez toujours un emplacement personnalisé que vous avez configuré dans Simulator -> Debug -> Location.

20
Lyju I Edwinson

Bibliothèque d'importation comme:

import CoreLocation

définir le délégué:

CLLocationManagerDelegate

Prenez variable comme:

var locationManager:CLLocationManager!

Sur viewDidLoad (), écrivez ce joli code:

 locationManager = CLLocationManager()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.requestAlwaysAuthorization()

    if CLLocationManager.locationServicesEnabled(){
        locationManager.startUpdatingLocation()
    }

Écrire des méthodes de délégué CLLocation:

    //MARK: - location delegate methods
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
    let userLocation :CLLocation = locations[0] as CLLocation

    print("user latitude = \(userLocation.coordinate.latitude)")
    print("user longitude = \(userLocation.coordinate.longitude)")

    self.labelLat.text = "\(userLocation.coordinate.latitude)"
    self.labelLongi.text = "\(userLocation.coordinate.longitude)"

    let geocoder = CLGeocoder()
    geocoder.reverseGeocodeLocation(userLocation) { (placemarks, error) in
        if (error != nil){
            print("error in reverseGeocode")
        }
        let placemark = placemarks! as [CLPlacemark]
        if placemark.count>0{
            let placemark = placemarks![0]
            print(placemark.locality!)
            print(placemark.administrativeArea!)
            print(placemark.country!)

            self.labelAdd.text = "\(placemark.locality!), \(placemark.administrativeArea!), \(placemark.country!)"
        }
    }

}
func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
    print("Error \(error)")
}

Définissez maintenant l'autorisation d'accès à l'emplacement. Ajoutez donc cette valeur clé dans votre fichier info.plist

 <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>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Do you allow this app to know your current location?</string>

 enter image description here

100% travaille sans aucun problème. TESTÉ

20
Mr.Javed Multani

ajoutez d'abord deux cadres dans votre projet

1: MapKit

2: Corelocation (n'est plus nécessaire à partir de XCode 7.2.1)

Définir dans votre classe

var manager:CLLocationManager!
var myLocations: [CLLocation] = []

puis dans le code de la méthode viewDidLoad cela

manager = CLLocationManager()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.requestAlwaysAuthorization()
manager.startUpdatingLocation()

//Setup our Map View
mapobj.showsUserLocation = true

n'oubliez pas d'ajouter ces deux valeurs dans le fichier plist

1: NSLocationWhenInUseUsageDescription

2: NSLocationAlwaysUsageDescription
14
Krutarth Patel
 override func viewDidLoad() {

    super.viewDidLoad()       
    locationManager.requestWhenInUseAuthorization();     
    if CLLocationManager.locationServicesEnabled() {
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
        locationManager.startUpdatingLocation()
    }
    else{
        print("Location service disabled");
    }
  }

Ceci est votre méthode de chargement de vue et dans la classe ViewController inclut également la méthode de mise à jour mapStart comme suit

func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!) {
    var locValue : CLLocationCoordinate2D = manager.location.coordinate;
    let span2 = MKCoordinateSpanMake(1, 1)    
    let long = locValue.longitude;
    let lat = locValue.latitude;
    print(long);
    print(lat);        
    let loadlocation = CLLocationCoordinate2D(
                    latitude: lat, longitude: long            

   )     

    mapView.centerCoordinate = loadlocation;
    locationManager.stopUpdatingLocation();
}

Aussi n'oubliez pas d'ajouter CoreLocation.FrameWork et MapKit.Framework dans votre projet (n'est plus nécessaire depuis XCode 7.2.1 )

10
Tek Raj
import CoreLocation
import UIKit

class ViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager: CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.requestWhenInUseAuthorization()
    } 

    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        if status != .authorizedWhenInUse {return}
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.startUpdatingLocation()
        let locValue: CLLocationCoordinate2D = manager.location!.coordinate
        print("locations = \(locValue.latitude) \(locValue.longitude)")
    }
}

Comme l'appel à requestWhenInUseAuthorization est asynchrone, l'application appelle la fonction locationManager une fois que l'utilisateur a accordé ou refusé l'autorisation. Par conséquent, il est approprié de placer le code d’obtention de votre emplacement dans cette fonction, avec l’autorisation donnée à l’utilisateur. Ceci est le meilleur tutoriel sur ce que j'ai trouvé à ce sujet .

10
ScottyBlades

Usage:

Définir le champ en classe

let getLocation = GetLocation()

Utilisation en fonction de la classe par code simple:

getLocation.run {
    if let location = $0 {
        print("location = \(location.coordinate.latitude) \(location.coordinate.longitude)")
    } else {
        print("Get Location failed \(getLocation.didFailWithError)")
    }
}

Classe:

import CoreLocation

public class GetLocation: NSObject, CLLocationManagerDelegate {
    let manager = CLLocationManager()
    var locationCallback: ((CLLocation?) -> Void)!
    var locationServicesEnabled = false
    var didFailWithError: Error?

    public func run(callback: @escaping (CLLocation?) -> Void) {
        locationCallback = callback
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
        manager.requestWhenInUseAuthorization()
        locationServicesEnabled = CLLocationManager.locationServicesEnabled()
        if locationServicesEnabled { manager.startUpdatingLocation() }
        else { locationCallback(nil) }
    }

   public func locationManager(_ manager: CLLocationManager,
                         didUpdateLocations locations: [CLLocation]) {
        locationCallback(locations.last!)
        manager.stopUpdatingLocation()
    }

    public func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        didFailWithError = error
        locationCallback(nil)
        manager.stopUpdatingLocation()
    }

    deinit {
        manager.stopUpdatingLocation()
    }
}
3
Renetik
// its with strongboard 
@IBOutlet weak var mapView: MKMapView!

//12.9767415,77.6903967 - exact location latitude n longitude location 
let cooridinate = CLLocationCoordinate2D(latitude: 12.9767415 , longitude: 77.6903967)
let  spanDegree = MKCoordinateSpan(latitudeDelta: 0.2,longitudeDelta: 0.2)
let region = MKCoordinateRegion(center: cooridinate , span: spanDegree)
mapView.setRegion(region, animated: true)
0
Ramanaraynan

100% travaillant dans iOS Swift 4 de: Parmar Sajjad

Étape 1: Allez sur GoogleDeveloper Api Console et créez votre ApiKey.

Étape 2: Goto Project installe le pod GoogleMaps de Cocoapods 

étape 3: Goto AppDelegate.Swift importer GoogleMaps et 

  func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    GMSServices.provideAPIKey("ApiKey")
    return true
}

étape 4: Importation UIKit Importation GoogleMaps ViewController de classe: UIViewController, CLLocationManagerDelegate {

@IBOutlet weak var mapview: UIView!
let locationManager  = CLLocationManager()

override func viewDidLoad() {
    super.viewDidLoad()
    locationManagerSetting()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


func locationManagerSetting() {

    self.locationManager.delegate = self
    self.locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
    self.locationManager.requestWhenInUseAuthorization()
    self.locationManager.startUpdatingLocation()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    self.showCurrentLocationonMap()
    self.locationManager.stopUpdatingLocation()
}
func showCurrentLocationonMap() {
    let
    cameraposition  = GMSCameraPosition.camera(withLatitude: (self.locationManager.location?.coordinate.latitude)!  , longitude: (self.locationManager.location?.coordinate.longitude)!, zoom: 18)
    let  mapviewposition = GMSMapView.map(withFrame: CGRect(x: 0, y: 0, width: self.mapview.frame.size.width, height: self.mapview.frame.size.height), camera: cameraposition)
    mapviewposition.settings.myLocationButton = true
    mapviewposition.isMyLocationEnabled = true

    let marker = GMSMarker()
    marker.position = cameraposition.target
    marker.snippet = "Macczeb Technologies"
    marker.appearAnimation = GMSMarkerAnimation.pop
    marker.map = mapviewposition
    self.mapview.addSubview(mapviewposition)

}

}

étape 5: ouvrez le fichier info.plist et ajoutez-le ci-dessous Confidentialité - Emplacement en cours d'utilisation Description de l'utilisation ...... sous le nom de base d'un fichier de storyboard

étape 6: courir

0
Sajjad Parmar

voici un exemple de copier-coller qui a fonctionné pour moi.

http://swiftdeveloperblog.com/code-examples/determine-users-current-location-example-in-Swift/

import UIKit
import CoreLocation

class ViewController: UIViewController, CLLocationManagerDelegate {

    var locationManager:CLLocationManager!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        determineMyCurrentLocation()
    }


    func determineMyCurrentLocation() {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.desiredAccuracy = kCLLocationAccuracyBest
        locationManager.requestAlwaysAuthorization()

        if CLLocationManager.locationServicesEnabled() {
            locationManager.startUpdatingLocation()
            //locationManager.startUpdatingHeading()
        }
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        let userLocation:CLLocation = locations[0] as CLLocation

        // Call stopUpdatingLocation() to stop listening for location updates,
        // other wise this function will be called every time when user location changes.

       // manager.stopUpdatingLocation()

        print("user latitude = \(userLocation.coordinate.latitude)")
        print("user longitude = \(userLocation.coordinate.longitude)")
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error)
    {
        print("Error \(error)")
    }
}
0
Eric Stevenson