5

Sto implementando un contapassi su iOS. Un requisito importante è che deve funzionare anche se l'app dovesse entrare in modalità background (ad esempio, un dispositivo è bloccato o un utente preme il pulsante home). Puoi vedere tale implementazione nell'App Store come Nike +, Runtastic Pedometer e così via.Strano comportamento dell'accelerometro Core Motion implementato in modalità background

Alcuni post SO confermano che ciò è possibile con Core Motion o, in particolare, CMMotionManager con una proprietà aggiuntiva di Required background modes impostata su location.

ho fatto un test rapido con il codice qui sotto e ha trovato uno strano problema:

// AppDelegate.m 
- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    if(self.motionManager==nil) { 
     self.motionManager=[[CMMotionManager alloc] init]; 
    } 
    self.motionManager.accelerometerUpdateInterval=1/50; 

    if(self.accelerometerReadings==nil) 
     self.accelerometerReadings=[[NSMutableArray alloc] init]; 

    [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.accelerometerReadings addObject:accelerometerData]; 
     }); 
    } 
} 

- (void)applicationWillEnterForeground:(UIApplication *)application 
{ 
    NSLog(@"The number of readings %d",self.accelerometerReadings.count); 

    // do something with accelerometer data... 
} 

ho provato questo codice con un iPhone 4S e iOS 6.1. All'avvio dell'app, premo il pulsante Home e lo scuoto (per simulare la deambulazione) per 5 secondi e apro di nuovo l'app. Queste azioni vengono ripetute un paio di volte. L'output che ho ottenuto è:

2013-02-05 16:41:42.028 [1147:907] readings 0 
2013-02-05 16:41:51.572 [1147:907] readings 444 
2013-02-05 16:42:00.386 [1147:907] readings 1032 
2013-02-05 16:42:08.026 [1147:907] readings 1555 
... 

non ho controllato la correttezza delle letture, ma veloce osservazione rivela già qualche problema. Non ci sono letture (o talvolta solo una lettura) al primo avvio di questa app in modalità background.

Cosa sto facendo di sbagliato qui? E questo è un approccio corretto per implementare un contapassi?

+0

È necessario impostare [accelerometerUpdateInterval] (http://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/Reference/Reference.html#//apple_ref/occ/instp/CMMotionManager/accelerometerUpdateInterval) a '1/50' invece di' deviceMotionUpdateInterval' – Kay

+0

Bella cattura! Sfortunatamente, questo non cambia il risultato. –

+0

ciao, hai trovato una soluzione al tuo problema? – Axarydax

risposta