ios - ¿Cómo habilito el acceso al servicio de monitoreo de la región?
ios7 monitoring (4)
He simplificado la pregunta un poco. Cuando creo y agrego regiones en mi aplicación e interrogo el estado de esas regiones, veo lo siguiente en el método monitoringDidFailForRegion
:
The operation couldn''t be completed. (kCLErrorDomain error 4.)
Comprobando las constantes CLErrorDomain veo que el error 4 es kCLErrorRegionMonitoringDenied
y se describe así:
Access to the region monitoring service was denied by the user.
¿Cómo es esto posible? Aquí está mi configuración y lo que he comprobado:
- Estoy trabajando a través de Xcode para ver las declaraciones de registro.
- Estoy conectado a mi iPhone 5. No estoy corriendo en el simulador.
- Me he asegurado de que el radio tenga el tamaño suficiente para ser monitoreado (aunque no debería importar).
- Me he asegurado de que Configuración> Privacidad> Servicios de ubicación esté activada para mi dispositivo y mi aplicación.
- He leído todos los documentos de Core Location y Region Monitoring que Apple ha publicado alguna vez.
- Me he asegurado de que WiFi esté encendido y de que tenga una señal celular fuerte. Si no lo hiciera, no podría encontrar mi ubicación en primer lugar.
- Me he asegurado de que
didChangeAuthorizationStatus
informe el estado correcto:kCLAuthorizationStatusAuthorized
- Me he asegurado de que, después de agregar mi región, la monitorización comience de hecho al observar la llamada al método
didStartMonitoringForRegion
.
¿Qué me estoy perdiendo? ¿Por qué veo este error cuando los Servicios de localización están claramente habilitados?
Entonces, eché otro vistazo a la documentación sobre el monitoreo de la región y noté esto en el elemento resaltado en la lista:
Determinar la disponibilidad de monitoreo de la región
Antes de intentar monitorear cualquier región, su aplicación debe verificar si la región de monitoreo es compatible con el dispositivo actual. Hay varias razones por las cuales la monitorización de la región podría no estar disponible:
- Es posible que el dispositivo no tenga el hardware necesario para admitir la supervisión de la región.
- Es posible que el usuario haya denegado a la aplicación la autorización para usar la supervisión de la región.
- El usuario puede haber deshabilitado los servicios de ubicación en la aplicación Configuración.
- Es posible que el usuario haya desactivado la Actualización de la aplicación en segundo plano en la aplicación Configuración, ya sea para el dispositivo o para su aplicación.
- El dispositivo puede estar en modo avión y no puede encender el hardware necesario.
Luego verifiqué que Background App Refresh (una nueva característica en iOS 7: Configuración> General> Background App Refresh) está activada y disponible para mi aplicación. No fue así . Encendí la función y BOOM mis regiones están informando sobre su estado ahora.
Es confuso y engañoso que:
[CLLocationManager isMonitoringAvailableForClass:[CLRegion class]] returns YES
... incluso cuando Background App Refresh está desactivado. Yo pensaría que regresaría NO.
ACTUALIZAR:
Le envié un informe de error a Apple y agregué un Open Radar para este problema.
ACTUALIZACIÓN 3-11-14:
Apple ha confirmado que esto es un error.
Intente agregar la entrada correspondiente en su lista de información para las solicitudes del usuario cuando otorgue permiso para usar los servicios de ubicación. Estas entradas de info.plist son (NSLocationWhenInUseUsageDescription y NSLocationAlwaysUsageDescription). Me he dado cuenta de que la omisión de la entrada NSLocationUsageDescription no tuvo el mismo efecto negativo. buena suerte.
Para hacer una monitorización regional (al menos en iOS 9), debe solicitar la autorización "siempre". Esto no se documentó en ningún lugar que pude encontrar, pero es la única forma en que pude lograr que el monitoreo de la región funcionara.
rdar: // 23566600 - si estás dentro de la manzana :)
Para mi caso, ayudo a configurar "SIEMPRE" "Para hacer un monitoreo de región (al menos en iOS 9), necesita solicitar" siempre "autorización" y 300 metros de radio