ios - mis - Obtener la ubicación/coordenadas actuales del usuario
mapa con coordenadas geográficas (12)
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
¿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?
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
<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>
100% trabajando sin ningún problema. PROBADO
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
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.
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 sintaxis 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
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)
}
}
debes hacer esos pasos:
- agregue
CoreLocation.framework
a BuildPhases -> Enlace binario con bibliotecas (ya no es necesario a partir de XCode 7.2.1) - importe
CoreLocation
a su clase - lo más probable es ViewController.swift - agregue
CLLocationManagerDelegate
a su declaración de clase - agregar
NSLocationWhenInUseUsageDescription
yNSLocationAlwaysUsageDescription
a plist gestor de ubicación init
locationManager = CLLocationManager() locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBest locationManager.requestAlwaysAuthorization() locationManager.startUpdatingLocation()
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)") }
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
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.
NSLocationWhenInUseUsageDescription = Solicitar permiso para usar el servicio de ubicación cuando las aplicaciones están en segundo plano. en tu archivo plist.
Si esto funciona, por favor vote la respuesta.
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 )
// 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)
import CoreLocation
import UIKit
class ViewController: UIViewController, CLLocationManagerDelegate {
var locationManager: CLLocationManager!
override func viewDidLoad() {
super.viewDidLoad()
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
} //ViewDidLoad
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)")
}//locationManager func declaration
}//VC Class
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 concedido 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. El mejor tutorial sobre esto que he encontrado es: https://www.hackingwithswift.com/read/22/2/requesting-location-core-location