ios - 后台设备运动更新

标签 ios swift device background-process core-motion

我正在尝试使用 CMMotionManager 在后台获取 iPhone 或 iPad 上的设备运动更新。我已经查看了关于该主题的所有以前的帖子,并认为我有可用的代码。我的应用程序还使用背景音频,这在前台和后台都能正常工作。在 Info.plist 中,我启用了背景音频和背景位置更新。

出于测试目的,我在 AppDelegate 中声明了 "varmotionManager = CMMotionManager()",并在 didFinishLaunchingWithOptions 中包含以下代码:

    motionManager.deviceMotionUpdateInterval = 0.10
    let queue = NSOperationQueue()
    motionManager.startDeviceMotionUpdatesToQueue(queue, withHandler: {
        data, error in

        let accelerationVector = sqrt(pow(data!.userAcceleration.x, 2) + pow(data!.userAcceleration.y, 2) + pow(data!.userAcceleration.z, 2))
        print("\(accelerationVector)")
    })

当我在设备上运行该应用程序时,代码按预期在前台执行,但当我按下主页按钮时,在停止之前我会再获得大约 10 个读数。当我点击应用程序图标时,读数又开始了。我还在处理程序中的代码上放置了断点,并得到了类似的结果。

我错过了什么?

最佳答案

不要信任NSLog或其他类似的日志输出

我曾经遇到过这个问题。我想在后台收集运动数据,我为此做了一个演示。我发现当我的应用程序处于事件状态时,我可以获取所有数据并进行日志记录,但是当应用程序处于后台时,xCode 日志控制台不会输出任何内容。

我曾经认为问题是CoreMotion数据只能在前台收集,但我错了。当应用程序进入后台时,所有回调仍然有效,只是 NSLog 停止告诉我数据

如果您不相信,只需将所有数据收集到 NSMutableArray 或其他集合中,然后检查应用程序在后台收集的数据。 例如

@property (nonatomic, strong) NSMutableArray *arrAltimeters;

...

[self.altimeter startRelativeAltitudeUpdatesToQueue:self.operationQueue withHandler:^(CMAltitudeData * _Nullable altitudeData, NSError * _Nullable error) {
            [self.arrAltimeters addObject:altitudeData];
            NSLog(@"Altimate data count = %ld", self.arrAltimeters.count);
}];

关于ios - 后台设备运动更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38423398/

相关文章:

iphone - 如何将需要 iOS4 的静态库添加到部署目标设置为 3.0 的项目中?

iOS:应用程序在一段时间后无法运行(Xcode 8 的并行安装)

swift - 使用 swift 3 将 PFFile 转换为 UIImage?

android - 如何知道手机或系统连接到我的 android 调制解调器?

c++ - 当我以编程方式删除驱动程序 com 端口时,它被删除了。但是在com口重装驱动后,com口号变大了?

iOS如何在每个区域(任何位置和任何缩放)计算尺寸宽度到米

ios - 如何更改以编程方式创建的一组 UIButton 的标题颜色?

ios - 在 UICollectionViewFlowLayout 的子类上更改 scrollDirection

android - Android 上未创建 USB 摄像头节点

iOS Accelerate 低通 FFT 滤波器镜像结果