在应用切到后台后,还想保持代码工作状态,有如下三种方案:
一、后台播放音频
后台播放一段无声音乐的方式,可使App处在后台也能持续接收消息。但是会受到电话、闹钟、其他音乐等中断性事件的打扰。通过AVAudioSession的category的不同设置,得到的效果如下:
1、只是PlayBack模式:一些情况的打扰(包括电话/闹铃/微信语音和视频通话)在开始打扰和打扰中止都会正常收到打扰通知(即AVAudioSessionInterruptionNotification),则可以处理自己音乐的停止和恢复播放;
但是其他音乐/视频App的打扰则不会收到打扰中止,也就是系统把咱们的App给停止了,去播放另一个音频了(某些情况下很快看完抖音,并杀死抖音,有时会恢复咱们的App音乐,这个我估计是系统选择通知)。所以,其他音乐/视频App播放就会影响本App,且不能恢复。
2、用Playback并且MixWithOthers模式:
现象:这种情况下,其他音乐/视频App音效都会与之共同播放;收到电话/闹铃都会收到通知,也可处理。有问题的是,微信的视频通话在不同iPhone下表现不同,iPhone8和iPhone11(均为iOS13.3)微信通话过程中,也会播放咱们的音乐(系统不会发出受打扰通知);但是iPhone6(iOS12.1.1)和iPhone11Pro(iOS13.3)在微信通话下不会播放咱们的音乐(受到打扰时,App受到打扰通知,但是结束时收不到微信打扰结束的通知)。
针对上述问题,在受到微信打扰通知时,切换category为PlayAndRecord,这样系统在暂停咱们mix音乐的时候,切换audio模式,然后在微信语音通话结束的时候就能收到打扰结束的通知了,也就可以继续在自己的代码里去恢复音乐播放并可以做其他事情了。
综上所述,使用第二种方案Playback
的MixWithOthers
则可更多情况的兼容,以恢复程序在后台对数据的接收。
二、定位
只要用户允许了定位,App便可以在后台一直接收到消息。而定位权限有如下两种:
1、使用App期间:用户选择了此模式,当程序在后台时,手机最上方的statusBar会一直显示蓝条。
2、始终:用户选择了此模式,当程序在后台时,手机statusBar会一直显示一个定位小箭头。
上述两种情况,都可以实现App保活,但前提如下代码是必要的:
self.locationManager.allowsBackgroundLocationUpdates = YES;//必要
self.locationManager.pausesLocationUpdatesAutomatically = NO;
三、录音
此方式在后台时,statusBar位置一直出现红条。
对于想了解远程推送唤醒App的,可参考我下一篇文章 iOS远程推送+激活App