Ios 核心运动的奇怪行为';s加速度计在后台模式下实现

Ios 核心运动的奇怪行为';s加速度计在后台模式下实现,ios,accelerometer,background-process,core-motion,cmmotionmanager,Ios,Accelerometer,Background Process,Core Motion,Cmmotionmanager,我正在iOS上安装计步器。一个重要的要求是,即使应用程序被置于后台模式(例如,设备被锁定或用户按下home按钮),它也必须工作。你可以在应用商店中看到这样的实现,如Nike+、Runtastic计步器等 一些SO帖子证实,这是通过核心运动实现的,特别是,CMMotionManager,并将所需背景模式的附加属性设置为位置 我使用下面的代码进行了快速测试,发现了一个奇怪的问题: // AppDelegate.m - (void)applicationDidEnterBackground:(UIAp

我正在iOS上安装计步器。一个重要的要求是,即使应用程序被置于后台模式(例如,设备被锁定或用户按下home按钮),它也必须工作。你可以在应用商店中看到这样的实现,如Nike+、Runtastic计步器等

一些SO帖子证实,这是通过核心运动实现的,特别是,
CMMotionManager
,并将
所需背景模式的附加属性设置为
位置

我使用下面的代码进行了快速测试,发现了一个奇怪的问题:

// AppDelegate.m
- (void)applicationDidEnterBackground:(UIApplication *)application
{ 
    if(self.motionManager==nil) {
        self.motionManager=[[CMMotionManager alloc] init];
    }
    self.motionManager.accelerometerUpdateInterval=1/50;

    if(self.accelerometerReadings==nil) 
        self.accelerometerReadings=[[NSMutableArray alloc] init];

    [self.motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAccelerometerData *accelerometerData, NSError *error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.accelerometerReadings addObject:accelerometerData];
        });
    }
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    NSLog(@"The number of readings %d",self.accelerometerReadings.count);

    // do something with accelerometer data...
}
我在iPhone4S和iOS 6.1上试过这段代码。当应用程序启动时,我按下home按钮并摇动它(模拟行走)5秒钟,然后再次打开应用程序。这些动作会重复几次。我得到的结果是:

2013-02-05 16:41:42.028 [1147:907] readings 0
2013-02-05 16:41:51.572 [1147:907] readings 444
2013-02-05 16:42:00.386 [1147:907] readings 1032
2013-02-05 16:42:08.026 [1147:907] readings 1555
...
我没有检查读数的正确性,但快速观察已经发现了一些问题。第一次在后台模式下运行此应用时没有读数(有时只有一个读数)


我做错了什么?这是实现计步器的正确方法吗?

在iPhone5s中嵌入M7芯片,苹果的内置类CMStepCounter可能是最好的方法


您应该设置为
1/50
,而不是
deviceMotionUpdateInterval
Nice catch!不幸的是,这并没有改变结果。嗨,你找到问题的解决方案了吗?@Axarydax没有解决的希望。我将在iOS7上再做一次尝试,它将为运行后台任务提供更强大的支持。在iOS7上运气好吗?我在尝试在后台使用accel数据时也遇到了同样的问题。