allowsBackgroundLocationUpdates en CLLocationManager en iOS9

Estoy usando CoreLocation framework en mi aplicación en Xcode7 (pre-released), y noté que hay una propiedad recientemente añadida llamada allowsBackgroundLocationUpdates en la clase CLLocationManager .

¿Cuál es la relación entre esta propiedad y las actualizaciones de ubicación en los modos de fondo de la pestaña Capacidades? ¿Cuál es el valor predeterminado y afecta a las aplicaciones que se ejecutan 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 enlaza con iOS 9.

Si su aplicación utiliza la ubicación en segundo plano (sin mostrar la barra de estado azul), debe configurar allowsBackgroundLocationUpdates 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 en segundo plano y otros administradores de ubicación con solo actualizaciones de ubicación en 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:

Por defecto, esto es NO para aplicaciones vinculadas con iOS 9.0 o posterior, independientemente del objective de despliegue mínimo.

Con UIBackgroundModes configurado para incluir “ubicación” en Info.plist, también debe establecer esta propiedad en SÍ en el tiempo de ejecución siempre 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 de UIBackgroundModes. El acceso a la ubicación todavía está permitido siempre que la aplicación se esté ejecutando (es decir, no se haya suspendido) y tenga suficiente autorización (es decir, tenga la autorización WhenInUse y esté en uso, o tenga la autorización Always). Sin embargo, la aplicación aún estará sujeta a las reglas habituales de suspensión de tareas.

Consulte -requestWhenInUseAuthorization and -requestAlwaysAuthorization para obtener más información sobre los posibles valores de autorización.

Si está utilizando CoreLocation Framework en su aplicación en Xcode7 (prelanzamiento), y puede observar que hay una propiedad recientemente añadida llamada allowsBackgroundLocationUpdates en la clase CLLocationManager.

Esta nueva propiedad se explica en la sesión de la WWDC “Novedades en la ubicación central” . enter image description here

El valor predeterminado es NO si enlaza con iOS 9.

Si su aplicación utiliza la ubicación en segundo plano (sin mostrar la barra de estado azul), debe configurar allowsBackgroundLocationUpdates 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 en segundo plano y otros administradores de ubicación con solo actualizaciones de ubicación en 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:

Por defecto, esto es NO para aplicaciones vinculadas con iOS 9.0 o posterior, independientemente del objective de despliegue mínimo.

Con UIBackgroundModes configurado para incluir “ubicación” en Info.plist, también debe establecer esta propiedad en SÍ en el tiempo de ejecución siempre 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 de UIBackgroundModes. El acceso a la ubicación todavía está permitido siempre que la aplicación se esté ejecutando (es decir, no se haya suspendido) y tenga suficiente autorización (es decir, tenga la autorización WhenInUse y esté en uso, o tenga la autorización Always). Sin embargo, la aplicación aún estará sujeta a las reglas habituales de suspensión de tareas.

Consulte -requestWhenInUseAuthorization and -requestAlwaysAuthorization para obtener más información sobre los posibles valores de autorización.

Establezca Info.plist como: enter image description here

La syntax de la configuración de Info.plist tiene este aspecto:

 NSLocationAlwaysUsageDescription I want to get your location Information in background UIBackgroundModes  location  

O abre la pestaña Capacidades del objective de tu aplicación.

enter image description here

Use como:

 _locationManager = [[CLLocationManager alloc] init]; _locationManager.delegate = self; [_locationManager setDesiredAccuracy:kCLLocationAccuracyBest]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8) { [_locationManager requestAlwaysAuthorization]; } if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) { _locationManager.allowsBackgroundLocationUpdates = YES; } [_locationManager startUpdatingLocation]; 

Escribo una demostración aquí (Demo2)

Bueno, todavía estoy usando xCode 6, ya que 7 beta siempre se bloquea con el simulador, y tengo este problema, ¡aunque ni siquiera enlace con iOS9! ¡Y no puedo establecer esta propiedad ya que no existe en iOS8! Oh Apple, ¿cuándo terminará el tormento?

Lo cambié a esta versión compatible con xCode6 al hacer esta invocación de límite tardío:

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) { BOOL yes = YES; NSMethodSignature* signature = [[CLLocationManager class] instanceMethodSignatureForSelector: @selector( setAllowsBackgroundLocationUpdates: )]; NSInvocation* invocation = [NSInvocation invocationWithMethodSignature: signature]; [invocation setTarget: locationManager]; [invocation setSelector: @selector( setAllowsBackgroundLocationUpdates: ) ]; [invocation setArgument: &yes atIndex: 2]; [invocation invoke]; } 

Confirmado el trabajo en iOS8 (no hace nada) y en iOS9 beta 6 (invoca el método correctamente).

Me enfrenté al mismo servicio de ubicación en modo de fondo para iOS 9.0.x y lo arreglé como se recomienda en esta publicación agregando códigos a continuación

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 9) { _locationManager.allowsBackgroundLocationUpdates = YES; } 

Sin embargo, no funciona en iOS 9.1 ¿Alguien tiene el mismo problema? Si es así, por favor amablemente ayuda. Gracias

 { NSArray* backgroundModes = [NSBundle MainBundle].infoDictionary[@"UIBackgroundModes"]; if(backgroundModes && [backgroundModes containsObject:@"location"]) { if([manager respondsToSelector:@selector(setAllowsBackgroundLocationUpdates:)]) { // We now have iOS9 and the right capabilities to set this: [manager setAllowsBackgroundLocationUpdates:YES]; } } } 

Aquí hay un resumen de muchos métodos que se actualizan de iOS 8 a iOS 9

Se deben buscar muchas API y códigos para cada marco que esté utilizando. Por lo tanto, busque en General el marco y luego encuentre estos métodos para actualizar los métodos depreciados.