IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    R0uter发表于 2017-05-18 12:44:50
    love 0

    去落格博客阅读完整排版的落格输入法是如何实现按键音的

    最近更新:18th 五月, 2017

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

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

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

    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 的效果也还挺不错的——费电不费电就不得而知了。

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

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

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

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

    落格输入法是如何实现按键音的,首发于落格博客。

    其他推荐:
    1. Swift 里的 Stack 实现
    2. 在字符串中 快速查找
    3. 如何自定义 落格输入法 ?
    4. 落格输入法 是怎么实现 app 设置而不需要 完全访问 权限的?
    5. 写 落格输入法 的这半年里获得的 一点人生经验



沪ICP备19023445号-2号
友情链接