CoreMotion在后台状态下更新

使用最新iOS设备中的M7芯片,用户可以通过程序通知用户使用CMMotionActivityManager从静止到跑步,走路等。 Stava和Runkeeper都使用它来自动暂停GPS轮询 (closuresGPS天线),当它检测到用户没有通过M7移动,然后重新启用GPS更新,一旦他们再次移动。 这是应用程序处于后台状态,这是关键。

我在复制此function时遇到的问题是,如果我在后台停止接收活动更新时closures了GPS更新,并且无法再检测用户何时再次通过M7重新打开GPS。

如果我一直离开GPS运行,那么在整个应用程序处于后台时,我将继续从Core Motion获取移动更新。

我假设他们不玩白噪音或其他一些廉价的技巧来保持活跃。 他们是怎么做的呢?

RunKeeper实际上使用audio技巧来保持清醒。 如果您打开应用程序包并检查其Info.plist,您将看到它注册为背景audio模式。 这是他们如何取消你的距离,速度和节奏的定期audio通知。 这也是他们如何保持清醒,同时尽量减less电池消耗。

如果您注意到使用RunKeeper时位置服务图标(状态栏中的三angular形)完全消失,那么它们肯定不会使用任何types的位置跟踪来完成后台执行。 即使激活地理围栏和重要的位置更改监控也会导致定位服务图标出现。

他们也没有使用M7保持清醒,因为它不这样工作。 来自M7相关CoreMotion API的更新不会将您的应用从睡眠中唤醒。 当他们的应用程序醒来,他们将能够查询运动活动和步骤的历史,也许尝试计算一些东西,但我怀疑这将是所有的准确。

最后需要注意的是,自动暂停API是在iPhone 5s和M7芯片发布之前在iOS 6中引入的。 他们是正交的概念。

我注意到当你closuresGPS时,应用程序不会在iOS 7的后台执行任何代码,应用程序看起来像处于非活动状态。 所以移到后台使用startMonitoringSignificantLocationChanges更好,并从您的位置pipe理器获取更新。 意味着simultenoulsy在用户状态改变时使用服务startUpdatingLocation ,在后台使用startMonitoringSignificantLocationChanges

所以,当用户打开GPS,而您使用startMonitoringSignificantLocationChanges您的应用程序将收到

 - (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 

在这里更好地检查一下后台本身CoreMotion Framework有什么问题。 并尝试重新启动它。 因为没有M7芯片设备,我可以在这种情况下读取加速计读数。

你有没有考虑过试验

 application:performFetchWithCompletionHandler: 

在应用程序委托? 你不能控制被调用的频率,但取决于应用程序,它可以是每15分钟。 然后可以从那里启动CMMotionActivityManager以查询M7结果。

目前还不清楚你想要复制哪些function,但M7芯片logging了所有的活动,无论你的应用是否在运行。 所以你可以简单地在后台查询和更新总计或活动types总计。

如果您的位置pipe理器在主动模式下工作,要启用后台模式,您需要执行以下三个步骤:

  1. 检查是否启用了[目标/function/背景模式/位置更新]。
  2. [locationManager requestAlwaysAuthorization];
  3. locationManager.allowsBackgroundLocationUpdates = YES;

首先,检查你是否设置了你的应用程序的背景行为。

转到目标 – function部分,并检查后台模式的位置更新。

XCode功能