众所周知,落格输入法不需要获取“完全访问权限”,所以根据苹果的权限,自然就无法播放按键音了。
不过,最近的落格输入法更新中加入了这一功能——在后续的版本中甚至可以加入按键震动了。然而我还是无需获取“完全访问权限”。
那么,我是怎么做到的呢?
iOS 里的声音和震动
其实是同一回事。在 iOS 里,震动其实也是声音,也就是说,首先,只要能播放声音,就可以震动,因为在 iOS 的 api 里,震动也是声音——即声音的一种。
播放声音
iOS 中播放按键音其实也是播放声音,那么我们可以有这些方法达到目的:
- 使用 AudioToolbox
- 使用 AVFoundation
- 直接用 tock.caf 这个文件
- 使用系统自带的 UIDevice.currentDevice().playInputClick()
不过如你所见,它们都是需要完全访问权限才能播放的——但是!
1、使用 AudioToolbox 来播放系统声音其实是不需要权限的!
所以,我们要做的就是找到系统键盘按下的声音代码即可。
不同 iOS 版本 键盘声不同
由于我们直接去播放声音代码,不同版本声音代码不同,所以这也是为什么官方的播放键盘音用的是一个方法, UIDevice.currentDevice().playInputClick() ,显然,如果你使用的系统版本过低,那么是无法听到键盘音的,我也不知道是因为需要权限,还是根本就没有这个声音代码。
总之,这里我给出所有我找到的声音代码,如果你的键盘也需要,就可以尝试一下。
使用方法
首先,导入 AudioToolbox 框架 import AudioToolbox ,然后,在你需要播放键盘音的地方,比如响应按键事件的地方,调用 AudioServicesPlaySystemSound(1123) 即可。
值得一提的是:为了避免堵住主线程,你可能需要在子线程里去播放它——这样又可能导致某些情况下按键音跟不上节奏。
接下来我给出我找到的所有声音(震动)代码,都是基于 iOS 10 的,所以旧版本不一定好用。——但至少好处是不需要“完全访问”权限了对吧?
- 1123——键盘字母按钮按下声音;
- 1155——退格键声音;
- 1156——其他键盘功能键声音;
- 1519——6s peek 震动效果;
- 1520——6s pop 震动效果;
- 1521——6s 三连震 震动效果。
关于 iPhone 7
7系列有更高级的微震动,这个由于我没有对应的设备所以无法测试其接口是否能用,这个只能日后有空再来测试了。
其他讨论
如你所见,只要把声音代码改成震动代码,就可以在6s机器上实现按键震动了,实测打字慢一点的话用 peek 的效果也还挺不错的——费电不费电就不得而知了。
我目前在落格上仅仅在长按、上下点划上用了震动。
目前遇到的问题比如不能像系统键盘那样按下按钮就响——这个是逻辑处理问题,后续可以优化流程。
不能像系统键盘那样快速输入时取消前面的播放,这就导致你连续快速按两次按钮的话,可能只播放一次按键音;震动同理。
后续有空了再研究,就这么多。
本文由 落格博客 原创撰写:落格博客 » 落格输入法是如何实现按键音的
转载请保留出处和原文链接:https://www.logcg.com/archives/2740.html
我也假装看懂了
假装看懂了。我好厉害。