iOS Coremotion加速器在后台/睡眠模式下更新

sim*_*mon 5 objective-c accelerometer ios core-motion

当应用程序在后台运行/设备处于睡眠模式时,我需要加速器更新.一些应用程序这样做,我无法使其工作.为此,我在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);
         }
         );
         }
    ];
}
Run Code Online (Sandbox Code Playgroud)

在app plist中,我将所需的后台模式放到App寄存器中以进行位置更新.当我将设备置于睡眠模式或后台时,日志中不会显示任何更新.当应用程序处于活动状态时,coremotion会启动loggin.有人给我一个暗示吗?谢谢.

Rap*_*tor 0

这是因为您将其分派到主队列。要启用后台活动,您应该将其分派到全局队列:

dispatch_queue_t lowQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
dispatch_async(lowQueue, ^{ ...
Run Code Online (Sandbox Code Playgroud)

更新添加 Swift 版本:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0)) {
    // do some task
}
Run Code Online (Sandbox Code Playgroud)

参考:在后台处理的方法中使用相同的调度队列

  • 此外,在您的应用程序的 plist 中,您是否使用了“所需的后台模式”-> 并在“项目 0”处选择“应用程序寄存器进行位置更新”? (2认同)