Новое приложение Nike + GPS для iOS 5 может обрабатывать события акселерометра в фоновом режиме (таким образом, для отслеживания дорожного движения в помещении). Как это возможно? Когда я помещаю свое приложение в фоновом режиме, он прекращает принимать события. Я использую стандартный API UIAccelerometer.
Как Nike + GPS на iPhone получает обновления акселерометра в фоновом режиме?
Ответ 1
Чтобы дать ответ на этот вопрос, даже если он уже сам ответил...
"Если вы используете новый API Core Motion, вы можете получать обновления в фоновом режиме".
Вот пример:
- (void)startAccelerationCollection {
[self.motionManager startAccelerometerUpdatesToQueue:[[NSOperationQueue alloc] init]
withHandler:^(CMAccelerometerData *data, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
[self.accelerometerReadings addObject:data];
});
}];
}
Ответ 2
Когда блок с обновлением шагомера, я вызываю метод, чтобы выключить и включить GPS. Для меня это устранило проблему, когда пользователь нажимал на дом и оставался на один час прослушивания музыки на месте.
Не забудьте включить Настройки проекта → Возможности → Фоновые режимы → Обновления местоположения
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()
}
}