sistema - iOS9 no rastrea la ubicación mientras está en segundo plano
desactivar servicios del sistema iphone datos (4)
El nuevo método es locationManager -> requestLocation () vea https://developer.apple.com/library/ios/documentation/CoreLocation/Reference/CLLocationManager_Class/ También se agrega allowBackgroundLocationUpdates (solo para iOS9).
Mi aplicación rastrea la ubicación mientras está en segundo plano ... el modo de fondo de ubicación está habilitado y yo uso
[self.locationManager startUpdatingLocation];
Esto funciona muy bien en iOS7-8
pero dejó de funcionar en iOS9
En el simulador funciona, pero en un dispositivo real no recibo devolución de llamada mientras estoy en segundo plano ... cuando ejecuto el mismo código en el dispositivo iOS8, obtengo devoluciones de llamada normales como antes
¿Está esto documentado? ¿Por qué funciona en simulador y no en dispositivo? ¿Es un error?
Cuando se usa startSignificantChangeUpdates
, funciona en iOS9, me pregunto si esto es algún tipo de función de ahorro de batería, que posiblemente prohibió el inicio.
Por favor, use la siguiente referencia para la ubicación en iOS 9
allowBackgroundLocationUpdates en CLLocationManager en iOS9
Esta nueva propiedad se explica en la sesión de la WWDC "Novedades en la ubicación central".
El valor predeterminado es NO si se vincula con iOS 9.
Si su aplicación utiliza la ubicación en segundo plano (sin mostrar la barra de estado azul), tiene que configurar allowBackgroundLocationUpdates en YES, además de configurar la capacidad del modo de fondo en Info.plist. De lo contrario, las actualizaciones de ubicación solo se entregan en primer plano. La ventaja es que ahora puede tener administradores de ubicación con actualizaciones de ubicación de fondo y otros administradores de ubicación con solo actualizaciones de ubicación de primer plano en la misma aplicación. También puede restablecer el valor a NO para cambiar el comportamiento.
La documentación es bastante clara al respecto:
De forma predeterminada, esto es NO para las aplicaciones vinculadas a iOS 9.0 o posterior, independientemente del objetivo mínimo de implementación.
Con UIBackgroundModes configurado para incluir "ubicación" en Info.plist, también debe establecer esta propiedad en SÍ en tiempo de ejecución cada vez que llame a -startUpdatingLocation con la intención de continuar en segundo plano.
Establecer esta propiedad en SÍ cuando UIBackgroundModes no incluye "ubicación" es un error fatal.
Restablecer esta propiedad a NO equivale a omitir "ubicación" del valor UIBackgroundModes. El acceso a la ubicación todavía está permitido cuando la aplicación se está ejecutando (es decir, no está suspendida), y tiene la autorización suficiente (es decir, tiene la autorización WhenInUse y está en uso, o tiene la autorización Always). Sin embargo, la aplicación seguirá sujeta a las reglas habituales de suspensión de tareas.
Consulte -requestWhenInUseAuthorization y -requestAlwaysAuthorization para obtener más detalles sobre los posibles valores de autorización.
Gracias
Tuve el mismo problema, necesitas agregar algo como esto:
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"9.0")){
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
Mi macro para verificar la versión del sistema se ve así:
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
La siguiente publicación en el foro me ayudó:
Utilizar:
if ([self.locationManager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) {
[self.locationManager setAllowsBackgroundLocationUpdates:YES];
}
para evitar el uso de una macro que evalúa la versión del sistema. Esto llamará a setAllowsBackgroundLocationUpdates: en iOS 9 pero no en iOS 8.