Mon application collecte des informations sur l'emplacement et l'accéléromètre, et continue de le faire en arrière-plan si l'utilisateur le demande. L'information de l'accéléromètre est recueillie à environ 100 Hz, et il est essentiel qu'elle soit recueillie à un débit élevé. L'application a bien fonctionné sous les anciennes versions d'iOS, mais échoue sous iOS 10. Je suis à la recherche d'un moyen de continuer à collecter des informations sur l'accéléromètre en arrière-plan.Mise à jour de l'emplacement et de l'accéléromètre en arrière-plan sous iOS 10
La méthode utilisée est similaire à celle de Receive accelerometer updates in background using CoreMotion framework. Je commence le manager emplacement:
latitude = 0.0;
longitude = 0.0;
altitude = 0.0;
horizontalAccuracy = -1.0;
verticalAccuracy = -1.0;
if (locationManager == nil && [CLLocationManager locationServicesEnabled]) {
self.locationManager = [[CLLocationManager alloc] init];
CLAuthorizationStatus status = [CLLocationManager authorizationStatus];
if (status == kCLAuthorizationStatusNotDetermined) {
[locationManager requestWhenInUseAuthorization];
}
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
locationManager.pausesLocationUpdatesAutomatically = NO;
[locationManager startUpdatingLocation];
}
je mets en œuvre LocationManager: didUpdateLocations:
- (void) locationManager: (CLLocationManager *) manager didUpdateLocations: (NSArray *) locations {
printf("locationManager:didUpdateLocations:\n");
CLLocation *location = locations.lastObject;
latitude = location.coordinate.latitude;
longitude = location.coordinate.longitude;
altitude = location.altitude;
horizontalAccuracy = location.horizontalAccuracy;
verticalAccuracy = location.verticalAccuracy;
}
Je commence le gestionnaire de mouvement:
motionManager = [[CMMotionManager alloc] init];
motionManager.accelerometerUpdateInterval = 1.f/trialFrequency;
[[NSOperationQueue mainQueue] setMaxConcurrentOperationCount: 10];
[motionManager startAccelerometerUpdatesToQueue: [NSOperationQueue mainQueue]
withHandler: ^(CMAccelerometerData *accelerometerData, NSError *error) {
// Flag any error.
if (error) {
NSLog(@"error getting accelerometer update: %@", error);
}
<<<process data>>>
}
];
CIBLES, capacités, modes d'arrière-plan, les mises à jour de l'emplacement est cochée . Sous iOS 9 et les versions précédentes, les informations de mouvement sont enregistrées à une fréquence d'environ 100 Hz sans problème, mais sous iOS 10, les informations de mouvement s'arrêtent dès que l'application entre en arrière-plan.
Y a-t-il un moyen de continuer les informations de mouvement en arrière-plan sous iOS 10?
je suggère le dépôt d'un rapport de bogue avec Apple. iOS 10 apporte quelques changements étranges en ce qui concerne l'utilisation en arrière-plan des capteurs et cela pourrait être l'un d'entre eux. Et dans tous les cas, si cela fonctionnait avant, vous avez un cas d'utilisation justifiable. – matt