2013-05-20 55 views
5

當應用程序在後臺運行時/設備處於睡眠模式時,我需要加速器更新。有些應用程序這樣做,我無法使其工作。 爲此,我有一個CoreMotion財產在我的appdelegate和applicationDidEnterBackground我打電話iOS Coremotion加速器在後臺/睡眠模式下更新

-(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開始登錄時。任何人都有對我的暗示?謝謝。

回答

0

這是因爲你將它分派給主隊列。要啓用後臺活動,你應該把它分發到全球的隊列:

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

UPDATE添加斯威夫特版本:

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

參考:using the same dispatch queue in a method for background processing

+0

謝謝你,但與派遣全局隊列也不起作用。 – simon

+2

此外,在您的應用程序的plist中,是否使用'必需的背景模式' - >並在'項目0'選擇了「應用程序寄存器以更新位置」? – Raptor

+0

是的,我做到了。位置更新正在後臺/睡眠模式下工作。 – simon

相關問題