2012-01-03 5 views
33

La nuova applicazione Nike + GPS per iOS 5 è in grado di elaborare gli eventi dell'accelerometro in background (consentendo il tracciamento di tapis roulant al coperto). Com'è possibile? Quando metto la mia applicazione in background, cessa di ricevere eventi. Io uso l'API UIAccelerometer standard.In che modo Nike + GPS su iPhone riceve gli aggiornamenti dell'accelerometro in background?

+0

prega, chiunque altro può confermare? Sembra fantastico per Apple – AlexeyVMP

+3

Posso confermare che funziona! L'unica cosa che devi soddisfare è utilizzare qualsiasi modalità in background per far funzionare l'app in background (aggiornamenti di posizione, riproduzione, VoIP o centrale BT4). – AlexeyVMP

+2

Ciao ragazzi, grazie per il vostro lavoro finora! Ho provato il tuo approccio per un'app pedometro. Funziona quasi per me. Io uso la modalità di background in background e aggiorno la posizione dell'utente ogni 9 minuti per evitare che l'app diventi inattiva - questo meccanismo funziona ma la coda di aggiornamento non contiene dati dopo i primi 9 minuti. Hai idea di cosa possa andare storto o forse potresti fornire un suggerimento/soluzione un po 'più dettagliato al mio problema? Grazie ancora! Hannes – Hannes

risposta

12

Per il bene di dare una risposta a questa domanda, anche se è già auto risposto ...

"Se si usa il più recente core Movimento API, è possibile ricevere aggiornamenti in background."

Ecco un esempio:

- (void)startAccelerationCollection { 
    [self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init] 
              withHandler:^(CMAccelerometerData *data, NSError *error) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      [self.accelerometerReadings addObject:data]; 
     }); 
    }]; 
} 
+4

Questo non funziona dopo aver premuto il tasto home. Come possiamo aggiustarlo? – Sumoanand

+0

@ Sumoanand - Sì. Questo non funziona quando l'app viene sospesa (quando l'utente preme il pulsante HOME o cambia app, ecc.) – kamyFC

+0

qualsiasi aggiornamento su questo? – Nil

0

Quando il blocco con aggiornamento pedometro, chiamo il metodo di spegnere e accendere il GPS. Per me ha risolto il problema quando l'utente premeva a casa e restava per un'ora ad ascoltare musica su spotify.

Non dimenticare di abilitare Impostazioni progetto -> -> Funzionalità modalità Background -> Aggiornamenti di localizzazione

import CoreLocation 
    import CoreMotion 


    //turn Off and turn On GPS 
    private func apelacaoRenovarGPSLigado() { 

    LocationManager.sharedInstance.stopUpdatingLocation() 
    let locationManager = LocationManager.sharedInstance 
    locationManager.autoUpdate = true 
    locationManager.startUpdatingLocationWithCompletionHandler { (location, status, verboseMessage, error) ->() in 

    } 
} 

private func startPedometer() 
{ 
    if CMPedometer.isDistanceAvailable() 
    { 
     if self.pedometer == nil 
     { 
      self.pedometer = CMPedometer() 
     } 

     self.pedometer!.startPedometerUpdatesFromDate(NSDate()) { (data, error) in 

      dispatch_async(dispatch_get_main_queue(), { 

       print("DISTANCIA PARCIAL \(data!.distance!)") 

       print("DIFERENCA \(data!.distance!.doubleValue - (self.totalDistance + self.subtotalDistance))") 
       self.delegate!.trackerDistanceDidChanged((data!.distance!.doubleValue - (self.totalDistance + self.subtotalDistance))/1000.0) 
       self.subtotalDistance = data!.distance!.doubleValue 

       self.apelacaoRenovarGPSLigado() 

      }) 

     } 
    } 
    else 
    { 
     self.delegate!.trackerDeviceNotSupported() 
    } 
}