CLLocationManager requestStateForRegion con el código de error de acceso a la location "When In Use" 4

Estoy intentando implementar iBeacon para una aplicación de iOS.

[locationManager requestAlwaysAuthorization]; CLBeaconRegion * region = [self regionFromUUID:uuid]; [locationManager startMonitoringForRegion:region]; 

Para determinar si el dispositivo está dentro o fuera de la región:

 - (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { [locationManager requestStateForRegion:region]; } 

Esto llama con éxito:

 - (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { if (state == CLRegionStateInside) { [locationManager startRangingBeaconsInRegion:(CLBeaconRegion*)region]; } else { [locationManager stopRangingBeaconsInRegion:(CLBeaconRegion*)region]; } } 

y la aplicación está en path con éxito con locationManager:didRangeBeacons:inRegion:

El problema que estoy encontrando es usar requestWhenInUseAuthorization . Después de locationManager:didStartMonitoringForRegion: calls [location requestStateForRegion:region] , the delegate method locationManager:monitoringDidFailForRegion:withError: devuelve el código de error 4: "La operación no se pudo completar".

Intercambiar requestStateForRegion con startRangingBeaconsInRegion parece omitir este error y locationManager:didRangeBeacons:inRegion: se llama con éxito.

¿Es esto un problema conocido que [locationManager requestStateForRegion:region]; causará el código de error 4 si solo se otorga kCLAuthorizationStatusAuthorizedWhenInUse ?

La documentation de Apple para la supervisión de la región me estaba molestando por este extracto:

Si el estado de la autorización es kCLAuthorizationStatusAuthorized, su aplicación puede recibir notifications de cruce de límites para las regiones que registró. Si el estado de la autorización se establece en cualquier otro valor, la aplicación no recibe esas notifications.

Estaba pensando que kCLAuthorizationStatusAuthorized (desaprobado en iOS 8) includeía kCLAuthorizationStatusAuthorizedAlways y kCLAuthorizationStatusAuthorizedWhenInUse ya que ambos eran types especiales de "Authorized".

Gracias a @heypiotr, decidí mirar la Declaración de Apple Docs y noté que el enum declara lo siguiente:

 kCLAuthorizationStatusAuthorized, kCLAuthorizationStatusAuthorizedAlways = kCLAuthorizationStatusAuthorized, kCLAuthorizationStatusAuthorizedWhenInUse 

Por lo tanto, requestStateForRegion requiere kCLAuthorizationStatusAuthorizedAlways porque ese es el único valor que es el mismo que kCLAuthorizationStatusAuthorized , y según Apple, solo kCLAuthorizationStatusAuthorized funcionará con la supervisión.

La supervisión de la location central requiere la autorización "siempre", incluso si solo intenta supervisar cuando la aplicación está activa. Dado que requestStateForRegion es parte de la API de supervisión, explicaría por qué arroja el error de supervisión cuando está en la autorización "cuando está en uso".

La única solución en la que puedo pensar es, cuando se usa la autorización "cuando está en uso", comenzar de inmediato y usar los resultados de scope en lugar de requestStateForRegion para determinar si estás dentro o fuera del scope de una baliza determinada.

    Intereting Posts