1. 推薦音頻流播放Framework
知名度比較高的Framework應該是github的 mattgallagher/AudioStreamer ,因爲國內有一些論壇和教程網的例子是用這個Framework寫的,而且有國人略微改進了一下這個Framework並加了中文註釋。不過這個Framework的缺點在於不支持ARC,並且狀態的改變通過notification來通知,並不是很靈活易用。
所以在這裏推薦的是另一個Framework,同樣來自github(雖然以前是放在google code的)的tumtumtum/audjustable 。與上面的Framework相比較,支持了ARC,並且是使用delegate來發送狀態改變通知,比較符合我的習慣。也有播放隊列等高級功能,不過我沒有使用過這功能,所以就不做評論了。
具體的使用還是比較簡單的,看一看對應的示例工程就好了。
2. 後臺播放
首先需要引用系統Framework – AVFoundation,然後在AppDelegate的應用啓動事件裏面添加以下代碼:
| AVAudioSession *session = [AVAudioSession sharedInstance]; if ([session setCategory:AVAudioSessionCategoryPlayback error:nil]) { if ([session setActive:YES error:nil]) { NSLog(@"後臺播放準備完畢"); } } |
當然這段代碼一般來說都會執行成功的,所以可以去掉if直接寫成這樣:
|
AVAudioSession
*session
=
[AVAudioSession
sharedInstance];
[session
setCategory:AVAudioSessionCategoryPlayback
error:nil]
[session
setActive:YES
error:nil]
|
AVAudioSessionCategoryPlayback是用來指定支持後臺播放的,相關的其它枚舉可以自行查閱Apple的開發文檔。
當然代碼添加完了之後並不是就已經可以後臺播放了,還需要在info-plist文件裏面註明我們的應用需要支持後臺運行。打開info-plist,添加Required background modes項,再把Item 0編輯成audio按回車,xCode會自動補全內容:
這時候應用就可以在後臺播放音頻了。需要一提的是模擬器不支持後臺播放,所以需要拿真機來測試。另外,網絡歌曲的後臺播放很容易斷,這個目前我也沒有找到好的解決方案。
3. 遠程控制
支持後臺播放了之後,不回到應用裏還是不可以對音頻的播放進行控制,而且耳機的按鈕功能也不管用,這個還是很不方便的。我們接下來需要做的就是向系統註冊遠程控制(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 { [super viewWillAppear:animated]; [[UIApplication sharedApplication] beginReceivingRemoteControlEvents]; [self becomeFirstResponder]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [[UIApplication sharedApplication] endReceivingRemoteControlEvents]; [self resignFirstResponder]; } - (BOOL)canBecomeFirstResponder { return YES; } |
這樣就完成了註冊工作,需要控制生效的話還需要對不同的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)
{
case
UIEventSubtypeRemoteControlTogglePlayPause:
[self
resumeOrPause];
//
切換播放、暫停按鈕
break;
case
UIEventSubtypeRemoteControlPreviousTrack:
[self
playPrev];
//
播放上一曲按鈕
break;
case
UIEventSubtypeRemoteControlNextTrack:
[self
playNext];
//
播放下一曲按鈕
break;
default:
break;
}
}
}
|
完成了這些之後,在多任務狀態欄裏就可以看到我們的應用註冊成功了,這些按鈕和耳機按鈕也都可以正常使用。不過關於耳機的插拔事件,遠程控制是處理不了的,需要關注這個的請自行搜索相關教程。
4. 鎖屏封面
很多音樂app在鎖屏的時候可以顯示當前播放曲目的封面和一些信息,這個功能很實用。當然上面這個截圖裏面展示的曲目標題也是要設置曲目信息之後纔會顯示的。
設置曲目信息需要引用系統Framework – MediaPlayer先,然後在播放中的曲目信息改變時調用下面的方法:
1
2
3
4
5
6
7
8
9
10
11
12
|
-
(void)configPlayingInfo
{
if
(NSClassFromString(@"MPNowPlayingInfoCenter"))
{
NSMutableDictionary
*
dict
=
[[NSMutableDictionary
alloc]
init];
[dict
setObject:@"曲目標題"
forKey:MPMediaItemPropertyTitle];
[dict
setObject:@"曲目藝術家"
forKey:MPMediaItemPropertyArtist];
[dict
setObject:[[[MPMediaItemArtwork
alloc]
initWithImage:[UIImage
imageNamed:@"曲目封面.png"]]
autorelease]
forKey:MPMediaItemPropertyArtwork];
[[MPNowPlayingInfoCenter
defaultCenter]
setNowPlayingInfo:nil];
[[MPNowPlayingInfoCenter
defaultCenter]
setNowPlayingInfo:dict];
}
}
|
當然還有其它很多屬性可以設置,自己查看一下剩餘的key就可以,設置完就可以在鎖屏界面看到你的曲目封面了。
至此,一個簡單的音樂播放類app就可以基本完成了,更多細節就需要你自己去修改了。