Подтвердить что ты не робот

Неправильное значение endDate в 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 этажейОткрыть (null) этажейDescended (null) текущийPace (null) текущийCadence (null) среднийActivePace 0 >

Как вы можете видеть мой клиент (я не могу воспроизвести эту ошибку) получил pedometerData из метода startPedometerUpdatesFromDate и 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;
          ...
    }];
}
4b9b3361

Ответ 1

Я не думаю, что этого можно избежать, поскольку это зависит от слишком большого количества внешних факторов.

Что вы можете сделать, так это использовать логику для фильтрации/упорядочивания данных, как вы знаете, что любые данные, полученные более новыми для "сейчас", будут на самом деле раньше, поэтому, если вас просто интересуют шаги или что-то подобное, счет.

если вы действительно заинтересованы в точном времени и шагах, я могу думать о 3 альтернативах:

1) считают поврежденные во времени данные поврежденными.

2) Используйте время от внешнего источника (сервера) вместо времени устройства.

3) Сделайте некоторое сложное управление временем, используя внутренние часы, как указано здесь: Есть ли часы в iOS, которые могут использоваться, которые не могут быть изменены пользователем