后台保活一直是iOS开发中的一个难点问题,前面有一篇文章专门详细的分析了https://heron-newland.github.io/tutorial/2020/08/23/iOS保活方案研究/以及各种方案的优劣点,本文主要根据开发经验,介绍一种比较靠谱的方案.
关键点
- 后台播放音乐一定需要申请后台任务, 即使app实现了后台常驻工功能.
/// 申请一段后台运行时间用于响铃激活
if ([UIApplication sharedApplication].applicationState == UIApplicationStateBackground) {
if (self.backgroundTaskIdentifier == UIBackgroundTaskInvalid) {
[self beginBackgroundTask];
}
}
- 申请后台任务是有时间限制的, 需要使用定时器去检测后台任务剩下的时间, 如果小于一定的值,那么需要重新去申请, 并且app在后台去申请后台任务会失败,最好在申请前播放一段无声音乐,然后去激活一下后台,然后再申请后台任务权限
-(void)checkBackgroundStatus{
if ([[UIApplication sharedApplication] backgroundTimeRemaining] < 61.0) {
NSError *error;
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&error];
if (error) {
NSLog(@"重复申请后台失败%@",error);
}
[self ringTheBell:0 once:true volumeMax:false mute:true];
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
}
}
- 后台音乐播放使用混合模式,这样能在其他音乐播放时,仍旧能播放后台音乐
1 |
|
- 检测是否耳机连接
1 |
|
完整的流程如下:
- 让app常驻后台(申请后台蓝牙连接实现常驻)
- 初始化一个定时器, 在app退到后台申请后台任务权限,并开启定时器
- 定时器去检查后台任务的剩余时长, 如果小于61秒,那么播放一段无声音乐,重新申请后台任务权限
- 执行后台任务(任意事件)
- 回到前台结束后台任务, 结束定时器
- 循环以上五个步骤
关键代码如下:
1 |
|