随着最新的iOS设备可以得到通知程序在用户的M7芯片从静止去跑步,散步等使用CMMotionActivityManager。 Stava的和Runkeeper双双用它来自动暂停GPS轮询 (关闭GPS天线),当它检测到用户不通过M7移动,然后一旦他们又动重新启用GPS的更新。 这是能够做到这一点,而应用程序是在后台状态,这是这里的关键。
我碰上,而复制此功能的问题是,如果我关掉GPS更新,而我的应用程序在后台我停止接收活动更新,当用户通过M7再次移动到打开GPS回不能再检测。
如果我离开的GPS运行的整个过程中我将继续为核心运动得到更新运动的整个时间的应用程序是在后台。
我假设他们不打白噪声或其他一些把戏保持活跃。 他们是怎么去呢?
RunKeeper实际上并使用音频伎俩保持清醒。 如果你打开的应用程序包,并检查他们的Info.plist,你会看到它注册为背景音频模式。 这是他们如何拉断你的距离,速度和节奏的周期性音频通知。 这也是他们如何你的运行过程中保持清醒,同时尽量减少电池消耗。
如果您发现位置服务图标(在状态栏上的三角形),而完全使用RunKeeper那么他们绝对没有使用任何类型的位置跟踪的实现后台执行消失。 即使激活地理栅栏和显著位置变化监测将使定位服务图标出现。
他们也没有使用M7保持清醒,因为它不这样的。 从M7相关CoreMotion的API的更新将无法从睡眠状态唤醒你的应用程序。 当他们应用程序做醒来,他们将能够查询运动动作和步骤历史,也许尝试计算一些东西,但我怀疑这将是所有的准确。
最后,你应该注意的是,自动暂停的API进行了iPhone 5S和M7芯片发布之前在iOS 6中推出。 他们是正交的概念。
我注意到,当你关闭GPS,应用程序不会在后台执行任何代码为iOS 7,应用程序看起来像在非活动状态。 所以,当移动到后台使用更好startMonitoringSignificantLocationChanges
,也从你的位置管理器更新。 意味着simultenoulsy使用这两种服务startUpdatingLocation
用户状态变化和startMonitoringSignificantLocationChanges
的背景。
因此,当用户开启GPS,当你使用startMonitoringSignificantLocationChanges
您的应用程序将获得
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
最好检查一下这里的背景本身有什么不好CoreMotion框架。 并尝试重新启动它。 由于wihtout M7芯片器件,我能够读取在这种情况下加速度计读数。
你有没有考虑与试验
application:performFetchWithCompletionHandler:
在应用程序的委托? 你无法控制它的通常被称为,但根据应用程序,它可以每〜15分钟。 然后,您可以从那里发动CMMotionActivityManager查询M7结果。
这不是完全清楚你要复制的是什么功能,但M7芯片记录了所有活动,无论您的应用程序是否运行。 所以,你可以在后台更新步骤总计或活动类型总计简单查询。
如果你的位置管理器在活动模式下工作,使背景模式,你需要做的三个步骤:
- 检查[目标/功能/背景模式/位置更新]被启用。
- [的LocationManager requestAlwaysAuthorization];
- locationManager.allowsBackgroundLocationUpdates = YES;