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

时间:2015-10-14 05:27:31

标签: ios iphone latency headset

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

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

1 个答案:

答案 0 :(得分:1)

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

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

一个长期,痛苦,但希望有用的双按检测示例:

  1. 用户按下耳机控件
  2. 系统通知按,等待发布
  3. 用户发布耳机控制
  4. 系统通知发布,检测时间按钮被按下(长按vs短按)并排队单按事件
  5. 系统等待200毫秒以防双击
  6. 是的!用户按下耳机控制
  7. 系统通知按,等待发布
  8. 用户发布耳机控制
  9. 系统将排队的单按事件转换为双按事件
  10. 如果是三按
  11. ,系统会等待200毫秒
  12. 200毫秒内没有用户输入
  13. 系统触发双按事件并清除队列
  14. 了解单次/双次/三次按压检测需要延迟。

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

    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 ...