2016-10-30 3 views
0

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?

+0

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

Répondre

0

À partir d'iOS 9, un nouvel appel est requis pour activer le traitement en arrière-plan des événements de localisation. Il peut être utilisé pour activer et désactiver le traitement en arrière-plan, mais par défaut, il doit être défini manuellement pour restaurer le traitement en arrière-plan dans iOS 8 et le code antérieur.

Ajoutez cette ligne lors de la configuration du gestionnaire d'emplacement pour permettre le traitement de fond:

locationManager.allowsBackgroundLocationUpdates = YES;