我正在使用 Objective-C 开发iPhone应用程序,其中我使用 CMAccelerometerData 计算用户的步数。
当app在后台运行时,它可以正常工作
但是当我杀死我的应用程序时(双击“主页”按钮,然后轻扫应用程序),我就无法计算步数。
应用程序的功能是,如果我的应用程序处于终止状态(双击“主页”按钮,然后轻扫应用程序),则获取步骤计数,然后从图标运行它。
如果我们的应用程序被杀死(双击“主页”按钮然后轻扫应用程序),有没有办法让步骤计数?
以下是获取步骤的方法
- (void)startDetectionWithUpdateBlock:(void (^)(NSError *))callback
{
if (self.motionManager.isAccelerometerActive) {
return;
}
[self.motionManager startAccelerometerUpdatesToQueue:self.queue withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
if (error) {
if (callback) {
dispatch_async(dispatch_get_main_queue(), ^{
callback (error);
});
}
return ;
}
CMAcceleration acceleration = accelerometerData.acceleration;
CGFloat strength = 1.2f;
BOOL isStep = NO;
if (fabs(acceleration.x) > strength || fabs(acceleration.y) > strength || fabs(acceleration.z) > strength) {
isStep = YES;
}
if (isStep) {
if (callback) {
dispatch_async(dispatch_get_main_queue(), ^{
callback (nil);
});
}
}
}];
}
通过这种方式我更新步骤:
[[SOLocationManager sharedInstance] start];
[[SOStepDetector sharedInstance] startDetectionWithUpdateBlock:^(NSError *error) {
if (error) {
NSLog(@"%@", error.localizedDescription);
return;
}
self.actualCheckpoint.stepsCount ++;
NSLog(@"Total Steps: %ld",(long)self.actualCheckpoint.stepsCount);
[[NSNotificationCenter defaultCenter] postNotificationName:SBCompetitionStepsCountDidChange object:self.actualCheckpoint];
}];
答案 0 :(得分:0)
您可以在appDelegate&#39>中捕获数据
- (void)applicationWillTerminate:(UIApplication *)application {}
答案 1 :(得分:0)
根据Apple的说法,当设备被锁定时,您无法在后台访问HealthKit数据:
为了安全起见,当设备被锁定时,HealthKit商店会被加密。 HealthKit商店只能由授权的应用程序访问。因此,当您的应用在后台启动时,您可能无法从商店中读取数据;但是,即使手机被锁定,应用仍然可以将数据写入商店。只要手机解锁,HealthKit就会暂时缓存数据并将其保存到加密存储中。
https://developer.apple.com/library/ios/documentation/HealthKit/Reference/HealthKit_Framework/
您需要在启动时读取数据,以便在上次运行应用时“赶上”。
答案 2 :(得分:0)
如果用户通过向上滑动杀死应用程序,而不是简单地将应用程序放入后台,则不再允许执行任何代码,直到用户再次打开它为止。但是,如果应用程序被完全杀死,则无法直接访问加速度计。
如果应用程序进入后台(不是由用户手动杀死),有多种方法可以无限期地保持应用程序的打开状态。然而,让加速度计不断上电将是一个重要的电池消耗,如果你只想跟踪步骤,你可以简单地使用HealthKit API。 (如果您需要应用程序在旧设备上工作,则必须使用后台处理。)
作为Apple操作系统级别的API,HealthKit始终正常工作(如果用户的设备支持并且用户未对其进行禁用),则会使用Apple的精确,电池效率算法(后者使用)在后台不断跟踪步骤设备的运动协处理器)。
您需要做的就是将您的应用程序与HealthKit集成,以便它可以读取设备的步骤指标。看看this objective-C tutorial。