iOS用户步数

时间:2016-04-01 09:46:01

标签: ios objective-c accelerometer

我正在使用 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];

}];

3 个答案:

答案 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。 (如果您需要应用程序在旧设备上工作,则必须使用后台处理。)

HealthKit

作为Apple操作系统级别的API,HealthKit始终正常工作(如果用户的设备支持并且用户未对其进行禁用),则会使用Apple的精确,电池效率算法(后者使用)在后台不断跟踪步骤设备的运动协处理器)。

您需要做的就是将您的应用程序与HealthKit集成,以便它可以读取设备的步骤指标。看看this objective-C tutorial