ios后臺播放-轉(zhuǎn)自code4

iOS 4開始引入的multitask讥巡,我們可以實現(xiàn)像ipod程序那樣在后臺播放音頻了午绳。如果音頻操作是用蘋果官方的AVFoundation.framework實現(xiàn)月而,像用AvAudioPlayer盔然,AvPlayer播放的話减牺,要實現(xiàn)完美的后臺音頻播放,依據(jù)app的功能需要苏潜,可能需要實現(xiàn)幾個關鍵的功能银萍。

首先,播放音頻之前先要設置AVAudioSession模式恤左,通常只用來播放的App可以設為AVAudioSessionCategoryPlayback即可贴唇。模式意義及其他模式請參考文檔。

[plain] view plaincopyprint?

AVAudioSession *session = [AVAudioSession sharedInstance];

[session setCategory:AVAudioSessionCategoryPlayback error:nil];

[session setActive:YES error:nil];

1飞袋。通知OS該app支持background audio戳气。缺省情況下,當按下home鍵時巧鸭,當前正在運行的程序被suspend瓶您,狀態(tài)從active變成in-active,也就是說如果正在播放音頻蹄皱,按下HOME后就會停止览闰。這里需要讓app在按在HOME后,轉(zhuǎn)到后臺運行而非被suspend巷折,解決辦法是在程序的-info.plist中增加required background modes這個key項压鉴,并選擇App plays audio這個value項。

2《途校現(xiàn)在按下HOME鍵后油吭,程序退到后臺,但是聲音仍在播放署拟。但是如果要實現(xiàn)播放列表的依次播放婉宰、循環(huán)播放,即放完一首后自動切換到下一首推穷,問題來了心包,當App在后臺放完一首后,就會停下來馒铃。原因是在后臺運行時蟹腾,一旦聲音停下來痕惋,程序也隨之suspend,因此在切換文件加載的間隙娃殖,程序就會被suspend值戳。曾經(jīng)有山寨的解決辦法是專門起一個player的實例連續(xù)不停的放同一無聲音片斷,阻止程序被suspend炉爆。這里提供的方法是通過申請后臺taskID達到后臺切換播放文件的功能堕虹。

即聲明后臺task id,并通過beginBackgroundTaskWithExpirationHandler將App設為后臺Task芬首,達到持續(xù)后臺運行的目的赴捞。我們知道一般情況下,按HOME將程序送到后臺衩辟,可以有5或10秒時間可以進行一些收尾工作螟炫,具體時間[[UIApplication sharedApplication] backgroundTimeRemaining]返回值波附。超時后app會被suspend艺晴,現(xiàn)在要做的就是用[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL]開始后臺任務,可以將后臺運行超時時間長時間的延長掸屡,具體延長多少時間還是見返回值封寞,總之對于放段時間音樂應該夠了。另一個問題是每個開始的后臺任務仅财,都必須用endBackgroundTask來結束狈究。 因此,在每次開始播放后啟動新的后臺任務盏求,同時結束上一個后臺任務:

首先抖锥,要在viewdidload中

[plain] view plaincopyprint?

[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

否則,無法切換到下一首碎罚,接下來

[plain] view plaincopyprint?

UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;

[avPlayer play];

newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:NULL];

if (newTaskId != UIBackgroundTaskInvalid && oldTaskId != UIBackgroundTaskInvalid) {

[[UIApplication sharedApplication] endBackgroundTask: oldTaskId];}

oldTaskId = newTaskId;

當然磅废,還有更方便的辦法就是在resignActive時beginBackgroundTaskWithExpirationHandler:并在BecomeActive中endBackgroundTask:

3。我們知道荆烈,ipod播放程序在后臺時拯勉,雙擊HOME鍵,會有個控制界面憔购,可以對它進行播放控制宫峦。

如果您想讓您的app可以像ipod一樣在后臺也可以方便的通過雙擊HOME鍵來控制,就要用到遠程控制事件了玫鸟。

首先在viewdidload等初始化的地方聲明App接收遠程控制事件导绷,并在相應地方結束聲明

[plain] view plaincopyprint?

- (void) viewWillAppear:(BOOL)animated

{

[super viewWillAppear:animated];

[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

[self becomeFirstResponder];

}

- (void) viewWillDisappear:(BOOL)animated

{

[super viewWillDisappear:animated];

[UIApplication sharedApplication] endReceivingRemoteControlEvents];

[self resignFirstResponder];

}

定義

[plain] view plaincopyprint?

- (BOOL)canBecomeFirstResponder

{

return YES;

}

最后定義 remoteControlReceivedWithEvent,處理具體的播放屎飘、暫停妥曲、前進账蓉、后退等具體事件

[plain] view plaincopyprint?

- (void) remoteControlReceivedWithEvent: (UIEvent *) receivedEvent {

if (receivedEvent.type == UIEventTypeRemoteControl) {

switch (receivedEvent.subtype) {

case UIEventSubtypeRemoteControlTogglePlayPause:

[self playButtonPressed:playButton];

[self testing];

break;

case UIEventSubtypeRemoteControlPreviousTrack:

[self rewButtonReleased:(UIButton *)rewButton];

break;

case UIEventSubtypeRemoteControlNextTrack:

[self ffwButtonReleased:(UIButton *)ffwButton];

break;

default:

break;

}

}

}

4. 至此,您有播放App已經(jīng)相當完美了逾一,還有最后一個問題铸本,那就是當用戶使用耳機時,問題又來了遵堵。系統(tǒng)默認當插入耳機時箱玷,正在播放的聲音不中斷,直接切換到耳機播放陌宿,而當拔出耳機時锡足,播放停止。如果這種行為滿足您的要求壳坪,那OK舶得,否則您就需要進一步研究耳機檢測和聲音路由切換的問題。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末爽蝴,一起剝皮案震驚了整個濱河市沐批,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝎亚,老刑警劉巖九孩,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異发框,居然都是意外死亡躺彬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門梅惯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宪拥,“玉大人,你說我怎么就攤上這事铣减∷” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵徙歼,是天一觀的道長犁河。 經(jīng)常有香客問我,道長魄梯,這世上最難降的妖魔是什么桨螺? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮酿秸,結果婚禮上灭翔,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好肝箱,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布哄褒。 她就那樣靜靜地躺著,像睡著了一般煌张。 火紅的嫁衣襯著肌膚如雪呐赡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天骏融,我揣著相機與錄音链嘀,去河邊找鬼。 笑死档玻,一個胖子當著我的面吹牛怀泊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播误趴,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼霹琼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凉当?” 一聲冷哼從身側(cè)響起枣申,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纤怒,沒想到半個月后糯而,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡泊窘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了像寒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片烘豹。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖诺祸,靈堂內(nèi)的尸體忽然破棺而出携悯,到底是詐尸還是另有隱情,我是刑警寧澤筷笨,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布憔鬼,位于F島的核電站,受9級特大地震影響胃夏,放射性物質(zhì)發(fā)生泄漏轴或。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一仰禀、第九天 我趴在偏房一處隱蔽的房頂上張望照雁。 院中可真熱鬧,春花似錦答恶、人聲如沸饺蚊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽污呼。三九已至裕坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間燕酷,已是汗流浹背碍庵。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悟狱,地道東北人静浴。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像挤渐,于是被迫代替她去往敵國和親苹享。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容