当应用程序在后台运行/设备处于睡眠模式时,我需要加速器更新。一些应用程序这样做,我无法使其工作。 为此我在appdelegate和applicationDidEnterBackground中有一个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);
}
);
}
];
}
在app plist中,我将所需的后台模式放到App寄存器中以进行位置更新。当我将设备置于睡眠模式或后台时,日志中不会显示任何更新。当应用程序处于活动状态时,coremotion会启动loggin。有人给我一个暗示吗?谢谢。
答案 0 :(得分: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
}
参考:using the same dispatch queue in a method for background processing