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舶得,否則您就需要進一步研究耳機檢測和聲音路由切換的問題。