私はiOSで歩数計を実装しています。重要な要件は、アプリケーションがバックグラウンドモード(例えば、デバイスがロックされている、またはユーザーがホームボタンを押しているなど)にする場合でも機能する必要があることです。あなたはNike +、Runtastic歩数計などApp Storeでそのような実装を見ることができます。バックグラウンドモードで実装されたCore Motionの加速度計の奇妙な動作
これは、コアモーション、具体的にはCMMotionManager
で可能であり、Required background modes
という追加のプロパティが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
...
私は測定値の正確さをチェックしませんでしたが、迅速な観察は、すでにいくつかの問題を明らかに:私が得た出力です。このアプリがバックグラウンドモードで初めて実行されたときには、何も読んでいない(または時には読書が1つしかない)。
私はここで間違っていますか?これは歩数計を実装するための正しいアプローチですか?
あなたは[accelerometerUpdateInterval](http://developer.apple.com/library/ios/documentation/CoreMotion/Reference/CMMotionManager_Class/Reference/Reference.html#//apple_ref/occ/instpを設定する必要があります/ CMMotionManager/accelerometerUpdateInterval)を 'deviceMotionUpdateInterval'の代わりに '1/50'に変更しました – Kay
ニースキャッチ!残念ながら、これは結果を変えるものではありません。 –
こんにちは、あなたの問題の解決策を見つけましたか? – Axarydax