系統聲音服務(System Sound Services)提供了一個接口,用於播放不超過30秒的聲音。它支持的文件格式有限,具體地說只有CAF、AIF和使用PCM或IMA/ADPCM數據的WAV文件。由於這些函數沒有提供操縱聲音和控制音量的功能,所以當你為多媒體或者游戲創建專門的配樂時,不要使用系統聲音服務。
iOS使用系統聲音服務來支持三種不同的通知:
1. 聲音:立刻播放一個簡單的聲音文件。如果手機被設置為靜音,用戶什么也聽不到
2. 提醒:播放一個聲音文件,如果手機被設置為靜音或震動,將通過震動提醒用戶
3. 震動:震動手機,而不考慮其他設置
要在項目中使用系統聲音服務,首先要導入AudioToolbox.h
#import <AudioToolbox/AudioToolbox.h>
系統聲音服務並非是通過類實現的,而是使用傳統的C語言函數調用來觸發播放操作。要播放音頻,需要使用的兩個函數是AudioServicesCreateSystemSoundID 和 AudioServicesPlaySystemSound。還需要聲明一個類型為SystemSoundID的變量,它表示要使用的聲音文件。下面演示了如何加載並播放聲音:
- (IBAction)testSystemSound:(id)sender { SystemSoundID soundID; NSString *strSoundFile = [[NSBundle mainBundle] pathForResource:@"alertsound" ofType:@"wav"]; AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:strSoundFile],&soundID); AudioServicesPlaySystemSound(soundID); }
其實這段代碼應該這樣來理解:
在寫這個功能時最主要是兩句代碼:
SystemSoundID soundID;
AudioServicesPlaySystemSound(soundID);
然后考慮如何在中間加代碼使得soundID被賦值:
AudioServicesCreateSystemSoundID((CFURLRef)fileURL,&myID);
第二個參數就是我們建立的SystemSoundID對象,但是這里要傳地址(加&符號)。
第一個參數需要一個CFURLRef類型的url參數,要新建一個NSString來做橋接轉換(bridge),而這個NSString的值,是通過NSBundle來返回音頻文件路徑:
NSString *strSoundFile = [[NSBundle mainBundle] pathForResource:@"alertsound" ofType:@"wav"];
mainBundle -- 總地來說,mainBundle對應於應用程序文件歸檔或者應用程序的封包:一個以“.app”為擴展名並以應用程序名稱為基本名的目錄。
pathForResource方法 -- 通過文件名和后綴名獲取路徑。
這句話調用pathForResource方法,來獲取mainBundle下名為alertsound.wav的音頻文件,然后將路徑值返回。
對於提醒音來說,與系統聲音之間的差別在於,如果手機處於靜音狀態,提醒音將自動觸發震動。提醒音的設置和用法與系統聲音相同,區別在於系統聲音調用AudioServicesPlaySystemSound,而提醒音調用AudioServicesPlayAlertSound。
震動更容易實現,只需要調用AudioServicesPlaySystemSound,並將常量kSystemSoundID_Vibrate傳遞給它:
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
如果視圖震動不支持震動的設備(如iPad2),將靜默失敗。因此將震動代碼留在應用程序中不會有任何害處,而不管目標設備是什么。
