1、iOS 中調(diào)用系統(tǒng)鈴聲與振動
在iOS APP開發(fā)中,有時我們需要調(diào)用手機系統(tǒng)鈴聲與振動,用以作消息提醒。這個實現(xiàn)起來并不難,只需要調(diào)用iOS框架即可。
在需要調(diào)用我類頭文件導(dǎo)入:#import <AudioToolbox/AudioToolbox.h>
然后在需要的地方調(diào)用方法即可,如:
其中這個soundID號可以從蘋果官方網(wǎng)站找到:http://iphonedevwiki.net/index.php/AudioServices
鈴聲振動需要在真機測試才可實現(xiàn),具體實現(xiàn)如下:
鈴聲:
SystemSoundID soundID = 1007;
AudioServicesPlaySystemSound(soundID);
振動:
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
就這樣簡單就可以設(shè)置鈴聲與振動了。
2、如何設(shè)置app的鈴聲與系統(tǒng)設(shè)置的鈴聲一致?(ios 開發(fā)如何獲取系統(tǒng)鈴聲信息)
但是這里你可能會發(fā)現(xiàn)一個問題:這里是寫死的鈴聲,寫了什么soundID號就響哪個,用戶無法通過在手機設(shè)置里的聲音設(shè)置里更換,但我們想要的偏偏就是這種效果:設(shè)置這個soundID不是死的,它是與系統(tǒng)默認(rèn)鈴聲一致的,當(dāng)用戶通過設(shè)置里的聲音設(shè)置更改系統(tǒng)默認(rèn)鈴聲時,對應(yīng)app里的鈴聲也隨著更改,拿安卓版QQ舉個例子就可以發(fā)現(xiàn):

對的,安卓是可以實現(xiàn)的,只要在手機設(shè)置里更換這個系統(tǒng)默認(rèn)鈴聲,對應(yīng)QQ的消息提示音也會隨著改變。
于是,我瘋狂地百度簡書,試圖去獲取蘋果手機系統(tǒng)設(shè)置的短信鈴聲、郵件鈴聲、其他鈴聲等信息,最終一無所獲。(不知道有沒有人知道如何獲取到)
最后我打開蘋果版QQ查看消息鈴聲的設(shè)置,發(fā)現(xiàn)iOS版的QQ是沒有設(shè)置為系統(tǒng)鈴聲這一選項的,與安卓不一樣,也就是說iOS版的QQ也沒有實現(xiàn)我上面提到的這個功能,所以,姑且認(rèn)為iOS沒有這個權(quán)限去獲取這部分系統(tǒng)信息吧。
3、單獨控制鈴聲與振動
鈴聲設(shè)置完之后就該測試了,測試之前當(dāng)然要確保手機并無開啟靜音模式 && 同時務(wù)必要開啟振動模式??!
如果開啟了靜音狀態(tài),則無論如何也不會響的;同理,如果關(guān)閉了振動模式,無論如何也是不會振動的。

確保手機并無開啟靜音模式同時開啟了兩項振動模式(靜音模式振動/響鈴模式振動--->>在手機設(shè)置-->>聲音設(shè)置里面可以打開)后就可以測試了,這里我發(fā)現(xiàn)當(dāng)我只調(diào)用了鈴聲 而并無調(diào)用振動的方法,手機就會既響鈴又振動了,為什么呢?----->>>因為我開啟了“響鈴模式振動”啊,所以理所當(dāng)然會振動?。?!
但現(xiàn)在我的需求就不是這樣的,通常情況下,我們的手機是保持在響鈴模式下的并且開啟振動模式的,在這樣的響鈴振動模式下,我想要的需求是單獨控制,響鈴是響鈴,振動是振動,同時是同時,這樣子。那就去把“響鈴模式振動”關(guān)了吧,好,關(guān)了之后發(fā)現(xiàn)在單單調(diào)用響鈴時確實是鈴響了且沒有振動,很高興。下一步我又想要單單振動,我重新去調(diào)用振動的方法,不要響鈴,發(fā)現(xiàn)振動不振了,因為此時手機為響鈴模式啊,而剛才我又已經(jīng)將“響鈴模式振動”給關(guān)了,所以當(dāng)然不會振了啊,,,怎么辦呢????.......
于是又上了百度,百度上有人提出的解決辦法是將這些調(diào)用鈴聲的方法封裝到一個單例里去,然后分別調(diào)用就可以了。(具體如鏈接里說的:http://www.itdecent.cn/p/ce8f1a890892 也可以下該作者文章里提到的demo,他的demo里還有一個可以判斷手機當(dāng)前是否開啟了靜音模式的類,感覺不怎么實用,因為如果是靜音模式下我正好又關(guān)了振動模式,你還怎么振?同時在非靜音模式下我開啟了振動,還不是一樣的振?但是呢也有好處:就是可以判斷在靜音時選擇振動(如果可以振的話,否則響鈴,大神寫得不錯!))
其實我發(fā)現(xiàn)不一定要封裝成所謂的單例的,只要把:
只要把下面這句:
AudioServicesPlaySystemSound(soundID);
改成下面這樣:
NSString *path = [NSString stringWithFormat:@"/System/Library/Audio/UISounds/%@.%@",@"sms-received1",@"caf"];
OSStatus error = AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path],&soundID);
if (error != kAudioServicesNoError) {//獲取的聲音的時候,出現(xiàn)錯誤
NSLog(@"靜音");
soundID = nil;
}
AudioServicesPlaySystemSound(soundID);
就可以了,其中“sms-received1”為鈴聲的名字,可在前面提到的蘋果官網(wǎng)里找,“caf”為鈴聲格式,這里通過鈴聲名字轉(zhuǎn)換成soundID后就會莫名地在響鈴兼振動下單獨地響鈴了。
然后振動的地方再單獨調(diào)振動就可以了。
當(dāng)然,如果想要同時響鈴振動就可以單獨寫那句AudioServicesPlaySystemSound(soundID);或者連振動那句一起寫好了。