我用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 steps 3 distance 2.130000000004657 floorsAscended (null) floorsDescended (null) currentPace (null) currentCadence (null) averageActivePace 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; ... }]; }
解决方法
我不认为这可以避免,因为这取决于太多的外部因素.
您可以做的是使用逻辑来过滤/排列数据,因为您知道收到的“现在”日期的任何数据实际上将在此之前,因此如果您只对步骤感兴趣或类似的事情,那么只需获得计数.
如果你真的对准确的时间和步骤感兴趣,那么我可以想到3个选择:
1)考虑时间偏移数据被破坏.
2)使用外部源(服务器)而不是设备时间的时间.
3)通过使用内部时钟进行复杂的时间管理:Is there a clock in iOS that can be used that cannot be changed by the user