iOS8beta1下WebCore可能会打断音频播放
问题
前不久在QA发现一个问题,在iOS8 beta1上使用我们的app播放歌曲时进入某些内嵌的web页面(UIWebview实现)时歌曲会暂停播放,但是界面仍然显示为正在播放状态。把真机连上Xcode6调试后发现在进入部分网页时会再console上打印如下log:
AVAudioSession.mm:623: -[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.
bt后堆栈如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
发现是WebCore调用了AVAudioSession
的setActive方法,并且把active置为了NO。这个过程其实类似于音乐在播放时被其他事件打断(例如电话、siri)一样,audio会被打断,同时会发送kAudioSessionBeginInterruption
事件通知app音频播放已经被打断,需要修正播放器和UI状态;打断结束后回发送kAudioSessionEndInterruption
事件通知app恢复播放状态。区别在于WebCore的打断并没有任何通知,所以就导致界面上的播放状态为播放中而实际音乐却被打断。
适配
接下来就要对这个问题进行适配了:
- 首先,联系了前段组的同事对出现问题的页面进行检查,之后被告知是某个页面的js中调用了一些播放相关的代码导致了这个问题,这些js是之前版本中使用的,现在已经被废弃但没有及时的删除。在删除这些js后,问题自然就消失了。
- 客户端本身也应该做一些适配来防止下次再有页面出现类似问题,目前我能想到的办法是做一个
AVAudioSession
的category,method swizzle方法setActive:withOptions:error:
在设置active值时发送通知来修改UI的状态。