0

设置

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

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

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

行为

在通话时,不会发生触觉反馈。但是系统仍然会记住这些调用UIFeedbackGenerator

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

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

CAReportingClient.mm:295:-[CAReportingClient init]_block_invoke:无法与帮助应用程序通信

无论如何,根据苹果文档,这可能是预期的行为UIFeedbackGenerator

请注意,调用这些方法不会直接播放触觉。相反,它会将事件通知系统。然后系统根据设备、应用程序的状态、剩余电池电量和其他因素确定是否播放触觉。

我的问题

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

我已经尝试过的

  • UIFeedbackGenerator从主/后台线程调用
  • 使用UINotificationFeedbackGenerator代替UIImpactFeedbackGenerator
  • 提前打电话prepare()UIFeedbackGenerator
4

1 回答 1

0

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

因为我用我的工人阻止了这个队列,CoreHaptics 决定最好不要立即播放反馈。

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

于 2020-04-05T13:23:19.200 回答