在 iphone 中按下耳机按钮时的延迟

latency when pressing headset button in iphone

我正在尝试使用插入式耳机的按钮仅在我自己的应用程序中触发不同的操作(类似于 pressy 的操作)。但是我注意到,无论我使用 MPRemoteCommandCenter 还是 remoteControlReceivedWithEvent 委托,我都会收到明显滞后的事件。更糟糕的是,如果我尝试快速双击按钮,我只会得到一个 UIEventTypeRemoteControl.

有没有人遇到过类似的问题,知道这个问题的原因或者更好地知道一些解决方法?在 ios8 和 ios9.

下测试

快速双击确实是一个用户操作,因为这是几乎所有使用耳机控件进行输入的应用程序中所需的行为。它使开发人员不必手动去抖动、排队和解析传入的控制事件,这是一件好事 (tm)!

为此,系统在等待进一步的用户输入时会引入少量延迟。只需几百毫秒即可完成,之后您将在代码中收到该事件。

一个漫长、痛苦但希望有用的双击检测示例:

  1. 用户按下耳机控件
  2. 系统通知按下,等待释放
  3. 用户释放耳机控制
  4. 系统通知释放,检测按钮被按下的时间(长按与短按)并排队单击事件
  5. 系统等待 200 毫秒以防双击
  6. 是!用户按下耳机控件
  7. 系统通知按下,等待释放
  8. 用户释放耳机控制
  9. 系统将排队的单击事件转换为双击事件
  10. 系统等待 200 毫秒以防连按三下
  11. 200 毫秒内没有用户输入
  12. 系统触发双击事件并清除队列

了解 single/double/triple-press 检测需要延迟。

当事件到达您的应用程序时,它将有一个子类型来描述用户点击的类型:

let rc = event!.subtype
print("received remote control \(rc.rawValue)") // 101 = pause, 100 = play

switch rc {
    case .RemoteControlTogglePlayPause:
        // ..
    case .RemoteControlPlay:
        // ..
    case .RemoteControlPause:
        // ..
    default:break
}

similar question 上的回答指出这些事件代码整数类似于;

100 = play
101 = pause
103 = single mic click
104 = double mic click
105 = triple mic click
etc ...