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

标签 ios iphone latency headset

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

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

最佳答案

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

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

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

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

关于 similar question 的答案指出这些事件代码整数将类似于;

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

关于ios - 在 iphone 中按下耳机按钮时的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33117240/

相关文章:

ios - 在 10 分钟切片中拆分最后两个小时

iphone - 带有 AVPlayer 的音频流

ios - 尝试使用 UrbanAirship 创建推送通知时,如何指定登陆哪个屏幕?

ios - Facebook v2 与 iOS SDK 集成

iphone - 未访问委托(delegate)方法

c - 单个主机的阻塞与非阻塞 UDP 套接字

ios - 在 TabViewController 和 NavigationController 之间导航

iPhone OS 3.1.3 不适用于 Xcode 3.2.1。我必须安装 SDK 3.2 BETA 吗?

c# - 网络延迟测试仪

performance - 访问各种缓存和主存的大概成本?