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

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开始记录日志。有人能给我一些提示吗?谢谢。
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
}

参考资料:在一个方法中使用相同的调度队列进行后台处理


谢谢,但是使用分派到全局队列也不起作用。 - simon
2
另外,在您的应用程序的 plist 中,您是否使用了 Required background modes -> 并在 item 0 中选择了 App registers for location updates - Raptor
是的,我做到了。位置更新在后台/睡眠模式下正常工作。 - simon
@simon 你是如何确定样本没有被记录的?在这种情况下不要相信 NSLog 或类似的东西 - 尝试记录每个样本的时间戳,你会发现它是连续的。 - Stavash
在 Swift 中会是什么样子? - smeshko
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接