working nslocationwheninuseusagedescription nslocationalwaysandwheninuseusagedescription not ios core-location ibeacon

ios - nslocationwheninuseusagedescription - nslocationalwaysandwheninuseusagedescription plist



requestAlwaysAuthorization no muestra alerta de permiso (12)

Estoy intentando usar algunos iBeacons de fantasía sin éxito, kCLAuthorizationStatusNotDetermined all time. Según otras preguntas, es un requisito agregar esas claves a info.plist (algunas preguntas dicen una, otras dicen ambas). Según un artículo para iBeacons, necesito la opción Siempre.

<key>NSLocationWhenInUseUsageDescription</key> <string>Nothing to say</string> <key>NSLocationAlwaysUsageDescription</key> <string>Permiso para acceder siempre</string>

En viewDidAppear:

self.locManager = [[CLLocationManager alloc]init]; self.locManager.delegate = self; [self.locManager requestAlwaysAuthorization]; NSUUID* region1UUID = [[NSUUID alloc]initWithUUIDString:@""]; //ibeacon real UUID between "". Checked it''s not nil. self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:proximityUUID identifier:@"myCoolString"]; self.beaconRegion.notifyEntryStateOnDisplay = YES; self.beaconRegion.notifyOnEntry = YES; self.beaconRegion.notifyOnExit = NO; [self.locManager startMonitoringForRegion:self.beaconRegion]; [self.locManager startRangingBeaconsInRegion:self.beaconRegion];

El icono no apareció en Configuración / Privacidad / Ubicación hasta que se ejecutó uno de los dos últimos métodos. La vista de alerta para aprobar permisos nunca aparece. Si realizo un cambio manual en Configuración de ubicación y lo verifico, cambiará de estado, pero al cabo de unos momentos, Ubicación en Configuración eliminará el estado "Siempre" de mi aplicación y lo dejará en blanco nuevamente. Después lo compruebo sin suerte.

-(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status {

¿Alguna idea de lo que falta o está mal? Gracias


Asegúrese de agregar las claves al archivo Info.plist correcto. No olvide que hay uno para su aplicación y otro para AppTest.



Encontrado, documentado en foros y probado, es un error relacionado con Objective-C iOS 8. El mismo código escrito en Swift simplemente funciona. Trabajando código swift, el delegado es llamada.

Agregue el marco de Core Location a Project Settings / Targets / Capabilities / Modos de fondo, establezca "Location Updates" y "Uses Bluetooth LE Accessories" Agregue la clave en Info.plist NSLocationAlwaysUsageDescription

import CoreLocation class ViewController: UIViewController, CLLocationManagerDelegate { var locManager: CLLocationManager? override func viewDidLoad() { super.viewDidLoad() self.locManager = CLLocationManager(); self.locManager!.delegate = self; if (!CLLocationManager.locationServicesEnabled()) { println("Location services are not enabled"); } self.locManager!.requestAlwaysAuthorization(); self.locManager!.pausesLocationUpdatesAutomatically = false; let uuidString = "" // My ibeacon string there let beaconIdentifier = "myCompany" let beaconUUID:NSUUID = NSUUID(UUIDString: uuidString) let beaconRegion:CLBeaconRegion = CLBeaconRegion(proximityUUID: beaconUUID, identifier: beaconIdentifier) self.locManager!.startMonitoringForRegion(beaconRegion) self.locManager!.startRangingBeaconsInRegion(beaconRegion) self.locManager!.startUpdatingLocation() }

El diálogo aparece bien


Hace poco tuve un problema similar con IOS 11 cuando intenté usar

locationManager.requestAlwaysAuthorization()

La solución para mí fue agregar todos los 4 permisos en plist.info para obtener la alerta:

  • Privacidad - Ubicación en uso Descripción del uso
  • Privacidad - Ubicación del uso Descripción
  • Privacidad - Ubicación Siempre Uso Descripción
  • Privacidad - Ubicación siempre y cuando esté en uso Descripción del uso

He notado que si su instancia de CLLocationManager se destruye antes de que se muestre la alerta, nunca verá la alerta. En mi caso, estaba creando una variable local del administrador de ubicación en el AppDelegate para pedir permiso.

CLLocationManager *locationManager = [[CLLocationManager alloc] init]; if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { [locationManager requestAlwaysAuthorization]; }

Cambiar la variable local a una variable de instancia hizo que la alerta se mostrara:

@interface AppDelegate () { CLLocationManager *_locationManager; } @end _locationManager = [[CLLocationManager alloc] init]; if ([_locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) { [_locationManager requestAlwaysAuthorization]; }


Intente iniciar la actualización de la ubicación (me ha ayudado)

[self.locationManager startUpdatingLocation];


Mostrará un aviso cuando no se establezca el permiso de ubicación para su aplicación y una vez cuando se establezca el permiso de ubicación "en uso" para su aplicación, las llamadas subsiguientes no se muestren (y no creo que haya ningún comentario de API que indique que La llamada fue tragada).

De Apple docs :

Discusión Cuando el estado de autorización actual no está determinado, este método se ejecuta de forma asíncrona y solicita al usuario que otorgue permiso a la aplicación para utilizar los servicios de ubicación. La solicitud del usuario contiene el texto de la clave NSLocationAlwaysUsageDescription en el archivo Info.plist de su aplicación, y se requiere la presencia de esa clave al llamar a este método. Una vez determinado el estado, el administrador de ubicación entrega los resultados al método locationManager ( : didChangeAuthorization :) del delegado . Si el estado de autorización actual es diferente a no determinado, este método no hace nada y no llama al método locationManager ( : didChangeAuthorization :), con una excepción. Si su aplicación nunca ha solicitado siempre la autorización y su estado de autorización actual está autorizado. Cuando esté en uso, puede llamar a este método una vez para intentar cambiar el estado de autorización de su aplicación a autorizado Siempre.


Para los desarrolladores de iOS 11, debe consultar esta publicación: Servicios de ubicación que no funcionan en iOS 11 .

TL; DR: necesita TODAS LAS TRES tres claves de ubicación en la lista de información:

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key> <string>...</string> <key>NSLocationAlwaysUsageDescription</key> <string>...</string> <key>NSLocationWhenInUseUsageDescription</key> <string>...</string>

Junto con InfoPlist.strings traducciones de InfoPlist.strings en caso de aplicaciones multilingües.


Por favor revise este enlace de referencia

Ha descrito todos los cambios relacionados con iOS 11. Su problema también parece ser uno de los casos descritos. Podría darle una idea de los cambios que necesita hacer en su código para corregir el problema.


Solo agrega estas líneas a tu archivo .plist

<key>NSLocationAlwaysUsageDescription</key> <string>Optional message</string>


Tenía exactamente el mismo problema. Resultó que, en mi caso, NSLocationAlwaysUsageDescription se requería el NSLocationAlwaysUsageDescription en mis archivos de localización InfoPlist.strings . Tener NSLocationAlwaysUsageDescription en Info.plist no era suficiente ...


Swift 3.X Último código fácilmente uso

import CoreLocation public var locationManager = CLLocationManager() override func viewDidLoad() { super.viewDidLoad() locationManager.delegate = self locationManager.requestAlwaysAuthorization() locationManager.startUpdatingLocation() } func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { let altitudeG = locations.last?.altitude let longitudeG = locations.last?.coordinate.longitude let latitudeG = locations.last?.coordinate.latitude print("/(altitudeG) /(longitudeG) /(latitudeG)") }