Obtener la ubicación / coordenadas actuales del usuario

¿Cómo puedo almacenar la ubicación actual del usuario y también mostrar la ubicación en un mapa?

Puedo mostrar coordenadas predefinidas en un mapa, simplemente no sé cómo recibir información del dispositivo.

También sé que tengo que agregar algunos elementos en una lista. ¿Cómo puedo hacer eso?

Para obtener la ubicación actual de un usuario, debe declarar:

 let locationManager = CLLocationManager() 

En viewDidLoad() debe instanitar la clase CLLocationManager , así:

 // 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() } 

Luego, en el método CLLocationManagerDelegate puede obtener las coordenadas de ubicación actuales del usuario:

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

En info.plist, deberá agregar NSLocationAlwaysUsageDescription y su mensaje de alerta personalizado, como AppName (Aplicación de demostración), le gustaría usar su ubicación actual.

debes hacer esos pasos:

  1. agregue CoreLocation.framework a BuildPhases -> Enlace binario con bibliotecas (ya no es necesario a partir de XCode 7.2.1)
  2. importe CoreLocation a su clase – lo más probable es ViewController.swift
  3. agregue CLLocationManagerDelegate a su statement de clase
  4. agregar NSLocationWhenInUseUsageDescription y NSLocationAlwaysUsageDescription a plist
  5. gestor de ubicación init

     locationManager = CLLocationManager() locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestAlwaysAuthorization() locationManager.startUpdatingLocation() 
  6. obtener la ubicación del usuario por:

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

Así es como soy

obtener la ubicación actual y mostrar en Map in Swift 2.0

Asegúrese de haber agregado CoreLocation y MapKit framework a su proyecto (Esto no es necesario con 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) } } 

Aquí está la pantalla de resultados

una captura de pantalla del mapa, centrada en Mumbai

@wonderwhy He agregado mi captura de pantalla de código. por favor compruébalo. Deberá agregar <code/> NSLocationWhenInUseUsageDescription en el plist para autorización. “></p>
<p>  NSLocationWhenInUseUsageDescription = Solicitar permiso para usar el servicio de ubicación cuando las aplicaciones están en segundo plano.  en tu archivo plist. </p>
<p>  Si esto funciona, por favor vote la respuesta. </p>
</div>
</li><!-- #comment-## -->
<div class=

Primero importe la biblioteca de CoreLocation y MapKit:

 import MapKit import CoreLocation 

heredar de CLLocationManagerDelegate a nuestra clase

 class ViewController: UIViewController, CLLocationManagerDelegate 

crea una variable locationManager, estos serán tus datos de ubicación

 var locationManager = CLLocationManager() 

crear una función para obtener la información de ubicación, sea específico, esta syntax exacta funciona:

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

en su función crea una constante para la ubicación actual de los usuarios

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

deje de actualizar la ubicación, esto evita que su dispositivo cambie constantemente la Ventana para centrar su ubicación mientras se mueve (puede omitir esto si desea que funcione de otra manera)

 manager.stopUpdatingLocation() 

obtener la coordinación de usuarios desde userLocatin que acaba de definir:

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

defina cómo se amplía el mapa que quiere que sea:

let span = MKCoordinateSpanMake(0.2,0.2) combina estos dos para obtener la región:

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

ahora establece la región y elige si quieres que vaya allí con animación o no

 mapView.setRegion(region, animated: true) 

cierra tu función }

desde su botón u otra forma en que quiera establecer el locationManagerDeleget en self

ahora permite que se muestre la ubicación

designar la precisión

 locationManager.desiredAccuracy = kCLLocationAccuracyBest 

autorizar:

  locationManager.requestWhenInUseAuthorization() 

para poder autorizar el servicio de localización, necesita agregar estas dos líneas a su plist

enter image description here

obtener ubicación:

 locationManager.startUpdatingLocation() 

muéstralo al usuario:

 mapView.showsUserLocation = true 

Este es mi código completo:

 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) } } 

Swift 3.0

Si no desea mostrar la ubicación del usuario en el mapa, pero solo desea almacenarla en firebase o en algún otro lugar, siga estos pasos,

 import MapKit import CoreLocation 

Ahora use CLLocationManagerDelegate en su VC y debe anular los últimos tres métodos que se muestran a continuación. Puede ver cómo el método requestLocation () obtendrá la ubicación del usuario actual utilizando estos métodos.

 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)") } } 

Ahora puede codificar la llamada siguiente una vez que el usuario inicie sesión en su aplicación. Cuando invoque requestLocation () invocará más adelante didUpdateLocations y podrá almacenar la ubicación en Firebase o en cualquier otro lugar.

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

Si está utilizando GeoFire, entonces, en el método didUpdateLocations anterior, puede almacenar la ubicación como se muestra a continuación.

 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. 

Por último, vaya a Info.plist y habilite “Privacidad: ubicación cuando esté en uso Descripción del uso”.

Cuando usa el simulador para probarlo, siempre le proporciona una ubicación personalizada que configuró en Simulator -> Depuración -> Ubicación.

primero agrega dos marcos en tu proyecto

1: MapKit

2: Corelocation (ya no es necesario a partir de XCode 7.2.1)

Definir en tu clase

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

luego en el método viewDidLoad codifica esto

 manager = CLLocationManager() manager.desiredAccuracy = kCLLocationAccuracyBest manager.requestAlwaysAuthorization() manager.startUpdatingLocation() //Setup our Map View mapobj.showsUserLocation = true 

no olvides agregar estos dos valores en un archivo plist

 1: NSLocationWhenInUseUsageDescription 2: NSLocationAlwaysUsageDescription 
  override func viewDidLoad() { super.viewDidLoad() locationManager.requestWhenInUseAuthorization(); if CLLocationManager.locationServicesEnabled() { locationManager.delegate = self locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters locationManager.startUpdatingLocation() } else{ print("Location service disabled"); } } 

Este es su método de carga view y en ViewController Class también incluye el método de actualización mapStart de la siguiente manera

 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(); } 

Además , no olvide agregar CoreLocation.FrameWork y MapKit.Framework en su proyecto (ya no es necesario a partir de XCode 7.2.1 )

Importar biblioteca como:

 import CoreLocation 

establecer Delegado:

 CLLocationManagerDelegate 

Tome la variable como:

 var locationManager:CLLocationManager! 

En viewDidLoad () escribe este bonito código:

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

Escribir los métodos de delegado 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)") } 

Ahora configure el permiso para acceder a la ubicación, así que agregue el valor de esta clave en su archivo info.plist

  NSLocationAlwaysUsageDescription Will you allow this app to always know your location? NSLocationWhenInUseUsageDescription Do you allow this app to know your current location? NSLocationAlwaysAndWhenInUseUsageDescription Do you allow this app to know your current location? 

enter image description here

100% trabajando sin ningún problema. PROBADO

 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)") } } 

Debido a que la llamada a requestWhenInUseAuthorization es asincrónica, la aplicación llama a la función de locationManager una vez que el usuario ha otorgado el permiso o lo ha rechazado. Por lo tanto, es apropiado ubicar su ubicación obteniendo el código dentro de esa función dado el permiso otorgado por el usuario. Este es el mejor tutorial sobre esto que he encontrado en él .

 // 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) 

No tienes que hacer muchas cosas, solo agrega estas dos líneas y podrás mostrar la ubicación actual del usuario en el mapa cuando el usuario toque el botón (Tendrás el botón de mostrar la ubicación actual como una ventaja adicional :))

 mapView.myLocationEnabled = true mapView.settings.myLocationButton = true