在 iOS 上在后台持续更新加速度计

Posted

技术标签:

【中文标题】在 iOS 上在后台持续更新加速度计【英文标题】:Continuous accelerometer updates while in the background on iOS 【发布时间】:2014-01-10 20:28:35 【问题描述】:

在提出问题之前我已经彻底研究了这个主题,但需要确保我得出了正确的结论,如果是这样,我希望帮助我尽可能有效地实施这个问题。

我的应用必须每 5 秒左右接收一次加速度计更新,并且在某些情况下可能会更快;如果没有这个功能,它就不是一个非常有用的应用程序。

那么,如何实现呢?基本策略是使用方法:

[cmMotionManager startDeviceMotionUpdatesToQueue:...] 

使用适当的deviceMotionUpdateInterval,然后以某种方式“确保”您的应用程序永远不会被暂停,即。您必须实现其中一种背景模式(例如位置、背景音频、VOIP 等)

这是应用商店中已有的许多应用所使用的策略,例如 Sleep Cycle(“录音”)、Nike+ 和 Pacer(声音播放)。

(如果有其他方法可以持续获取加速度计信息,请纠正我)

我的问题是我的应用不会录制声音,不需要 VOIP 等,也不需要 ios 7 中的任何新的后台获取/远程通知 API。那么如何确保我留下来在后台活跃吗?

好吧,由于我正在设计一个测量运动的应用程序,因此接收位置信息并不遥远。我的问题是如何以最有效的方式实施位置更新,因为我根本不需要这些位置更新,同时确保我的应用永远不会被暂停?

这是我目前在我的应用程序委托中拥有的:

self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.desiredAccuracy = kCLLocationAccuracyKilometer;

- (void)applicationWillResignActive:(UIApplication *)application

    [self.locationManager startUpdatingLocation];


- (void)applicationWillEnterForeground:(UIApplication *)application

    [self.locationManager stopUpdatingLocation];

我注意到,有时在我按下应用上的主页按钮后的短时间内,我的应用会暂停 - 大概是因为 Core Location 尝试获取位置修复以提供给应用。

我也想知道,一旦你被位置更新唤醒,如果没有新的位置更新,你还有多长时间系统会再次暂停你?我是否必须尝试接收持续的位置更新(导航方式)以确保我永远不会被暂停?

请帮忙!

谢谢

【问题讨论】:

iPhone collecting CoreMotion data in the background. (longer than 10 mins) 的可能重复项 你找到答案了吗? 【参考方案1】:

考虑到这是 3 年前提出的问题,我将尝试给出适用于 2017 年的答复。如果您使用 Swift,我强烈建议您使用此框架 https://github.com/MHaroonBaig/MotionKit。

使用 CoreMotion 服务变得非常简单。核心位置服务可能还有另一个友好的包装器。

我发现另一个 SO 问题似乎已经使用您劫持位置服务以在后台保持活跃的方法回答了这个问题。

Run app for more than 10 minutes in background

希望这会有所帮助。我要提醒一句,使用定位服务在后台获取连续的加速度计数据而不实际需要定位服务可能会导致您的应用被应用商店拒绝。导航应用真正使用位置和加速度计数据。简单的答案是添加一个功能,该功能实际上使用该位置来证明在后台获取加速度计数据是合理的。无论如何,祝你好运。

【讨论】:

以上是关于在 iOS 上在后台持续更新加速度计的主要内容,如果未能解决你的问题,请参考以下文章

在后台使用 iOS 设备的加速度计 [重复]

如何在 iOS 后台保存加速度计数据?

从后台服务启动应用程序

如果没有 IOS 中的 VOIP,我如何让我的应用程序永远活着?

当应用程序从后台返回到前台时,CMDeviceMotion 停止更新

使用 CMSensorRecorder 持续收集 Apple Watch 中的加速度计数据