iOS 4 Background Audio

最近半个月一直在忙公司iPhone App修改和上架的事。改改bug调调UI那是每天的例行小事。最头疼的是将现在的基于iOS 3的app升级成基于iOS 4的版本。对,没错,我们希望我们的app能够在iPhone 4上全面支持multitasking,而对于一个音乐类app来说,也就是我们的app能够在后台播放,并且能够全面接管iPod app的控制钮和图标。就像Spotify和Pandora一样。
然而这真的是一件很让人头疼的事情。苹果的iOS 4官方文档在background有点语焉不详。按照官方文档( http://bit.ly/cIZBEO)的说法:
  • 首先,你得使用最新版的Xcode
  • 接着,打开使用旧版Xcode创建的工程文件,修改***info.plist文件,其实也就是告诉Xcode,“我这app呀,它打算支持后台音乐播放”
官方文档到这就差不多没了。按照这样的修改方法,我们试了试,还真行。唉呆会,不对,怎么放完了一首歌就自动停住了?
恩哪。还真会停住。具体情况是:
  • 如果音频操作是用苹果官方的AVFoundation.framework实现的话,每播放完一首歌曲,app就会自动被iOS给suspend 掉。这有一个山寨的解决办法:另init一个AVAudioPlayer的实例,从app启动开始,就不断重复播放一个无声的音频片段。这个方法能够保证 歌曲切换的间隙里app仍然有音频输出。而只要不断有音频输出,iOS就不会把你的app给suspend掉。真的很山寨,但如果你使用的就是 AVFoundation这个framework的话,这招对付旧版Xcode的代码真的很管用。
  • 如果你使用的是著名的开源的AudioStreamer的旧版代码。恩,这个这个,上述偷偷放歌的方法就不是很管用了。app启动以后就会自己 crash掉。可是,万幸的是,AudioStreamer最近刚刚推出了更新版,已经可以很好的支持iOS 4的后台播放功能了,看这里:http://github.com/DigitalDJ/AudioStreamer
恩到这里,后台不间断播放的问题就解决了。无论是播放本地音乐库(AVAudioPlayer or AudioStreamer),还是播放在线内容(AudioStreamer),我们都可以轻松的按下Home键然后边玩别的边听音乐了。然而这还不是 问题的全部,我们的app还没有顺利接管iOS 4快速切换菜单(Switching board)中的iPod导航钮。这个,下篇博文再说。

iOS 4 Background Audio 续

接上篇,同时勘一下上篇的误。
恩,先勘误:
  • Audiostreamer的更新版放弃了对iOS 3的支持。如果你将Audiostreamer搬进iOS 3的工程的话,会直接crash。沿着crash report找到崩溃的原因,恩, handlePropertyChangeForQueue 函数比之前的iOS 3版本多出了些iOS 4才有的东西。iOS 3到这里会挂掉。
  • 恩,不过我们可以修改一下这里的代码。执行 handlePropertyChangeForQueue 函数之前先做个判断。如果是老的iOS,我们就还是按老的代码来办。行,没问题,程序到这OK。不过还是有问题。Audiostreamer的网络链接部 分老是报错,无法从服务器端拿到数据。原因不明。
  • 接管iPod控制钮和实现后台播放,其实是一件事。这个,下面详细讲。
然后说说接管iPod控制钮的事。我们的最终花花肠子在此:
其实说简单很简单。可是苹果的文档啊,看的人头疼。
  • 首先,进 ***-info.plist 文件里,建立一个新的key,名叫 UIBackgroundModes ,在右侧 Value 栏,新增一个值, audio .
  • 然后找到工程里那个负责音频播放的类。
  • 依次重载这个类的 viewDidAppear 、 viewWillDisappear 、 canBecomeFirstResponder 、 remoteControlReceivedWithEvent 函数。这里贴一下 viewDidAppear 的代码:
假设你的网络链接模块正常的话,此刻,你的app应该已经完全接管iPod的控制钮了。 :-P