requestAlwaysAuthorization no muestra alerta de permiso

Estoy intentando usar algunos elegantes iBeacons sin éxito, kCLAuthorizationStatusNotDetermined todo el time. De acuerdo con otras preguntas, es un requisito agregar esas keys a info.plist (algunas preguntas dicen una, otras dicen ambas). De acuerdo con 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 ícono no apareció en Configuración / Privacidad / Ubicación hasta que se ejecutó uno de los dos últimos methods. La vista de alerta para aprobar los permissions nunca aparece. Si realizo un cambio manual en la Configuración de location y lo compruebo, cambiará el estado, pero en unos instantes más tarde, la Ubicación en Configuración borrará el estado "Siempre" para mi aplicación y lo dejará en blanco nuevamente. Más tarde verifiqué sin suerte

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

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

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

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 la location en 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 muestre:

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

Simplemente agregue estas líneas a su file .plist

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

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 rápido, delegado es llamada.

Agregue el marco de location del núcleo a las configuraciones del proyecto / destinos / capacidades / modos de background, configure "Actualizaciones de location" y "Utiliza los accesorios Bluetooth LE" Agregue key 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 cuadro de dialog aparece correcto

Asegúrese de agregar las keys al file Info.plist correcto. No olvides que hay una para tu aplicación y otra para AppTest.

Swift 3.X El último código fácil de usar

 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)") } 

Intente actualizar la location (me ayudó)

 [self.locationManager startUpdatingLocation]; 

Copié este tutorial …

http://willd.me/posts/getting-started-with-ibeacon-a-swift-tutorial

No funcionó correctamente, aunque la solución fue muy simple, no declarar

Dejar que locationManager = CLLocationManager ()

Pero muévelo a la class como variable

var locationManager = CLLocationManager ()

¡¡Y funciona!!

Aparecerá un aviso cuando el permiso de location de su aplicación no esté configurado y una vez que se establezca el permiso de location 'en uso' para su aplicación, las llamadas posteriores no se mostrarán (y no creo que haya ningún comentario de API que el la llamada fue tragada).

De documentos de Apple :

Discusión Cuando el estado actual de la autorización no está definido, este método se ejecuta de forma asíncrona y solicita al usuario que otorgue permiso a la aplicación para utilizar los services de location. La request del usuario contiene el text de la key NSLocationAlwaysUsageDescription en el file Info.plist de su aplicación, y la presencia de esa key es necesaria cuando se llama a este método. Una vez que se determina el estado, el administrador de location entrega los resultados al método locationManager ( : didChangeAuthorization 🙂 del delegado . Si el estado actual de la autorización es distinto de no Determinado, este método no hace nada y no llama al método locationManager ( : didChangeAuthorization :), con una exception. Si su aplicación nunca ha solicitado una autorización y su estado de autorización actual está autorizado cuando se utiliza, puede llamar a este método una vez para intentar cambiar el estado de autorización de su aplicación a AuthorizedAlways.