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
.
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):
/* ... */
}
}