眾所周知,落格輸入法不需要獲取“完全訪問權限“,所以根據蘋果的權限,自然就無法播放按鍵音了。
不過,最近的落格輸入法更新中加入了這一功能——在後續的版本中甚至可以加入按鍵震動了。然而我還是無需獲取“完全訪問權限”。
那麼,我是怎麼做到的呢?
iOS 裡的聲音和震動
其實是同一回事。在 iOS 裡,震動其實也是聲音,也就是說,首先,只要能播放聲音,就可以震動,因為在 iOS 的 api 裡,震動也是聲音——即聲音的一種。
播放聲音
iOS 中播放按鍵音其實也是播放聲音,那麼我們可以有這些方法達到目的:
- 使用AudioToolbox
- 使用 AVFoundation
- 直接用 tock.caf 這個文件
- 使用系統自帶的 的UIDevice.currentDevice().playInputClick()
不過如你所見,它們都是需要完全訪問權限才能播放的——但是!
1、使用 AudioToolbox 來播放系統聲音其實是不需要權限的!
所以,我們要做的就是找到系統鍵盤按下的聲音代碼即可。
不同 iOS 版本 鍵盤聲不同
由於我們直接去播放聲音代碼,不同版本聲音代碼不同,所以這也是為什麼官方的播放鍵盤音用的是一個方法, 的UIDevice.currentDevice().playInputClick() ,顯然,如果你使用的系統版本過低,那麼是無法聽到鍵盤音的,我也不知道是因為需要權限,還是根本就沒有這個聲音代碼。
總之,這裡我給出所有我找到的聲音代碼,如果你的鍵盤也需要,就可以嘗試一下。
如何使用
首先,導入 AudioToolbox 框架 進口 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
我也假裝看懂了
假裝看懂了。我好厲害。