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?
33
A
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];
});
}];
}
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()
}
}
prega, chiunque altro può confermare? Sembra fantastico per Apple – AlexeyVMP
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
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