Core Haptics 和 Core Bluetooth 会相互干扰吗?

Do Core Haptics and Core Bluetooth interfere?

设置

我的 iOS 应用程序正在与 BLE 设备通信。 作为对此次交流中某些事件的回应,我想向用户提供触觉反馈。

为了支持像 iPhone 7 这样的旧手机,我决定使用 UIFeedbackGenerator,特别是 UIImpactFeedbackGenerator 用于此目的。

现在,当通过 BLE 接收上述事件时,我调用 feedbackGenerator.impactOccurred()

行为

通话时,没有触觉反馈。 但是系统仍然会记住这些对 UIFeedbackGenerator 的调用。

因为,当用户随后与 UI 元素交互时,所有对 feedbackGenerator.impactOccurred() 的调用都会立即触发,并且会提供触觉反馈作为对 UI 交互的响应。这让用户感到很困惑,他们当时并没有期待触觉反馈。此外,如果随着时间的推移积累了足够多的呼叫,触觉反馈可能会非常强烈。

当这些被遗忘的触觉反馈呼叫累积到足够多时,系统似乎超载了;以下日志在控制台中生成了几十次:

CAReportingClient.mm:295:-[CAReportingClient init]_block_invoke: Couldn’t communicate with a helper application

无论如何,根据 UIFeedbackGenerator:

的苹果文档,这可能是预期的行为

Note that calling these methods does not play haptics directly. Instead, it informs the system of the event. The system then determines whether to play the haptics based on the device, the application’s state, the amount of battery power remaining, and other factors.

我的问题

您是否知道使用 Core Bluetooth 是否会改变 CoreHapticsUIFeedbackGenerator 的行为?这是我调试的起点,因为当我在本地模拟通信的所有部分时,触觉反馈工作得很好。

我已经尝试过的

事实证明,我在 CoreBluetooth 实现中没有给予足够的重视。我安排不断向特征发送数据的工作人员在 DispatchQueue.global(qos: .userInitiated) 中 运行。

因为我和我的工作人员一起阻塞了这个队列,CoreHaptics 决定最好不要立即播放反馈。

故事的寓意:注意您使用的队列。