落格输入法是如何实现按键音的

众所周知,落格输入法不需要获取“完全访问权限”,所以根据苹果的权限,自然就无法播放按键音了。

不过,最近的落格输入法更新中加入了这一功能——在后续的版本中甚至可以加入按键震动了。然而我还是无需获取“完全访问权限”。

那么,我是怎么做到的呢?

iOS 里的声音和震动

其实是同一回事。在 iOS 里,震动其实也是声音,也就是说,首先,只要能播放声音,就可以震动,因为在 iOS 的 api 里,震动也是声音——即声音的一种。

播放声音

iOS 中播放按键音其实也是播放声音,那么我们可以有这些方法达到目的:

  1. 使用 AudioToolbox
  2. 使用 AVFoundation
  3. 直接用 tock.caf 这个文件
  4. 使用系统自带的 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 的效果也还挺不错的——费电不费电就不得而知了。

我目前在落格上仅仅在长按、上下点划上用了震动。

目前遇到的问题比如不能像系统键盘那样按下按钮就响——这个是逻辑处理问题,后续可以优化流程。

不能像系统键盘那样快速输入时取消前面的播放,这就导致你连续快速按两次按钮的话,可能只播放一次按键音;震动同理。

后续有空了再研究,就这么多。

anyShare分享到:

“落格输入法是如何实现按键音的”的2个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注