【iPhone】加速度センサーのバックグランド動作(1)の続きです。
加速度センサーの読み取りは、UIAccelerometerではなく、iOS 5から使えるようになったCoreMotionを使います。(iOS 5以降ではUIAccelerometerよりもこちらを使うことが推奨されています)
CMMotionManager *manager = [[CMMotionManager alloc] init]; manager.accelerometerUpdateInterval = 0.1; if(manager.accelerometerAvailable) { CMAccelerometerHandler handler = ^(CMAccelerometerData *data,NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ double xx = data.acceleration.x; double yy = data.acceleration.y; double zz = data.acceleration.z; }; [manager startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:handler]; }
UIAccelerometerを使う時には、加速度に変化が起こった時のdelegateを指定する必要がありましたが、CMMotionManagerの場合は、handlerをBlocks構文で記述します。Blocks構文は、JavaScriptで言う無名関数のことで、これを使うとソースの記述が分かりやすくなります。仕込むところとイベント毎に呼び出されるところが一緒に書けるので、delegateよりもシンプルになりますね。
そして、同時にLocationManagerのバックグラウンド動作を仕込みます。
-(void)startLocationMonitoring { if(locationManager == nil) { locationManager = [[CLLocationManager alloc] init]; } locationManager.delegate = self; locationManager.desiredAccuracy = kCLLocationAccuracyBest; locationManager.distanceFilter = 500.0f; [locationManager startUpdatingLocation]; } -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation { NSLog(@"%@",newLocation.timestamp); }
バックグラウンド動作が前提なので、バッテリーになるべく負荷を与えないような設定にすることが必要ですが、どのようなアプリにするかで精度も変わってきますので、上記の数字はお好みで。。
そして、バックグラウンドでの動作を許可してもらうには、Info.plistの編集が必要です。
これを忘れるとバックグラウンドでは動かないのでご注意ください。
この状態でアプリを動かすと、LocationだけではなくCoreMotionの値もちゃんとバックグラウンドで取得できるようになります。