在iOS上后台连续更新加速计

在iOS上后台连续更新加速计,ios,accelerometer,core-location,core-motion,Ios,Accelerometer,Core Location,Core Motion,在提出问题之前,我已经对这个主题进行了彻底的研究,但需要确保我得出了正确的结论,如果是这样的话,我希望得到尽可能有效的帮助 对于我的应用程序来说,每隔5秒左右接收一次加速计更新是必不可少的,在某些情况下可能会更快;如果没有这个功能,它就不是一个非常有用的应用程序 那么,如何实现这一目标呢?基本策略是使用以下方法: [cmMotionManager startDeviceMotionUpdatesToQueue:...] 使用适当的设备MotionUpdateInterval,然后以某种方式“

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

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

那么,如何实现这一目标呢?基本策略是使用以下方法:

[cmMotionManager startDeviceMotionUpdatesToQueue:...] 
使用适当的
设备MotionUpdateInterval
,然后以某种方式“确保”您的应用程序不会被挂起,即,您必须实现一种后台模式(例如位置、后台音频、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];
}
我注意到,有时在我按下应用程序上的home(主页)按钮后的一小段时间内,我的应用程序会被挂起——可能是因为Core Location试图获得一个位置修复程序来提供给应用程序

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

请帮忙


谢谢

考虑到这是三年前提出的问题,我将尝试给出适用于2017年的答复。如果您使用Swift,我强烈建议您使用此框架

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

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


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

你找到答案了吗?