J'ai une application de fitness qui reçoit des mises à jour de localisation et qui fonctionne bien en arrière-plan depuis iOS 4. Je viens de remarquer que les mises à jour de localisation s'arrêtent maintenant lorsque l'application passe en arrière-plan (en changeant d'application ou en verrouillant l'appareil) dans iOS 10. Je n'ai pas trouvé d'avis de modification des fonctionnalités ou des privilèges en arrière-plan ; quelqu'un sait-il ce qui se passe ?
Ma configuration est assez basique :
if (!self.locationManager) {
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.distanceFilter = kCLDistanceFilterNone;
self.locationManager.activityType = CLActivityTypeFitness;
self.locationManager.pausesLocationUpdatesAutomatically = TRUE;
}
// request permissions on iOS 8+
if ([self.locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) {
[self.locationManager requestWhenInUseAuthorization];
}
Ce rappel reçoit ensuite les mises à jour :
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
DLog(@"didUpdateToLocation");
}
Tout se passe bien lorsque l'application est au premier plan. Dès qu'elle passe en arrière-plan, ce message apparaît dans la console :
/BuildRoot/Library/Caches/com.apple.xbs/Sources/ExternalAccessory/ExternalAccessory-353.22.1/EAAccessoryManager.m:__52-[EAAccessoryManager _checkForConnectedAccessories:]_block_invoke-785 ending background task
Puis les mises à jour s'arrêtent. Lorsque je ramène l'application au premier plan, elles reprennent.
Je n'utilise pas directement EAAccessoryManager
et je ne peux que deviner de quoi il s'agit. J'utilise le BluetoothLE
pour recevoir les données des moniteurs de fréquence cardiaque, mais lorsque je désactive cette fonctionnalité (en arrêtant d'instancier un BluetoothLE
), le problème reste entier.
Mes UIBackgroundModes sont réglés sur location
, external-accessory
y bluetooth-central
parce que j'ai aussi la connectivité de la montre Pebble. J'ai essayé d'ajouter bluetooth-peripheral
mais cela n'a pas aidé. J'ai également NSLocationWhenInUseUsageDescription
y NSBluetoothPeripheralUsageDescription
et ceux-ci fonctionnent.