1. 推薦音頻流播放Framework
雙牌網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)公司自2013年起到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。
知名度比較高的Framework應該是github的 mattgallagher/AudioStreamer ,因為國內(nèi)有一些論壇和教程網(wǎng)的例子是用這個Framework寫的,而且有國人略微改進了一下這個Framework并加了中文注釋。不過這個Framework的缺點在于不支持ARC,并且狀態(tài)的改變通過notification來通知,并不是很靈活易用。
所以在這里推薦的是另一個Framework,同樣來自github(雖然以前是放在google code的)的tumtumtum/audjustable 。與上面的Framework相比較,支持了ARC,并且是使用delegate來發(fā)送狀態(tài)改變通知,比較符合我的習慣。也有播放隊列等高級功能,不過我沒有使用過這功能,所以就不做評論了。
具體的使用還是比較簡單的,看一看對應的示例工程就好了。
2. 后臺播放
首先需要引用系統(tǒng)Framework – AVFoundation,然后在AppDelegate的應用啟動事件里面添加以下代碼:
1 2 3 4 5 6 | AVAudioSession *session=[AVAudioSessionsharedInstance]; if([sessionsetCategory:AVAudioSessionCategoryPlaybackerror:nil]){ if([sessionsetActive:YESerror:nil]){ NSLog(@"后臺播放準備完畢"); } } |
當然這段代碼一般來說都會執(zhí)行成功的,所以可以去掉if直接寫成這樣:
1 2 3 | AVAudioSession *session=[AVAudioSessionsharedInstance]; [sessionsetCategory:AVAudioSessionCategoryPlaybackerror:nil] [sessionsetActive:YESerror:nil] |
AVAudioSessionCategoryPlayback是用來指定支持后臺播放的,相關(guān)的其它枚舉可以自行查閱Apple的開發(fā)文檔。
當然代碼添加完了之后并不是就已經(jīng)可以后臺播放了,還需要在info-plist文件里面注明我們的應用需要支持后臺運行。打開info-plist,添加Required background modes項,再把Item 0編輯成audio按回車,xCode會自動補全內(nèi)容:
這時候應用就可以在后臺播放音頻了。需要一提的是模擬器不支持后臺播放,所以需要拿真機來測試。另外,網(wǎng)絡(luò)歌曲的后臺播放很容易斷,這個目前我也沒有找到好的解決方案。
3. 遠程控制
支持后臺播放了之后,不回到應用里還是不可以對音頻的播放進行控制,而且耳機的按鈕功能也不管用,這個還是很不方便的。我們接下來需要做的就是向系統(tǒng)注冊遠程控制(Remote Control),在播放音頻的ViewController里添加以下代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | -(void)viewWillAppear:(BOOL)animated { [superviewWillAppear:animated]; [[UIApplicationsharedApplication]beginReceivingRemoteControlEvents]; [selfbecomeFirstResponder]; }
-(void)viewWillDisappear:(BOOL)animated { [superviewWillDisappear:animated]; [[UIApplicationsharedApplication]endReceivingRemoteControlEvents]; [selfresignFirstResponder]; }
-(BOOL)canBecomeFirstResponder { returnYES; } |
這樣就完成了注冊工作,需要控制生效的話還需要對不同的remote control事件進行響應,修改下面的代碼并添加到自己的工程里:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | -(void)remoteControlReceivedWithEvent:(UIEvent *)event { if(event.type==UIEventTypeRemoteControl){ switch(event.subtype){ caseUIEventSubtypeRemoteControlTogglePlayPause: [selfresumeOrPause];// 切換播放、暫停按鈕 break;
caseUIEventSubtypeRemoteControlPreviousTrack: [selfplayPrev];// 播放上一曲按鈕 break;
caseUIEventSubtypeRemoteControlNextTrack: [selfplayNext];// 播放下一曲按鈕 break;
default: break; } } } |
完成了這些之后,在多任務狀態(tài)欄里就可以看到我們的應用注冊成功了,這些按鈕和耳機按鈕也都可以正常使用。不過關(guān)于耳機的插拔事件,遠程控制是處理不了的,需要關(guān)注這個的請自行搜索相關(guān)教程。
4. 鎖屏封面
很多音樂app在鎖屏的時候可以顯示當前播放曲目的封面和一些信息,這個功能很實用。當然上面這個截圖里面展示的曲目標題也是要設(shè)置曲目信息之后才會顯示的。
設(shè)置曲目信息需要引用系統(tǒng)Framework – MediaPlayer先,然后在播放中的曲目信息改變時調(diào)用下面的方法:
1 2 3 4 5 6 7 8 9 10 11 12 | -(void)configPlayingInfo { if(NSClassFromString(@"MPNowPlayingInfoCenter")){ NSMutableDictionary *dict=[[NSMutableDictionaryalloc]init]; [dictsetObject:@"曲目標題"forKey:MPMediaItemPropertyTitle]; [dictsetObject:@"曲目藝術(shù)家"forKey:MPMediaItemPropertyArtist]; [dictsetObject:[[[MPMediaItemArtworkalloc]initWithImage:[UIImagep_w_picpathNamed:@"曲目封面.png"]]autorelease]forKey:MPMediaItemPropertyArtwork];
[[MPNowPlayingInfoCenterdefaultCenter]setNowPlayingInfo:nil]; [[MPNowPlayingInfoCenterdefaultCenter]setNowPlayingInfo:dict]; } } |
當然還有其它很多屬性可以設(shè)置,自己查看一下剩余的key就可以,設(shè)置完就可以在鎖屏界面看到你的曲目封面了。
至此,一個簡單的音樂播放類app就可以基本完成了,更多細節(jié)就需要你自己去修改了。