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就可以基本完成了,更多细节就需要你自己去修改了。