5

アプリがバックグラウンドで実行されているとき、またはデバイスがスリープ モードになっているときに、アクセラレータの更新が必要です。一部のアプリはこれを行いますが、動作させることができませんでした。このために、appdelegate に CoreMotion プロパティがあり、applicationDidEnterBackground に呼び出します

-(void) startAccelerationUpdates
{

    self.motionManager.deviceMotionUpdateInterval = 0.01;
    [self.motionManager startDeviceMotionUpdatesToQueue:[NSOperationQueue mainQueue]
                                       withHandler:^(CMDeviceMotion *motion, NSError *error){
         dispatch_async(dispatch_get_main_queue(), ^{
         NSLog(@"acceleration x %f", motion.userAcceleration.x);
         NSLog(@"acceleration y %f", motion.userAcceleration.y);
         NSLog(@"acceleration z %f", motion.userAcceleration.z);
         }
         );
         }
    ];
}

アプリの plist で、必要なバックグラウンド モードを、位置情報の更新のためにアプリ レジスタに配置しました。デバイスをスリープ モードまたはバックグラウンドにすると、ログに更新が表示されません。アプリがアクティブになると、coremotion がログインを開始します。ヒントをくれた人はいますか?ありがとうございました。

4

1 に答える 1

0

これは、メイン キューにディスパッチするためです。バックグラウンド アクティビティを有効にするには、グローバル キューにディスパッチする必要があります。

dispatch_queue_t lowQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_async(lowQueue, ^{ ...

更新Swift バージョンを追加します。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)) {
    // do some task
}

参考:バックグラウンド処理のメソッドで同じディスパッチキューを使う

于 2013-05-20T10:40:13.400 に答える