También debe agregar una cadena para las teclas NSLocationAlwaysUsageDescriptiono NSLocationWhenInUseUsageDescriptional Info.plist de la aplicación. De lo contrario startUpdatingLocation, se ignorarán las llamadas a y su delegado no recibirá ninguna devolución de llamada.
Y al final, cuando haya terminado de leer la ubicación, llame a stop. Actualice la ubicación en el lugar adecuado.
+1 gracias por publicar un fragmento de código simple para complementar la respuesta aceptada
AngeloS
12
Tenga cuidado con este ejemplo, estos valores de propiedad conducen a un mayor consumo de batería.
DanSkeel
36
IMPORTANTE: también debe "detener las actualizaciones de ubicación"; de lo contrario, se llamará al método delegado cada vez que el usuario cambie su ubicación. Por lo tanto, el problema de batería mencionado anteriormente y también si se activa otro método en este método delegado, se seguirá llamando. Happy Coding Guys !! ¡¡Salud!!
Apple_iOS0304
55
Usted es el tipo de usuario que hace que StackOverflow sea excelente. Los fragmentos de código son ejemplares y espero que más personas los incluyan con sus respuestas.
Danny
26
Para iOS 8.0+, debe incluir las siguientes claves en Info.plist de su proyecto: NSLocationAlwaysUsageDescriptionsi está utilizando [self.locationManager requestAlwaysAuthorization]o NSLocationWhenInUseUsageDescriptionsi está utilizando [self.locationManager requestWhenInUseAuthorization]. También para admitir iOS 6.0+ a iOS 7.0+ incluye la clave NSLocationUsageDescriptiono 'Privacidad - Descripción del uso de la ubicación'. Más información en el enlace: developer.apple.com/library/ios/documentation/General/Reference/…
Intenté exactamente los mismos pasos mencionados anteriormente. Pero me sale "El usuario sigue pensando" impreso en la consola. Entonces, ¿significa que la aplicación no está autorizada para usar la ubicación? En caso afirmativo, ¿cómo permito que la aplicación use la ubicación? Por favor ayuda.
Lo primero es lo primero. Debe agregar su cadena descriptiva en el archivo info.plist para las claves NSLocationWhenInUseUsageDescriptiono NSLocationAlwaysUsageDescriptionsegún el tipo de servicio que solicite
Código
importFoundationimportCoreLocationclassLocationManager:NSObject,CLLocationManagerDelegate{
let manager:CLLocationManager
var locationManagerClosures:[((userLocation:CLLocation)->())]=[]
override init(){
self.manager =CLLocationManager()
super.init()
self.manager.delegate= self
}//This is the main method for getting the users location and will pass back the usersLocation when it is available
func getlocationForUser(userLocationClosure:((userLocation:CLLocation)->())){
self.locationManagerClosures.append(userLocationClosure)//First need to check if the apple device has location services availabel. (i.e. Some iTouch's don't have this enabled)ifCLLocationManager.locationServicesEnabled(){//Then check whether the user has granted you permission to get his locationifCLLocationManager.authorizationStatus()==.NotDetermined{//Request permission//Note: you can also ask for .requestWhenInUseAuthorization
manager.requestWhenInUseAuthorization()}elseifCLLocationManager.authorizationStatus()==.Restricted||CLLocationManager.authorizationStatus()==.Denied{//... Sorry for you. You can huff and puff but you are not getting any location}elseifCLLocationManager.authorizationStatus()==.AuthorizedWhenInUse{// This will trigger the locationManager:didUpdateLocation delegate method to get called when the next available location of the user is available
manager.startUpdatingLocation()}}}//MARK: CLLocationManager Delegate methods@objc func locationManager(manager:CLLocationManager, didChangeAuthorizationStatus status:CLAuthorizationStatus){if status ==.AuthorizedAlways|| status ==.AuthorizedWhenInUse{
manager.startUpdatingLocation()}}
func locationManager(manager:CLLocationManager, didUpdateToLocation newLocation:CLLocation, fromLocation oldLocation:CLLocation){//Because multiple methods might have called getlocationForUser: method there might me multiple methods that need the users location.//These userLocation closures will have been stored in the locationManagerClosures array so now that we have the users location we can pass the users location into all of them and then reset the array.
let tempClosures = self.locationManagerClosures
for closure in tempClosures {
closure(userLocation: newLocation)}
self.locationManagerClosures =[]}}
Uso
self.locationManager =LocationManager()
self.locationManager.getlocationForUser {(userLocation:CLLocation)->() in
print(userLocation)}
Creo que hay un cambio () rápido para casos como este: ^)
Anton Tropashko
self.locationManager = LocationManager()use esta línea en el método viewDidLoad para que ARC no elimine la instancia y la ventana emergente de ubicación desaparezca demasiado rápido.
Puede usar este servicio que escribí para manejar todo por usted.
Este servicio solicitará los permisos y se encargará de tratar con CLLocationManager para que no tenga que hacerlo.
Usar así:
LocationService.getCurrentLocationOnSuccess({(latitude, longitude)->() in
//Do something with Latitude and Longitude}, onFailure:{(error)->() in
//See what went wrong
print(error)})
Respuestas:
La respuesta de RedBlueThing funcionó bastante bien para mí. Aquí hay un código de muestra de cómo lo hice.
Encabezamiento
Archivo principal
En el método init
Función de devolución de llamada
ios 6
En iOS 6, la función de delegado estaba en desuso. El nuevo delegado es
Por lo tanto, para obtener la nueva posición, use
iOS 8
En iOS 8, se debe solicitar explícitamente el permiso antes de comenzar a actualizar la ubicación
También debe agregar una cadena para las teclas
NSLocationAlwaysUsageDescription
oNSLocationWhenInUseUsageDescription
al Info.plist de la aplicación. De lo contrariostartUpdatingLocation
, se ignorarán las llamadas a y su delegado no recibirá ninguna devolución de llamada.Y al final, cuando haya terminado de leer la ubicación, llame a stop. Actualice la ubicación en el lugar adecuado.
fuente
NSLocationAlwaysUsageDescription
si está utilizando[self.locationManager requestAlwaysAuthorization]
oNSLocationWhenInUseUsageDescription
si está utilizando[self.locationManager requestWhenInUseAuthorization]
. También para admitir iOS 6.0+ a iOS 7.0+ incluye la claveNSLocationUsageDescription
o 'Privacidad - Descripción del uso de la ubicación'. Más información en el enlace: developer.apple.com/library/ios/documentation/General/Reference/…En iOS 6, el
es obsoleto.
Use el siguiente código en su lugar
Para iOS 6 ~ 8, el método anterior sigue siendo necesario, pero debe manejar la autorización.
Este es el método delegado que maneja la autorización del usuario
fuente
[locations lastObject]
?Utiliza el marco CoreLocation para acceder a la información de ubicación de tu usuario. Deberá crear una instancia de un objeto CLLocationManager y llamar al mensaje asíncrono startUpdatingLocation . Recibirá devoluciones de llamada con la ubicación del usuario a través del CLLocationManagerDelegate que proporcione.
fuente
Prueba estos sencillos pasos ...
NOTA: Verifique la ubicación y la latitud de la ubicación del dispositivo si está utilizando medios simuladores. Por defecto, no es ninguno.
Paso 1:
CoreLocation
marco de importación en el archivo .hPaso 2: Agregar delegado CLLocationManagerDelegate
Paso 3: agregue este código en el archivo de clase
Paso 4: Método para detectar la ubicación actual
Paso 5: obtenga la ubicación con este método
fuente
En Swift (para iOS 8+).
Info.plist
Lo primero es lo primero. Debe agregar su cadena descriptiva en el archivo info.plist para las claves
NSLocationWhenInUseUsageDescription
oNSLocationAlwaysUsageDescription
según el tipo de servicio que soliciteCódigo
Uso
fuente
self.locationManager = LocationManager()
use esta línea en el método viewDidLoad para que ARC no elimine la instancia y la ventana emergente de ubicación desaparezca demasiado rápido.La documentación de Xcode tiene una gran cantidad de conocimiento y aplicaciones de muestra: consulte la Guía de programación de reconocimiento de ubicación .
El proyecto de muestra LocateMe ilustra los efectos de modificar las diferentes configuraciones de precisión del CLLocationManager
fuente
iOS 11.x Swift 4.0 Info.plist necesita estas dos propiedades
Y este código ... asegurándose de que, por supuesto, sea un CLLocationManagerDelegate
Y, por supuesto, también este código que puede poner en viewDidLoad ().
Y estos dos para el requestLocation para ponerlo en marcha, es decir, evitar que tenga que levantarse de su asiento :)
fuente
Puede usar este servicio que escribí para manejar todo por usted.
Este servicio solicitará los permisos y se encargará de tratar con CLLocationManager para que no tenga que hacerlo.
Usar así:
fuente
Para Swift 5, aquí hay una breve clase rápida para obtener la ubicación:
fuente