10.2 更新
開源了!以下優(yōu)化用于餓了么蜂鳥App中,項目鏈接在鏈接 ,歡迎 star 和 pr.
語音播放一直是一個較低頻的開發(fā)知識點,很多開發(fā)并沒有這樣的需求,所以導(dǎo)致在墻內(nèi)搜不到太多關(guān)于它的一些總結(jié)(主要是踩坑),剛好最近接了一個語音優(yōu)化的需求,將自己的經(jīng)驗與總結(jié)記錄下來.
首先要介紹微信團隊總結(jié)的一篇,給出了很多解決方案
https://mp.weixin.qq.com/s/yYCaPMxHGT9LyRyAPewVWQ
先列出待優(yōu)化的點
- 在后臺播放音樂時,語音提醒之后音樂不會恢復(fù)播放.
- 插耳機和揚聲器播放聲音忽大忽小
- 在接聽電話時,會有語音播放,影響通話
- 有時候播放語音有震動,有時候沒有
優(yōu)化1
當(dāng)有提示音播放時,后臺音樂被中斷且無法自動恢復(fù).
這個問題首先想到AVAudioSession 中 category 的設(shè)置問題,可以根據(jù)下圖結(jié)合 app 的實際需求去選擇合適的一個.
設(shè)置完成之后要注意是否在播放完成的代理方法中執(zhí)行了:
這里還要注意一點,AVAudioSession在設(shè)置 category 的時候支持傳入 options,來對設(shè)置的 category 來微調(diào).參看LPDSoundService
.
優(yōu)化2
插耳機和揚聲器播放聲音音量不穩(wěn)定這個問題,首先去定位播放的聲音文件,發(fā)現(xiàn)聲音文件確實存在幾個聲音高低的問題.
接下來再去找發(fā)現(xiàn)在耳機插入時存在短暫的聲音丟失,那我的優(yōu)化辦法是在監(jiān)聽耳機的狀態(tài)的方法里暫停播放0.1s.耳機的插入拔出會觸發(fā)這個通知AVAudioSessionRouteChangeNotification
接下來對音量處理參考微信的解決辦法,用
MPVolumeView
中的 slider 來處理音量的控制,但是把MPVolumeView
加到了keyWindow
上,參看LPDVolumeManager
這個音量控制的單例類.
優(yōu)化3
在接電話的時候還有語音播放這個問題找了好久的解決辦法,后來發(fā)現(xiàn)自己犯傻了...
首先肯定是要在播放語音之前判斷當(dāng)前時候是否處在通話狀態(tài),輕松搜到CTCallCenter類,但是發(fā)現(xiàn)這個不起作用,那就去私有庫找找API(不上商店就是好),后來兜兜轉(zhuǎn)轉(zhuǎn)發(fā)現(xiàn)這個CTCallCenter是 iOS9以下,在10之后換成了CXCallObserver類,貼代碼,參看LPDTeleponyManager
.
優(yōu)化4
有時候播放語音有震動,有時候沒有....
這個問題真是奇葩了,產(chǎn)品邏輯要求播放聲音的時候要求有震動,這簡單
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
但是突然發(fā)現(xiàn),有時候震動就突然沒了,調(diào)試發(fā)現(xiàn)方法也走了,最后無奈發(fā)現(xiàn)蘋果然后還有一手,
不開這一項,怎么震動...
總結(jié)
在做整個優(yōu)化的過程中踩了不少坑也花了不少時間,在調(diào)用 API 的時候最好自己看看上面的注釋,尤其是不熟悉的 API,能看官方文檔就看官方的.