ios – 在iPhone上按耳机按钮时的延迟

我试图触发不同的动作,只有我自己的应用程序使用插头耳机的按钮(类似于什么压力).但是我注意到,无论我是否使用MPRemoteCommandCenter或remoteControlReceivedWithEvent委托,我都会收到一个明显滞后的事件.更糟糕的是,如果我尝试双击按钮快,我只会得到一个UIEventTypeRemoteControl.

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

解决方法

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

为了使其工作,系统将引入少量滞后,同时等待进一步的用户输入.它只需要几百毫秒才能完成,之后您将在代码中收到该事件.

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

>用户按下耳机控制
>系统通知按,等待发布
>用户释放耳机控制
>系统通知发布,检测时间按钮被按下(长按vs短按)并排队单击事件
>系统等待200ms,以备双击
这是!用户按下耳机控制
>系统通知按,等待发布
>用户释放耳机控制
>系统将排队的单击事件转换为双击事件
>系统等待200ms,万一它是三重按
> 200ms内无用户输入
>系统触发双击事件并清除队列

查看单/双/三次压力检测需要延迟.

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

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...