13

我用 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 楼层上升(空) floorDescended (null) currentPace (null) currentCadence (null) averageActivePace 0>

如您所见,我的客户(我无法重现此错误)从方法startPedometerUpdatesFromDate和 endDate 获得 pedometerData 2017-04-11 20:18:41 大于现在 2017-04-11 20:16:34 (它是 startPedometerUpdatesFromDate 之后的第一个 CMPedometerData从后台返回后启动 -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;
          ...
    }];
}
4

1 回答 1

0

我不认为这是可以避免的,因为它取决于太多的外部因素。

您可以做的是使用逻辑来过滤/排列数据,因为您知道在“现在”日期之前收到的任何数据实际上都是在现在之前,所以如果您只是对这些步骤或类似的东西感兴趣,那么只需计算一下。

如果您实际上对确切的时间和步骤感兴趣,那么我可以想到 3 种选择:

1) 认为时间位移数据已损坏。

2) 使用来自外部源(服务器)的时间而不是设备时间。

3) 使用此处指定的内部时钟进行一些复杂的时间管理:iOS 中是否有时钟可以使用但用户无法更改

于 2017-04-28T03:21:23.627 回答