無論聲音是你的應(yīng)用的主要內(nèi)容的一部分,還是錦上添花的元素,你都需要知道用戶對(duì)聲音將如何表現(xiàn)的期望以及與如何滿足這些期望。
人們可以使用設(shè)備控件來改變聲音,也可能使用有線或無線的耳機(jī)和聽筒。人們也會(huì)對(duì)于他們的行為如何作用于他們聽到的聲音有各種各樣的期望。雖然你可能發(fā)現(xiàn)有一些期望很讓人意外,但它們都會(huì)遵循用戶控制的原則,即是用戶而非設(shè)備來掌控他們聽到聲音的時(shí)機(jī)。
用戶會(huì)依據(jù)需要將設(shè)備靜音:
例如,在劇院中,用戶將他們的設(shè)備調(diào)至靜音以避免打擾劇院中的其他人。在這種情境下,用戶仍然希望能在他們的設(shè)備上使用應(yīng)用,但他們不希望被無預(yù)期或突然的聲音所打斷,如手機(jī)鈴聲或新消息提示音。
在用戶進(jìn)行單純操作和有明確期望產(chǎn)生音效的操作時(shí),鈴音/靜音開關(guān)(或靜音開關(guān))不會(huì)阻止這些操作所導(dǎo)致的聲音。例如:
用戶使用設(shè)備的音量鍵調(diào)整所有音效的音量,包括歌曲、應(yīng)用音效和設(shè)備聲音。用戶可以使用音量按鈕屏蔽所有聲音,無論鈴聲/靜音(或靜音)的開關(guān)在什么位置。 使用音量鍵調(diào)整應(yīng)用當(dāng)前所播放的音頻時(shí)同樣調(diào)整了整個(gè)手機(jī)的音量,只有鈴聲音量除外。
對(duì)于 iPhone :當(dāng)沒有音頻播放時(shí)使用音量鍵可以調(diào)整鈴聲音量。
用戶使用耳機(jī)可以私密地聽到聲音并解放他們的雙手。不管這些配件是有線或無線的,用戶都對(duì)他們的體驗(yàn)有特定的期待。
當(dāng)用戶插入耳機(jī)或連接無線音頻設(shè)備時(shí),他們想要以私密的狀態(tài)繼續(xù)收聽當(dāng)前播放的音頻。由于這一原因,他們希望當(dāng)前正在播放音頻的應(yīng)用能繼續(xù)播放不中斷地播放。
當(dāng)用戶拔出耳機(jī)或斷開與無線設(shè)備的連接時(shí)(或者設(shè)備超出范圍或關(guān)閉時(shí)),他們不希望他們剛剛收聽的內(nèi)容被自動(dòng)地與他人分享。 基于這一原因,他們希望正在播放音頻的應(yīng)用暫停播放,并可以允許他們?cè)谠敢鈺r(shí)能容易地重新開啟播放。
如果必要的話,你可以調(diào)整相關(guān)的、獨(dú)立的音量水平以在你的應(yīng)用音效輸出時(shí)制造出最好的混音效果。但是,最終音效輸出的音量也應(yīng)該能被系統(tǒng)音量所控制,無論是通過音量鍵還是音量滑條進(jìn)行調(diào)節(jié)。 這意味著應(yīng)用的音頻輸出的控制權(quán)仍在它所屬的用戶手中。
確保你的應(yīng)用能適時(shí)的顯示音頻路徑選擇。(音頻路徑是指音頻信號(hào)的電子路徑,例如源于設(shè)備到耳機(jī)或是由設(shè)備到揚(yáng)聲器。) 即使人們沒有插入或拔出音頻設(shè)備,他們也仍希望能選擇一個(gè)不同的音頻路徑。為了實(shí)現(xiàn)這一功能, iOS 能自動(dòng)顯示一個(gè)控件來允許用戶選擇一個(gè)輸出音頻路徑(使用 MPVolumeView 類能允許這個(gè)控件顯示在你的應(yīng)用中)。 由于選擇不同的音頻路徑是用戶主動(dòng)的行為,用戶期望當(dāng)前播放的音頻能繼續(xù)不中斷。
如果你需要顯示音量滑條并使用 MPVolumeView 類時(shí),確保使用系統(tǒng)原生的音量滑條可用。 要注意,當(dāng)激活的音頻輸出設(shè)備不支持音量控制時(shí),要使用合適的設(shè)備名稱來替代音量滑條。
如果你的應(yīng)用只產(chǎn)生一些與其功能無關(guān)緊要的界面音效時(shí),請(qǐng)使用系統(tǒng)音效服務(wù)。系統(tǒng)音效服務(wù)是iOS系統(tǒng)下產(chǎn)生警示音、界面音效和調(diào)用振動(dòng)的技術(shù);它不適合任何其他用途。 當(dāng)你使用系統(tǒng)音效服務(wù)來產(chǎn)生音效時(shí),你無法干涉你的音頻與設(shè)備的音頻的交互方式,也無法干涉當(dāng)設(shè)備配置變化時(shí)或有干擾時(shí)的響應(yīng)方式。 如想了解如何使用這一技術(shù),參閱 Audio UI Sounds (SysSound) 。
如果音效在你的應(yīng)用中扮演重要的角色,使用音頻會(huì)話服務(wù)或是 AVAudioSession 類。 這些程序接口并不產(chǎn)生音效;相反,它們會(huì)幫助你了解你的音頻應(yīng)該如何與設(shè)備上的音頻進(jìn)行交互以及如何響應(yīng)設(shè)備配置的變化和干擾。
對(duì)于iPhone:無論你使用什么樣的技術(shù)來制作音頻,或者你用什么樣的方式來定義它的行為,手機(jī)總是可以中斷當(dāng)前運(yùn)行的應(yīng)用。 這是因?yàn)槿魏螒?yīng)用都不應(yīng)該阻止人們接收來電。
在音頻會(huì)話服務(wù)中,音頻會(huì)話作為你的應(yīng)用與手機(jī)系統(tǒng)之間音頻媒介在運(yùn)行。音頻會(huì)話中最重要的方面之一就是 category ,它定義了你的應(yīng)用音頻的行為。
為了實(shí)現(xiàn)音頻會(huì)話服務(wù)帶來的好處并能提供用戶期望的音頻體驗(yàn),你需要選擇可以完美展現(xiàn)應(yīng)用音頻行為的 category 。 具體情況取決于你的應(yīng)用只在前臺(tái)播放音頻還是也需要在后臺(tái)播放音頻。在你做這一選擇的時(shí)候,請(qǐng)遵循以下這些原則:
例如,你可能要添加“閃避”屬性以確保你的音頻音量能比其他所有的音頻都大(除了手機(jī)音頻),當(dāng)然如果這是你的用戶對(duì)你的應(yīng)用所期待的功能的話。(欲了解更多關(guān)于音頻會(huì)話屬性的內(nèi)容, 請(qǐng)參見 Audio Session Programming Guide 中的 Fine-Tuning the Category 章節(jié)。)
表 31-1 列舉了你可以使用的音頻會(huì)話類目。不同的類目可以允許通過鈴聲/靜音開關(guān)或靜音開關(guān)(或設(shè)備鎖)來實(shí)現(xiàn)靜音、與其他的音頻混合或者應(yīng)用在后臺(tái)播放的功能。(欲了解編程接口上所呈現(xiàn)的類目和屬性的準(zhǔn)確名稱,參見 Audio Session Programming Guide 。)
表 31-1 音頻會(huì)話類目及其相關(guān)行為
類目 | 意義 | 靜音 | 混合 | 后臺(tái) |
---|---|---|---|---|
個(gè)人環(huán)境 | 聲音增強(qiáng)了應(yīng)用的功能且應(yīng)該靜音其他音頻 | 支持 | 不支持 | 不支持 |
環(huán)境 | 聲音增強(qiáng)了應(yīng)用的功能且應(yīng)該靜音其他音頻 | 支持 | 支持 | 不支持 |
播放 | 聲音對(duì)應(yīng)用來說很重要且可能與其他音頻混合 | 不支持 | 不支持 | 支持 |
錄音 | 音頻是用戶記錄的 | 不支持 | 不支持(默認(rèn))支持(當(dāng)“與其他音頻混合”屬性被添加時(shí)) | 支持 |
播放和錄音 | 聲音代表音頻輸入與輸出,可以按順序或同時(shí) | 不支持 | 不支持(默認(rèn))支持(當(dāng)“與其他音頻混合”屬性被添加時(shí)) | 支持 |
音頻處理 | 應(yīng)用執(zhí)行硬件輔助音頻編碼(不播放或錄音) | 不適用 | 不支持 | 支持 |
以下是一些示例情境,他們展示了如何選擇音頻會(huì)話類目以提供用戶喜歡的音頻體驗(yàn)。
情境1:一個(gè)幫助人們學(xué)習(xí)新語言的教育類應(yīng)用。你需要提供:
在這個(gè)應(yīng)用中,聲音對(duì)于主要功能是十分重要的。人們使用這個(gè)應(yīng)用來聽他們正在學(xué)習(xí)的語言中的單詞與短語,因此即使當(dāng)設(shè)備鎖定或者被調(diào)至靜音時(shí)也要能播放聲音。因?yàn)橛脩粜枰逦芈牭竭@些聲音,另外他們會(huì)期望其他他們可能播放的音頻此時(shí)都被靜音。
為了滿足用戶對(duì)于該應(yīng)用所期望的音頻體驗(yàn),你應(yīng)該使用播放 category 。雖然這一類目可以被定義為與其他音頻混合,但該應(yīng)用應(yīng)該使用默認(rèn)的行為以確保其他的音頻不會(huì)干擾那些用戶明確選擇聽到的教育性內(nèi)容。
場(chǎng)景2:網(wǎng)絡(luò)電話應(yīng)用。你需要提供:
在該應(yīng)用中,聲音對(duì)于主要功能是十分重要的。人們經(jīng)常會(huì)在使用另一個(gè)應(yīng)用時(shí)使用該應(yīng)用與他人進(jìn)行交流。 用戶期望能在他們將設(shè)備調(diào)至靜音或設(shè)備被鎖定時(shí)接聽到電話,并且他們希望在接聽電話期間其他音頻被靜音。 他們也希望應(yīng)用在后臺(tái)運(yùn)行時(shí)也能繼續(xù)打電話。
為了滿足用戶對(duì)于該應(yīng)用所期望的音頻體驗(yàn),你應(yīng)該使用播放和錄音 category ,并且你要確保只有在你需要時(shí)才會(huì)激活你的音頻會(huì)話,以便用戶可以在打電話過程中使用其他音頻。
場(chǎng)景3:允許用戶通過不同任務(wù)引導(dǎo)角色的游戲。你需要提供:
在該應(yīng)用中,音效會(huì)在很大程度上提升用戶體驗(yàn),但對(duì)于主任務(wù)并沒有那么重要。而且,用戶可能會(huì)希望能在玩游戲時(shí)靜音或聽到他們媒體庫中的歌曲而不是游戲配樂。
最好的策略是在你的應(yīng)用啟動(dòng)時(shí)確定用戶是否在收聽其他音頻。不要要求用戶選擇他們是要收聽其他音頻還是你游戲的音效。 相反,應(yīng)該使用音頻會(huì)話功能中的 AudioSessionGetProperty 來詢問 kAudioSessionProperty_OtherAudioIsPlaying 屬性的狀態(tài)。 依據(jù)所詢問的答案,你可以選擇環(huán)境或是個(gè)人環(huán)境 category (這兩種 category 允許用戶玩游戲時(shí)靜音):
情境4:一個(gè)為用戶到達(dá)目的地提供準(zhǔn)確、實(shí)時(shí)導(dǎo)航指示的應(yīng)用。你需要提供:
在該應(yīng)用中,無論應(yīng)用是否是在后臺(tái)運(yùn)行,語音導(dǎo)航指示都是主要任務(wù)?;谶@一原因,你最好使用播放 category ,它允許你在設(shè)備被鎖定、靜音或是在后臺(tái)運(yùn)行時(shí)你的音頻仍可以播放。
你可以通過添加 kAudioSessionProperty_OverrideCategoryMixWithOthers 屬性來實(shí)現(xiàn)人們?cè)谑褂媚愕膽?yīng)用時(shí)仍可以收聽其他音頻。 但是你也想要確保用戶在他們正在播放其他音頻時(shí)能聽到語音提示。你可以為音頻會(huì)話添加 kAudioSessionProperty_OtherMixableAudioShouldDuck 屬性來確保你的音頻比其他正在音頻的聲音更大,除了 iPhone 上的電話以外。這些設(shè)置允許應(yīng)用在后臺(tái)運(yùn)行時(shí)也可以恢復(fù)音頻會(huì)話,意味著可以確保用戶能獲得實(shí)時(shí)更新的導(dǎo)航。
情境5:一個(gè)允許用戶上傳文本和圖片到網(wǎng)站上的博客應(yīng)用。你需要提供:
在該應(yīng)用中,音效提升了用戶體驗(yàn),但也不是必需的。主任務(wù)與音效并沒有關(guān)系,用戶也不是必須要通過收聽聲音來使用應(yīng)用。 在這一情境中,你最好使用系統(tǒng)聲音服務(wù)來產(chǎn)生聲音。這是因?yàn)樵谠搼?yīng)用中所有聲音的音頻情境都應(yīng)符合本技術(shù)的目的,這意味著要遵循用戶意愿制造服從于設(shè)備鎖定和鈴聲/靜音(或靜音)開關(guān)的界面音效和警示音。
有時(shí)候,當(dāng)前播放的音頻會(huì)被來自于不同應(yīng)用的音頻所打斷。例如,在 iPhone 上,來電會(huì)持續(xù)中斷當(dāng)前應(yīng)用的音頻。 在多任務(wù)情境中,這種音頻中斷的頻率會(huì)很高。
為了提供用戶喜歡的音頻體驗(yàn),iOS系統(tǒng)需要你來:
每個(gè)應(yīng)用需要識(shí)別它可能引起中斷的音頻類型,但不是每個(gè)應(yīng)用都需要決定如何在音頻中斷結(jié)束后進(jìn)行響應(yīng)。 這是因?yàn)榇蠖鄶?shù)類型的應(yīng)用應(yīng)該在音頻中斷結(jié)束后恢復(fù)音頻。只有那些主要或部分的媒體播放應(yīng)用(即那些提供媒體播放控制的應(yīng)用),才必須才用額外的步驟來決定合適的響應(yīng)。
從概念上講,基于被中斷音頻的類型與中斷結(jié)束后用戶所期望的特定應(yīng)用的響應(yīng),有兩種類型的音頻中斷:
在可恢復(fù)性中斷結(jié)束后,顯示媒體播放控件的應(yīng)用應(yīng)該恢復(fù)它被中斷前的任務(wù),無論是正在播放音頻還是保持暫停。 沒有音頻播放控件的應(yīng)用則應(yīng)該恢復(fù)播放音頻。
例如,試想一下用戶在 iPhone 上使用應(yīng)用播放音樂時(shí),有電話在歌曲的中間插入的情形。用戶接起了電話,期望在他們通話時(shí)在后臺(tái)播放的應(yīng)用能靜音。 在通話結(jié)束后,用戶希望播放的應(yīng)用能自動(dòng)恢復(fù)播放歌曲,因?yàn)檎诓シ诺囊魳范请娫挷攀撬麄兊闹饕犛X體驗(yàn),并且他們?cè)陔娫捊尤肭耙矝]有暫停音樂。 另一方面,如果用戶在電話接入前暫停了音樂播放,他們將希望在電話結(jié)束后音樂仍保持暫停。其他能引起可恢復(fù)性中斷的應(yīng)用的例子包括那些具備鬧鐘、音頻提示(例如語音導(dǎo)航指示)或其他間歇性音頻功能的應(yīng)用。
在不可恢復(fù)中斷結(jié)束后,顯示媒體播放控件的應(yīng)用不應(yīng)該恢復(fù)播放那個(gè)音頻。而沒有媒體播放控件的應(yīng)用應(yīng)該恢復(fù)播放音頻。
例如,假設(shè)用戶正在收聽一個(gè)音樂播放應(yīng)用(音樂應(yīng)用1),此時(shí)另一個(gè)音樂播放應(yīng)用(音樂應(yīng)用2)打斷了它。此時(shí)用戶決定收聽音樂應(yīng)用2一段時(shí)間。 在退出音樂應(yīng)用2之后,用戶會(huì)不想要音樂應(yīng)用1自動(dòng)恢復(fù)播放,因?yàn)榇藭r(shí)他們主動(dòng)將音樂應(yīng)用2作為首要的聽覺體驗(yàn)。
下列準(zhǔn)則可以幫助你決定支持什么信息以及如何在音頻中斷之后繼續(xù):
確定你的應(yīng)用引起的音頻中斷的類型。在你的音頻結(jié)束時(shí),你可以通過以下兩種方式中的一種禁用你的音頻會(huì)話來實(shí)現(xiàn)這一功能:
倘若不這樣,標(biāo)識(shí)會(huì)在適宜的情況下允許iOS系統(tǒng)賦予被中斷的應(yīng)用自動(dòng)恢復(fù)播放它們的音頻的能力。
決定是否應(yīng)該在一個(gè)音頻中斷結(jié)束后恢復(fù)音頻。你應(yīng)依據(jù)你應(yīng)用中所提供的音頻用戶體驗(yàn)來做這一決斷。
如果你的應(yīng)用顯示用戶用于播放或暫停音頻的媒體播放控件,你需要在一個(gè)音頻中斷結(jié)束后檢查 AVAudioSessionInterruptionFlags_ShouldResume 標(biāo)識(shí), 如果你的應(yīng)用接收到應(yīng)該恢復(fù)標(biāo)識(shí),你的應(yīng)用應(yīng)該:
例如,游戲中的音效應(yīng)該在中斷后自動(dòng)恢復(fù)播放。
當(dāng)人們使用 iOS 媒體控制或輔助控制(如耳機(jī)線控)時(shí),應(yīng)用要能響應(yīng)遠(yuǎn)程控制事件。這需要允許你的應(yīng)用能接收來自于你的用戶界面之外的輸入,無論你的應(yīng)用當(dāng)前是在前臺(tái)還是后臺(tái)播放音頻。
應(yīng)用可以在播放進(jìn)行的同時(shí),通過后臺(tái)向支持 Airplay 的硬件(如 Apple TV )發(fā)送視頻。這樣的應(yīng)用可以接收通過遠(yuǎn)程控制事件產(chǎn)生的用戶輸入行為,據(jù)此用戶可以控制處于后臺(tái)運(yùn)行狀態(tài)的應(yīng)用中的視頻播放。 除此之外,這類的應(yīng)用程序也能在音頻會(huì)話被打斷而轉(zhuǎn)入后臺(tái)時(shí)重新將其激活。
一個(gè)媒體播放應(yīng)用,特別是它在后臺(tái)播放音頻或視頻時(shí),尤其需要合理響應(yīng)媒體遠(yuǎn)程控制事件。
當(dāng)你的應(yīng)用在后臺(tái)運(yùn)行時(shí),為了滿足與播放媒體特權(quán)相關(guān)的責(zé)任,要確保遵循以下這些原則:
限制你的應(yīng)用接收遠(yuǎn)程控制事件的次數(shù),確保只在必要時(shí)接收。例如,當(dāng)你的應(yīng)用幫助用戶閱讀內(nèi)容、搜索信息或是收聽音頻時(shí),它應(yīng)該只有在用戶處于音頻場(chǎng)景中時(shí)才接收遠(yuǎn)程控制事件。當(dāng)用戶脫離音頻情境時(shí),應(yīng)用應(yīng)該放棄接收遠(yuǎn)程控制事件的能力。 如果你的應(yīng)用允許用戶在支持 AirPlay 的設(shè)備上播放音頻或視頻,它應(yīng)該在媒體播放期間都可以接收遠(yuǎn)程控制事件。遵循這些原則會(huì)允許用戶在你的應(yīng)用中處于非媒體情境中時(shí),可以體驗(yàn)到不一樣的應(yīng)用媒體,并能用耳機(jī)控制它。
盡可能的使用系統(tǒng)原生的控件以提供 AirPlay 支持。當(dāng)你使用 MPMoviePlayerController 類以實(shí)現(xiàn) AirPlay 播放功能時(shí),你可以利用標(biāo)準(zhǔn)的控件來允許用戶選擇當(dāng)前范圍內(nèi)支持AirPlay的硬件。 或者你可以使用 MPVolumeView 類來顯示用戶可選擇的支持 AirPlay 的音頻或視頻設(shè)備。 因?yàn)橛脩袅?xí)慣于這些標(biāo)準(zhǔn)控件的外觀和行為,所以他們知道如何在你的應(yīng)用中使用它們。
不要改變事件的用途,即使這個(gè)事件在你的應(yīng)用中沒有意義。用戶期望 iOS 系統(tǒng)的所有應(yīng)用媒體控件和輔助控件能有功能上的統(tǒng)一。你不必實(shí)現(xiàn)你的應(yīng)用所不需要的那些事件,但你所實(shí)現(xiàn)的事件結(jié)果符合用戶的期望。 如果你重新定義一個(gè)事件的意義,你會(huì)使用戶困惑并冒險(xiǎn)使他們處于一個(gè)未知的狀態(tài),這時(shí)他們只能通過退出你的應(yīng)用來離開這種狀態(tài)。