在最新的iOS设备中使用M7芯片,当用户使用CMMotionActivityManager从静止到跑步,走路等时,可以通过编程方式获得通知。当Stava和Runkeeper检测到用户没有通过M7移动时,它们都使用它来auto-pause GPS polling(关闭GPS天线),然后一旦再次移动就重新启用GPS更新。当应用程序处于后台状态时,它可以执行此操作,这是此处的关键。
我在复制此功能时遇到的问题是,如果我在应用程序处于后台时关闭GPS更新,我将停止接收活动更新,并且无法再检测到用户何时再次通过M7转动GPS回来。
如果我让GPS一直运行,我会在应用程序处于后台的整个过程中继续从Core Motion获取移动更新。
我假设他们没有玩白噪声或其他一些便宜的技巧来保持活跃。他们是怎么做到的?
答案 0 :(得分:15)
RunKeeper确实使用音频技巧保持清醒。如果您打开应用程序包并检查其Info.plist,您将看到它注册为背景音频模式。这就是他们如何拉出距离,速度和速度的定期音频通知。这也是他们在跑步过程中保持清醒的同时最大限度地减少电池消耗。
如果您注意到使用RunKeeper时位置服务图标(状态栏中的三角形)完全消失,那么他们肯定没有使用任何类型的位置跟踪来完成后台执行。即使激活地理围栏和重要的位置更改监控,也会导致显示“位置服务”图标。
他们也没有使用M7保持清醒,因为它不起作用。与M7相关的CoreMotion API的更新不会将您的应用程序从睡眠中唤醒。当他们的应用程序确实唤醒时,他们将能够查询动作活动和步骤历史记录,并可能尝试计算某些内容,但我怀疑它会是那么准确。
最后你应该注意到,在iPhone 5s和M7芯片发布之前,iOS 6中引入了自动暂停API。它们是正交概念。
答案 1 :(得分:0)
当你关闭GPS时我注意到,app不会在iOS 7的后台执行任何代码,app看起来像处于非活动状态。移动到后台使用startMonitoringSignificantLocationChanges
时更好,并从您的位置管理器获取更新。意味着simultenoulsy在用户状态更改中使用服务startUpdatingLocation
和在后台使用startMonitoringSignificantLocationChanges
。
因此,当用户打开GPS时,使用startMonitoringSignificantLocationChanges
时您的应用将会收到
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
更好地检查背景本身CoreMotion Framework有什么问题。并尝试重新启动它。 因为没有M7芯片设备,我能够在这种情况下读取加速度计读数。
答案 2 :(得分:0)
您考虑过尝试
吗?application:performFetchWithCompletionHandler:
应用代表中的?你无法控制它的调用频率,但根据应用程序的不同,它可能每隔约15分钟一次。然后,您可以从那里启动CMMotionActivityManager以查询M7结果。
目前还不完全清楚您尝试复制的功能,但M7芯片会记录所有活动,无论您的应用是否正在运行。因此,您只需在后台查询并更新步骤总计或活动类型总计。
答案 3 :(得分:-1)
如果您的位置管理员在活动模式下工作,要启用后台模式,您需要执行以下三个步骤:
答案 4 :(得分:-3)
首先,检查您是否设置了应用的背景行为。
转到目标 - 功能部分,然后检查后台模式以获取位置更新。