使用 AudioServices 相關介面的連續震動

發表於2016-11-04

摘要:本文使用底層介面,實現iOS裝置上的連續震動,以及連續播放系統聲音(不是音樂播放器哦)

話不多說,先上程式碼!!!喜歡就點贊

主要功能函式

首先實現上述函式中的回撥函式(注意是C)

實現播放聲音或震動的程式碼

至此,就可以順利的播放聲音和震動了,而且是連續的哦!!!

別忘了! 怎麼讓他停下來

為了方便 我就寫了而一個OC的方法來做了

這裡要詳細解說一下需要注意的事項:

AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, systemAudioCallback, NULL);
AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);
這兩個介面的用途是繫結和取消指定soundID對應的回撥方法;kSystemSoundID_Vibrate為soundID型別,其回撥方法認準的也是這個soundID,在任何地方使用這個id去執行AudioServicesPlaySystemSound(xxxSoundID)都會呼叫到該回撥方法。而一旦呼叫remove方法取消回撥,同樣的在任何地方使用這個id去執行AudioServicesPlaySystemSound(xxxSoundID)都不會呼叫到這個回撥。說的這麼繞,其實就是說這倆介面的影響是全域性的,威力很大。
我們只要在回撥方法裡面再呼叫AudioServicesPlaySystemSound介面,就可以實現連續震動了;當我們想要停止震動時,呼叫remove介面,ok,回撥方法就歇火了。

優化:(參考某大神的部落格,名字太長,直接附連結)
http://blog.csdn.net/openglnewbee/article/details/8494598

經過測試發現震動之間太連續,體驗不符合要求;所以我們在c回撥裡面通過單例(全域性變數性質的指標)呼叫到oc的方法進行[self performSelector:@selector(triggerShake) withObject:nil afterDelay:1](triggerShake是震動介面);在停止震動時候我們需要呼叫

停止之前可能的回撥;這兩個方法的成對使用既好用又簡便,對於需要定時呼叫的場景很適合,也免去維護定時器的麻煩。

這個時候螢幕要是常亮就更好了,不用費腦子了,用這個!!!

同樣,別忘了結束的時候置NO,否則就會一直亮著了!!!

附圖(建議大家想想一下連續震動的感覺):

11545755-46b76ee471f5956c
效果圖

進一步交流 QQ群:361736344

相關文章