在提出问题之前,我已经彻底研究了这个主题,但需要确保我得出了正确的结论,如果是这样,我希望帮助尽可能有效地实现这一点。
对于我的应用程序来说,每隔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试图获得位置修复以交付给应用程序。
我还想知道,一旦你被位置更新唤醒,如果新的位置更新没有到达,你还有多长时间系统会再次挂起你?我是否必须尝试并接收持续的位置更新(导航风格),以确保我从未被暂停?
请帮忙!
感谢
考虑到这是3年前提出的问题,我将尝试给出适用于2017年的答复。如果你正在使用Swift,我强烈建议你使用这个框架https://github.com/MHaroonBaig/MotionKit.
这使得使用CoreMotion服务变得非常琐碎。核心定位服务可能还有另一个友好的包装器。
我发现了另一个SO问题,它似乎已经通过你劫持定位服务的方法在后台保持活跃来回答了这个问题。
在后台中运行应用程序超过10分钟
希望这能有所帮助。我只想提醒一下,使用定位服务在后台获取连续的加速度计数据,而实际上不需要定位服务,可能会导致你的应用程序被应用商店拒绝。导航应用程序真正同时使用位置和加速度计数据。简单的答案是添加一个功能,该功能实际使用位置来证明在后台获取加速度计数据的合理性。不管怎样,祝你好运。