5

我正在 iOS 上实现计步器。一个重要的要求是,即使应用程序进入后台模式(例如,设备被锁定或用户按下主页按钮),它也必须工作。您可以在 App Store 中看到这样的实现,例如 Nike+、Runtastic Pedometer 等。

一些 SO 帖子证实,这可以通过 Core Motion 实现,或者特别是CMMotionManager通过附加属性Required background modesset to location

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

// 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...
}

我在 iPhone 4S 和 iOS 6.1 上尝试了这段代码。当应用程序启动时,我按下主页按钮并摇动它(模拟步行)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
...

我没有检查读数的正确性,但快速观察已经发现了一些问题。此应用程序第一次在后台模式下运行时没有读数(或有时只有一个读数)。

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

4

1 回答 1

1

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

https://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMStepCounter_class/Reference/Reference.html#//apple_ref/doc/uid/TP40013504

于 2014-02-04T16:46:24.027 回答