Saltar al contenido

Cómo obtener la longitud y latitud actuales usando CLLocationManager-Swift

Solución:

En mi humilde opinión, estás complicando demasiado tu código cuando la solución que estás buscando es bastante simple.

Lo he hecho usando el siguiente código:

Primero crea una instancia de CLLocationManager y solicitar autorización

var locManager = CLLocationManager()
locManager.requestWhenInUseAuthorization()

luego verifique si el usuario permitió la autorización.

var currentLocation: CLLocation!

if 
   CLLocationManager.authorizationStatus() == .authorizedWhenInUse ||
   CLLocationManager.authorizationStatus() ==  .authorizedAlways
{         
    currentLocation = locManager.location        
}

para usarlo solo haz esto

label1.text = "(currentLocation.coordinate.longitude)"
label2.text = "(currentLocation.coordinate.latitude)"

Tu idea de ponerlos en el label.text es correcto, sin embargo, la única razón en la que puedo pensar es que el usuario no le está dando permiso y es por eso que sus datos de ubicación actuales serán nulos.

Sin embargo, necesitaría depurar y decirnos eso. También el CLLocationManagerDelegate no es necesario.

Ojalá esto ayude. Pregunte si tiene dudas.

Para Rápido 3:

Primero debe establecer la asignación para recibir el GPS del usuario en el info.plist.

ingrese la descripción de la imagen aquí

Colocar: NSLocationWhenInUseUsageDescription con una cadena aleatoria. Y / o: NSLocationAlwaysUsageDescription con una cadena aleatoria.

Luego:

import UIKit
import MapKit

class ViewController: UIViewController {

    var locManager = CLLocationManager()
    var currentLocation: CLLocation!

    override func viewDidLoad() {
        super.viewDidLoad()
        locManager.requestWhenInUseAuthorization()

        if (CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedWhenInUse ||
            CLLocationManager.authorizationStatus() == CLAuthorizationStatus.authorizedAlways){
            guard let currentLocation = locManager.location else {
                return
            }
            print(currentLocation.coordinate.latitude)
            print(currentLocation.coordinate.longitude)
        }
    }
}

Hecho.

A pesar de otros consejos, debe utilizar el CLLocationManagerDelegate para recuperar una ubicación de forma segura (sin usarla, puede obtener ubicaciones nulas cuando el administrador de ubicaciones no tiene tiempo suficiente para actualizar). Recomiendo encarecidamente envolver el código del administrador de ubicación dentro de un ayudante compartido estático (algo similar a estas líneas):

class Locator: NSObject, CLLocationManagerDelegate {
    enum Result <T> {
      case .Success(T)
      case .Failure(ErrorType)
    }

    static let shared: Locator = Locator()

    typealias Callback = (Result <Locator>) -> Void

    var requests: Array <Callback> = Array <Callback>()

    var location: CLLocation? { return sharedLocationManager.location  }

    lazy var sharedLocationManager: CLLocationManager = {
        let newLocationmanager = CLLocationManager()
        newLocationmanager.delegate = self
        // ...
        return newLocationmanager
    }()

    // MARK: - Authorization

    class func authorize() { shared.authorize() }
    func authorize() { sharedLocationManager.requestWhenInUseAuthorization() }

    // MARK: - Helpers

    func locate(callback: Callback) {
        self.requests.append(callback)
        sharedLocationManager.startUpdatingLocation()
    }

    func reset() {
        self.requests = Array <Callback>()
        sharedLocationManager.stopUpdatingLocation()
    }

    // MARK: - Delegate

    func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
        for request in self.requests { request(.Failure(error)) }
        self.reset()
    }

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: Array <CLLocation>) {
        for request in self.requests { request(.Success(self)) }
        self.reset()
    }

}

Luego, en la vista, se cargó (o en cualquier otro lugar donde necesite obtener la ubicación actual) se ejecuta:

Locator.shared.locate { result in
  switch result {
  case .Success(locator):
    if let location = locator.location { /* ... */ }
  case .Failure(error):
    /* ... */
  }
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *