corelocation - Problema de autorización de CLLocationManager para iOS 8
location swift (6)
Estoy trabajando en una parte del código Swift para iOS 8. Estoy tratando de hacer algo que involucra la ubicación, por lo que he implementado lo siguiente en mi archivo de controlador de vista rápida:
let locationManger:CLLocationManager = CLLocationManager()
var speedReceived:Double = 0
override func viewDidLoad() {
super.viewDidLoad()
locationManger.delegate = self
locationManger.desiredAccuracy = kCLLocationAccuracyBest
let authstate = CLLocationManager.authorizationStatus()
if(authstate == CLAuthorizationStatus.NotDetermined){
println("Not Authorised")
locationManger.requestWhenInUseAuthorization()
}
// Do any additional setup after loading the view, typically from a nib.
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){
var location:CLLocation = locations[locations.count - 1] as CLLocation
if(location.horizontalAccuracy > 0){
self.speedReceived = location.speed
println(self.speedReceived)
}
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("Couldn''t get your location")
}
Sin embargo, parece que no puedo conseguir que este código funcione. No guarda mi preferencia para el uso de la ubicación. ni siquiera me pide que dé permiso para acceder a la ubicación. He intentado actualizar mi info.plist. Pero no está funcionando. Por cierto, si selecciono siempre en la configuración de privacidad dentro del simulador, funciona si vuelvo a la aplicación inmediatamente. ¿Alguien puede ayudar? Estoy seguro de que ese es el problema porque obtengo No autorizado en mi consola.
¿Alguna ayuda?
Como no me gusta editar la lista directamente, siempre concedo la autorización mediante la interfaz de usuario.
Los textos holandeses "Toegang is nodig" y "Toegang is noodzakelijk" se muestran en el PopUp en el que se utiliza el acceso otorgado. Puede cambiar estos a cualquier texto que desee.
Simplemente agregue a la fuente plist,
<key>NSLocationAlwaysUsageDescription</key>
<string>To get location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>To get location</string>
Es un tema relacionado con iOS 8. NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
claves NSLocationAlwaysUsageDescription
o NSLocationWhenInUseUsageDescription
en su archivo .plist
(el valor puede ser un mensaje adicional que se presentará en la alerta de ubicación). Estas claves son necesarias en iOS 8.
Como se dice en las directrices de Apple :
Esta clave es necesaria cuando utiliza el método requestAlwaysAuthorization de la clase CLLocationManager para solicitar autorización para los servicios de ubicación. Si esta clave no está presente y usted llama al método requestAlwaysAuthorization, el sistema ignora su solicitud e impide que su aplicación utilice los servicios de ubicación.
Para Swift 2, he reemplazado la versión respondsToSelector () con una versión de iOS. No es tan elegante, pero se requiere que Xcode 7 dé 0 errores, 0 advertencias
if #available(iOS 8.0, *) {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}
Tuve problemas con un problema similar, que persistió incluso después de agregar las claves NSLocationAlwaysUsageUsageDescription / NSLocationWhenInUseUsageDescription al plist.
Finalmente, agregué la clave "Privacidad - Descripción del uso de la ubicación" al plist (además de las nuevas claves) y ¡listo, funcionó! Después de que funcionó una vez pude eliminar la clave "Privacidad - Descripción del uso de la ubicación" de la lista y continuar solicitando autorización con éxito.
Yo tuve exactamente el mismo problema.
Para el registro, esta no es la respuesta oficial. La primera respuesta es la correcta. Solo quería agregar un enlace a un proyecto FOSS (Objective-C) que ilustra la solución.
Como señalé, tuve que añadir la llave. Mi aplicación no necesita ejecutarse en segundo plano, así que agregué la clave NSLocationWhenInUseUsageDescription a mi info.plist.
Si agrega una cadena como el valor de esta clave (opcional - la existencia de la clave es suficiente para establecer la barra), esa cadena aparecerá en la ventana emergente de autorización.
Luego agregué el siguiente código antes de todas mis llamadas [CLLocationManager startUpdating]:
if ( [locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)] )
{
[locationManager requestWhenInUseAuthorization];
}
El respondsToSelector es importante, ya que la llamada solo está disponible en iOS 8.
La primera vez que se llama, se muestra la alerta. Después de eso, se cae.
Tenga en cuenta que llamo requestWhenInUseAuthorization
Tiene que coincidir con el valor que pongo en la lista. Supongo que podrías poner ambos, pero no sé. No necesitaba hacerlo.
El proyecto está here . La mayor parte del trabajo (no mucho) está en el archivo BMLTAppDelegate.m .
Esta es una sorpresa desagradable. Mucha gente no tiene idea de que sus aplicaciones dejarán de funcionar en iOS 8. Harán lo mismo que hice inicialmente: inténtelo rápidamente en el simulador, anótese y cámbielo a un error beta.
Ahora, tengo un problema diferente: todas mis aplicaciones están arregladas, pero Xcode se bloquea cuando intento cargar las aplicaciones en la App Store. Tengo un radar abierto en él.
Xcode 6 es un poco chirriante. Espero que un parche salga bastante rápido.
iOS 8 ha cambiado la estrategia de autorización de ubicación. Solución con compatibilidad hacia atrás:
SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
[self.locationManager respondsToSelector:requestSelector]) {
[self.locationManager performSelector:requestSelector withObject:NULL];
} else {
[self.locationManager startUpdatingLocation];
}
Recordatorio: configure la clave NSLocationWhenInUseUsageDescription en su Info.plist