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

pzo*_*pzo 13 iphone latency headset ios

我试图使用插入式耳机的按钮(类似于压力的东西)在我自己的应用程序内触发不同的动作.然而我注意到无论我是否使用MPRemoteCommandCenterremoteControlReceivedWithEvent委托,我都会收到明显滞后的事件.更糟糕的是,如果我尝试双按快按钮,我只会得到一个UIEventTypeRemoteControl.

有没有人遇到类似的问题,知道这个的原因,甚至更好地了解一些解决方法?在ios8和ios9下测试.

NoC*_*sum 1

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

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

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

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

了解单按/双按/三按检测所需的延迟。

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

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

switch rc {
    case .RemoteControlTogglePlayPause:
        // ..
    case .RemoteControlPlay:
        // ..
    case .RemoteControlPause:
        // ..
    default:break
}
Run Code Online (Sandbox Code Playgroud)

类似问题的答案指出这些事件代码整数将类似于;

100 = play
101 = pause
103 = single mic click
104 = double mic click
105 = triple mic click
etc ...
Run Code Online (Sandbox Code Playgroud)