在iOS应用中读取Smart Keyboard等物理键盘的原始输入

加入了Apple Developer Program后就能生成长达1年有效期的Wildcard证书,烦人的开发证书7天限制再也没有了,相信无论是谁都会忍不住在自己的iOS设备上安装各种AppStore上无法上架的应用。

最近在折腾各种iOS的模拟器游戏,从能装Windows 95的dospad到覆盖全平台的PPSSPP都玩了个遍。但是,除了dospad之外都普遍存在一个问题:不兼容iPad Pro的Smart Keyboard。

dospad不仅能完美识别Smart Keyboard上的按键,还把部分按键映射进行了优化,比如把左上角的“`”替换成了ESC键,大大增强了用户体验。这说明Smart Keyboard的原始输入本身是可以被iOS应用读取的。

PPSSPP经过几年的发展,也得益于A10X处理器的强大性能,在未越狱设备上不开JIT运行也十分流畅。可惜它不支持Smart Keyboard。

经过各种试验,我发现一个有趣的现象:有的时候键盘上的wsad键能被识别成gamepad输入的方向键。不过它只能识别按下而不能识别弹起,所以按下后就会卡住,得通过屏幕虚拟按键释放。

查看输入部分代码发现PPSSPP支持一种叫iCade的控制器。它的输入使用UIViewController中提供的文本读取接口实现。而dospad中的输入实现更加底层,直接通过UIApplication中的接口读取按键代码和状态。显然,后者的实现方式更加灵活。

这样一来目的就很明确了:实现UIApplication的子类,并用其启动应用,里面实现读取键盘原始输入的方法,然后将按键代码和状态映射到PPSSPP的键盘输入。经测试,Smart Keyboard上的除了左下角地球键外每一个按键都有对应的代码。

最终效果还不错,输入基本感觉不到延迟。

演示视频:https://youtu.be/F8D0Zu1xrJ0

修改后的PPSSPP代码:https://github.com/imxieyi/ppsspp

修改及添加的文件全部位于ios目录下。

文章目录
|