Неправильная дата окончания в CMPedometerData
Я разрабатываю приложение с CMPedometer и у меня есть одна странная проблема. У меня есть логи от моего клиента, и я смотрю эти CMPedometerData, которые я считаю действительно неправильными, и я не могу понять, почему это так
[2017-04-11 20:16:34 +0000] CMPedometerData, startDate 2017-04-11 20:16:32 +0000 endDate 2017-04-11 20:18:41 +0000 шаг 3 расстояние 2.130000000004657 этажейВосходящий (ноль) floorsDescended (null) currentPace (null) currentCadence (null) averageActivePace 0>
Как вы можете видеть мой клиент (я не могу воспроизвести эту ошибку) получил pedometerData от метода startPedometerUpdatesFromDate
and endDate 2017-04-11 20:18:41 больше, чем сейчас 2017-04-11 20:16:34 (это был первый CMPedometerData после startPedometerUpdatesFromDate, который был запущен после возврата из фона - willEnterForeground
метод). Может быть, кто-то уже сталкивался с подобной проблемой?
Часть моего кода:
- (void)didEnterBackground {
dispatch_async(dispatch_get_main_queue(), ^{
[[Pedometer sharedInstance].motionActivityManager stopActivityUpdates];
[[Pedometer sharedInstance].pedometer stopPedometerUpdates];
});
}
- (void)willEnterForeground {
NSDate *nowDate = [NSDate new];
/* here is request to get historical data from lastDateUpdate (store in database) to now date */
[[Pedometer sharedInstance] importDataFrom:lastDateUpdate endDate:nowDate completion:^{
dispatch_async(dispatch_get_main_queue(), ^{
/* show info */
});
}];
dispatch_async(dispatch_get_main_queue(), ^{
[self startUpdatingData:nowDate];
});
lastDateUpdate = nowDate;
}
- (void)startUpdatingData:(NSDate *)fromDate {
NSOperationQueue *activityQueue = [[NSOperationQueue alloc] init];
[[Pedometer sharedInstance].motionActivityManager startActivityUpdatesToQueue:activityQueue withHandler:^(CMMotionActivity * _Nullable act) {
...
}];
[[Pedometer sharedInstance].pedometer startPedometerUpdatesFromDate:fromDate withHandler:^(CMPedometerData * _Nullable pedometerData1, NSError * _Nullable error) {
...
NSLog(@"%@", pedometerData1);
...
lastDateUpdate = pedometerData1.endDate;
...
}];
}
1 ответ
Я не думаю, что этого можно избежать, так как это зависит от слишком многих внешних факторов.
Что вы могли бы сделать, это использовать логику для фильтрации / упорядочения данных, поскольку вы знаете, что любые данные, полученные с более новой датой "сейчас", фактически будут раньше, поэтому, если вас просто интересуют шаги или что-то подобное, просто получите счетчик.
если вы на самом деле заинтересованы в точном времени и шагах, то я могу подумать о 3 альтернативах:
1) считать данные смещенными во времени поврежденными.
2) Используйте время из внешнего источника (сервера) вместо времени устройства.
3) Выполните сложное управление временем, используя внутренние часы, как указано здесь: есть ли в iOS часы, которые можно использовать, которые пользователь не может изменить