在 watchOS 2 中关闭屏幕时无法获取加速度计和心率数据

Posted

技术标签:

【中文标题】在 watchOS 2 中关闭屏幕时无法获取加速度计和心率数据【英文标题】:Not getting accelerometer and heart rate data when screen is turned off in watchOS 2 【发布时间】:2015-12-22 02:51:35 【问题描述】:

我正在使用 CMMotionManager 和 HKWorkoutSession 开发 Apple Watch 应用,以获取加速度计和心率数据。该应用程序可以在短时间内(70 秒)正常工作,但是当屏幕关闭时,心率和加速度计数据都会停止。

我的问题是如何从加速度计和心率传感器获得 5 分钟的数据?

【问题讨论】:

您正在发起 HKWorkoutSession 吗?这是在屏幕熄灭时继续收集数据的唯一方法。 【参考方案1】:

要在应用程序进入后台时花费更多时间,您可以使用performExpiringActivityWithReason。这在此处进行了描述https://developer.apple.com/videos/play/wwdc2015/228/?time=345 在我的手表上它只需要大约 30 秒

NSProcessInfo.processInfo().performExpiringActivityWithReason("Reason") 
   expired in
   if !expired 
      let delay: Int64 = 30
      let delayTime = dispatch_time(DISPATCH_TIME_NOW, delay * Int64(NSEC_PER_SEC))
      dispatch_semaphore_wait(semaphore, delayTime)
    else 
      dispatch_semaphore_signal(semaphore)
   

【讨论】:

这是一种 hack,根本不是一个可行的解决方案,您只需多花几秒钟,该进程就会被系统杀死。【参考方案2】:

自 watchOS 2 发布以来,HKWorkoutSession 是在手表屏幕关闭时保持应用程序运行的唯一方法。但是,该应用程序处于暂停状态。计时器和任何其他进程的执行都会暂停,直到屏幕重新打开。然而,应用程序的内存分配被保留。在应用程序暂停期间,设备的硬件仍在收集数据并将其存储在手表的硬盘上。当屏幕重新打开时,应用程序会退出暂停状态,硬件收集的所有数据都会在此时返回给应用程序(假设订阅了相应的侦听器)。

目前无法在屏幕关闭后继续将心率数据(或任何数据)从手表发送到 iPhone。

【讨论】:

这是正确的答案。甚至 CMSensorRecorder 也可以在后台收集数据,它会延迟几分钟,这作为问题中的目标实时数据收集是不可接受的。实际上,这和其他一些限制是 AppleWatch 成为乔布时代之后第一个也是最大的失败之一的原因。【参考方案3】:

watchOS 2 不允许应用程序在屏幕关闭时运行。虽然有一些方法可以让您获得一些额外的时间,例如使用performExpiringActivityWithReason,但无法确保您的应用运行整整 5 分钟。

【讨论】:

RunKeeper 如何在没有手机的情况下跟踪跑步?必须有办法确保长时间监测位置和心率。 使用 HealthKit 中的 HKWorkoutSession 类。 HealthKit 将继续代表您的应用收集数据,即使您的应用未运行。当您的应用程序确实有机会运行时,HealthKit 会将累积的数据传递给您的应用程序的活动查询。【参考方案4】:

现在,Apple 开放了一个 API 来记录您的 Accel 数据 点击:CMSensorRecorder .每当您的应用被暂停或终止时,API 将以 50Hz 的频率持续运行近 3 天。

【讨论】:

这不是实时的,大约需要3分钟的延迟才能获取数据。 watchOS 3.0 对其进行了改进,因此只有几秒钟的延迟。 3 分钟延迟适用于 watchOS 2.0。 @brunobowden 即使你在理论上是正确的,因为这是 watchOS 3 正式传达的延迟(无论如何我是在 watchOS 3 之前写的),我们永远无法在设备上运行应用程序时达到类似的短时间延迟. 另一个在答案中被混淆的问题。甚至 CMSensorRecorder 作为具有专用功能 (recordAccelerometerForDuration:) 的“后台”系统进程运行,仅用于此服务,它不是实时的,因为它运行直到持续时间过去,然后它可以用于处理。心率采集没有相同的功能。它必须作为一个带有队列的简单前台函数运行,该应用程序(作为 HKWorkout 应用程序)可能会进入后台,同时实时连续提供心率数据。

以上是关于在 watchOS 2 中关闭屏幕时无法获取加速度计和心率数据的主要内容,如果未能解决你的问题,请参考以下文章

发出警报后,我无法在我的反应本机应用程序中关闭我的键盘

我可以从 Main 构造函数中关闭程序吗?

如何在我的网站中关闭自动睡眠 ios

在 xamarin 表单中关闭应用程序时无法显示通知

位置:修复在 Chrome 和 IE 中关闭画布菜单时效果不佳的问题

在播放到苹果电视时以编程方式在 iOS 中关闭镜像?