ios - usage - startupdatinglocation swift
allowBackgroundLocationUpdates en CLLocationManager en iOS9 (6)
Estoy usando el marco
CoreLocation
en mi aplicación en Xcode7 (prelanzado), y noté que hay una propiedad recientemente agregada 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?
Bueno, todavía estoy usando xCode 6, ya que 7 beta siempre se bloquea con el simulador, y tengo este problema, ¡aunque ni siquiera me conecto con iOS9! ¡Y no puedo configurar esta propiedad ya que no existe en iOS8! Oh Apple, ¿cuándo terminará el tormento?
Lo cambié a esta versión compatible con xCode6 haciendo esta invocación enlazada tarde:
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];
}
Se confirmó que funciona en iOS8 (no hace nada) y en iOS9 beta 6 (invoca el método correctamente).
Esta nueva propiedad se explica en la sesión de WWDC "Novedades en la ubicación principal" .
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), debe establecer
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:
De forma predeterminada, esto NO es para aplicaciones vinculadas con 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 es equivalente 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 autorización suficiente (es decir, tiene autorización WhenInUse y está en uso, o siempre tiene autorización). Sin embargo, la aplicación aún estará 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.
Me enfrenté al mismo servicio de ubicación en modo de fondo para iOS 9.0.xy lo arreglé como se recomienda en esta publicación agregando los siguientes códigos
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
Si está utilizando el marco CoreLocation en su aplicación en Xcode7 (prelanzado), y puede notar que hay una propiedad recientemente agregada llamada allowBackgroundLocationUpdates en la clase CLLocationManager.
Esta nueva propiedad se explica en la sesión de WWDC "Novedades en la ubicación principal" .
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), debe establecer
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:
De forma predeterminada, esto NO es para aplicaciones vinculadas con 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 es equivalente 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 autorización suficiente (es decir, tiene autorización WhenInUse y está en uso, o siempre tiene autorización). Sin embargo, la aplicación aún estará 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.
Establecer Info.plist como :
La sintaxis para la configuración de Info.plist se ve así:
<key>NSLocationAlwaysUsageDescription</key>
<string>I want to get your location Information in background</string>
<key>UIBackgroundModes</key>
<array>
<string>location</string>
</array>
O abra la pestaña Capacidades del objetivo de su aplicación.
Usar 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)
Here hay un resumen de muchos métodos que se actualizan desde 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.
{
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];
}
}
}