最近接到一个需求,需要做一个在后台播放视频的功能。折腾了一下,最后总算完成了。因此写一篇文章,介绍下具体的实现步骤,也说说自己遇到的坑,算是总结和记录。
前言
当 App 退到后台时,会进入 suspend 状态,若此时在播放视频,则会自动暂停。我们需要实现的效果是,当 App 退到后台时,视频中的声音还能继续播放。另外,我们还同时实现视频的连续播放功能,和在锁屏界面控制视频播放的功能。具体怎么做,下面听我一一道来。
注意:由于 iOS 模拟器存在 BUG,尤其是 iOS 11 的模拟器,不能在后台播放音频,因此以下功能最好使用真机测试。
一、后台播放音频
要实现后台播放视频功能,首先需要实现后台播放音频功能。实现后台播放音频很简单,只要简单配置一下就可以了。总共有三步:
1. 修改 Info.plist
在 Info.plist 中添加 Required background modes ,并在下面添加一项 App plays audio or streams audio/video using AirPlay 。如图所示:
2. 修改 Capabilities
在 Capabilities 中开启 Background Modes 。如图所示:
3. 修改 AppDelegate
在 AppDelegate 的 application: didFinishLaunchingWithOptions: 方法中,添加以下代码:
// 告诉app支持后台播放
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
[audioSession setCategory:AVAudioSessionCategoryPlayback error:nil];
[audioSession setActive:YES error:nil];
至此就实现了后台播放音频的功能,但这不是我们的最终目的,请继续往下看。
二、后台播放视频
网上讲实现后台播放视频的资料并不多(可能比较少有这么坑的需求)。我在网上找了一圈,只有 这篇文章 提到了,方法也很简单,分为两步:
1. 退到后台时移除 playerLayer 上的 player
在 viewController 中添加退到后台监听:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self
selector:@selector(removePlayerOnPlayerLayer)
name:UIApplicationDidEnterBackgroundNotification
object:nil];
移除 player :
- (void)removePlayerOnPlayerLa