Background Modes — 是一组可声明的iOS功能,允许应用程序在切换到后台模式后继续执行代码。每种模式对应特定类型的任务:音频、地理定位、VoIP、蓝牙、fetch和processing。根据Apple, 2026的数据,Background Modes的不当使用是App Store审核中应用被拒绝的常见原因之一。
要点
Background Modes — 是Xcode项目的capability,声明应用程序在后台执行特定类型操作的意图。与Android不同,在Android中应用可以在后台启动任何Service,而iOS要求在Info.plist中明确指定模式。每种模式都有严格的使用规则,并在Apple审核时进行检查。
当应用进入后台时,iOS会在3-5秒后将其挂起。如果应用声明了Background Mode并积极使用相应的API(例如用于音频的AVAudioSession),系统会将其切换到特殊的执行模式。应用保留在RAM中,并且可以执行受模式类型限制的代码。
iOS支持以下Background Modes:Audio、Location、VoIP、Bluetooth LE、Background Fetch、Background Processing、External Accessory Communication、Push to Talk(PTT)和HealthKit。每种模式需要在应用描述中提供理由。
| 模式 | Info.plist键 | 用途 | iOS版本 |
|---|---|---|---|
| Audio | audio | 后台音频、AirPlay | 4.0+ |
| Location | location | 位置跟踪 | 4.0+ |
| VoIP | voip | VoIP推送通知 | 4.0+ |
| BLE | bluetooth-central | 与BLE设备交互 | 7.0+ |
| Fetch | fetch | 定期数据下载 | 7.0+ |
| Processing | processing | 长时间后台任务 | 13.0+ |
| Push to Talk | push-to-talk | 语音Push to Talk | 16.0+ |
Audio Background Mode — 最常见的模式,由音乐播放器、播客应用和音频服务使用。应用可以继续播放声音,通过Control Center控制并在Lock Screen上显示。启用只需将AVAudioSession配置为.playback类别。
要在后台播放音频,需要配置AVAudioSession并激活它。.playback类别通知系统应用正在播放声音,并且应在后台保持活动状态。没有此配置,声音将在应用最小化后5-10秒内停止。
import AVFoundation
func configureAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(
.playback,
mode: .default,
options: []
)
try session.setActive(true)
} catch {
print("音频会话错误:\(error)")
}
}
要与Control Center和Lock Screen集成,需要配置MPRemoteCommandCenter。它处理Play、Pause、Next和Previous Track命令。还需要更新MPNowPlayingInfoProperty以显示元数据:歌曲标题、艺术家、封面和播放进度。
从iOS 14开始,音频Background Mode也支持视频的Picture in Picture。应用可以在最小化时在浮动窗口中继续显示视频。使用带有AVPlayerLayer的AVPictureInPictureController进行激活。该模式仅在应用播放音轨时工作。
Location Background Mode允许应用在后台接收地理定位更新。用于导航器、健身追踪器、配送应用和社交网络。没有此模式,应用在切换到后台时只接收一次位置,之后更新停止。
CLLocationManager支持多种跟踪策略:重大变化(significant-change location)、标准跟踪(standard location)和区域监控(region monitoring)。要在后台以最高精度工作,请使用allowsBackgroundLocationUpdates = true和pausesLocationUpdatesAutomatically = false。
在后台持续跟踪位置是最耗电的场景之一。iOS自动根据移动速度调整更新频率:步行时每10-30秒一次,驾车时每1-5秒一次。导航时使用desiredAccuracy = kCLLocationAccuracyBestForNavigation。
let locationManager = CLLocationManager()
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.activityType = .fitness
locationManager.startUpdatingLocation()
Significant-change location模式无需Location Background Mode即可工作——系统仅在坐标发生重大变化时(通常500米或更多)唤醒应用。不需要持续开启GPS,从而节省电池。适用于在用户移动时更新数据的天气应用。
Bluetooth LE Background Mode允许应用在后台与BLE设备交互。由健身手环、医疗传感器、Smart Home设备和Beacon导航使用。该模式分为两个子类型:bluetooth-central(应用连接到设备)和bluetooth-peripheral(应用充当设备)。
作为Central角色的应用可以在后台扫描并连接BLE设备。为此,需要在Background Modes中指定bluetooth-central,并使用CBCentralManager.scanForPeripherals方法,带CBCentralManagerScanOptionAllowDuplicatesKey选项。在后台,扫描以较低频率工作——系统可能会延迟检测以节省能源。
作为Peripheral角色的应用可以广播服务并响应其他设备的请求。蓝牙peripheral模式允许应用在后台保持对其他BLE设备可见。用于HealthKit应用和IoT解决方案。
iBeacon监控在后台无需额外权限即可工作——系统自行跟踪进入和离开Beacon区域。但扫描Beacon内容(proximity UUID、major、minor)需要蓝牙权限和bluetooth-central Background Mode。使用带CLBeaconRegion的CLLocationManager进行监控。
VoIP Background Mode适用于语音通信应用(Skype、Zoom、WhatsApp)。此模式允许应用保持与服务器的连接以接收入站呼叫。从iOS 8开始,VoIP使用PushKit——一个框架,用于处理来自VoIP服务器的推送通知,无需APNs参与。
PushKit是唯一保证将VoIP通知传送到设备的机制。收到PushKit通知后,系统会唤醒应用,即使应用已终止。应用必须在30秒内连接到服务器并显示有关入站呼叫的本地通知。
import PushKit
class VoIPHandler: NSObject, PKPushRegistryDelegate {
func pushRegistry(
_ registry: PKPushRegistry,
didReceiveIncomingPushWith payload: PKPushPayload,
for type: PKPushType,
completion: @escaping () -> Void
) {
let caller = payload.dictionaryPayload["caller"] as! String
reportIncomingCall(from: caller)
completion()
}
}
PushKit不能用于普通通知——只能用于VoIP、watchOS通信和文件提供商。Apple在审核时会检查这一点。不当使用时,应用会被拒绝。从iOS 13开始,PushKit仅传递通知——调用CXProvider(CallKit)以显示呼叫屏幕是强制性的。
Background Fetch和Background Processing——用于在后台更新内容和执行长时间任务的模式。Fetch——短期定期更新(最长30秒),Processing——带条件(Wi-Fi、充电)的长时间任务(最长10分钟)。Processing仅从iOS 13+开始可用。
Fetch模式允许系统定期唤醒应用以下载新内容。系统分析用户行为并选择最佳时间。应用必须在30秒内调用completion handler。Fetch适用于新闻应用、社交媒体信息流和天气。
BGProcessingTask用于无需用户参与即可执行的任务:清理缓存、同步大型数据库、处理媒体文件。系统仅在有利条件下执行任务——设备正在充电、连接到Wi-Fi、不在低功耗模式。最长可用10分钟。
对于BGProcessingTask,需要指定requiresExternalPower和requiresNetworkConnectivity。如果条件不满足,系统可能会无限期延迟执行。与必须每天至少执行一次的BGAppRefreshTask不同,如果设备很少充电,Processing可能数周不执行。
Apple在应用审核时严格检查Background Modes的使用。主要规则:每个启用的模式必须由应用的功能合理性证明。如果应用声明了Location Mode但未使用地理定位,将被要求删除capability并被拒绝。
最常见的违规:Location Mode没有明确需求(应用请求访问以显示广告)、Audio Mode在后台没有播放声音、VoIP没有PushKit、BLE Mode没有蓝牙设备。Apple甚至可以在更新阶段拒绝应用,如果该模式不再使用。
提交审核时,在Notes中提供每种模式的具体理由。例如,“Location Background Mode用于在健身功能中跟踪用户路线”。没有解释,审核者可能会拒绝应用。对于机密功能(VoIP),Apple可能会要求测试账户。
使用最小必要模式集。如果应用需要每小时在后台加载一次数据——不要启用Location Mode,使用Fetch或BGAppRefreshTask。多余的模式不仅会导致拒绝,还会产生负面影响:用户在设置中看到应用在后台使用地理定位。
常见问题
数量没有限制,但每种模式必须由应用功能合理性证明。不必要地启用所有模式是审核中拒绝的保证原因。实际限制是每个应用2-3个模式,否则用户将看到大量权限请求。
使用UIApplication.shared.applicationState——应用可以检查是否在后台(state == .background)。还可以跟踪UIApplication.didEnterBackgroundNotification和willEnterForegroundNotification通知以切换行为。
Audio——通过扬声器或耳机播放声音。AirPlay——将音频和视频传输到Apple TV和其他AirPlay设备。实际上,Audio Mode涵盖两种场景,因为AirPlay使用音频会话。从iOS 7+开始不需要单独的AirPlay模式。
可以,为此使用requestWhenInUseAuthorization()而不是requestAlwaysAuthorization()。应用只会在前台接收位置。如果需要在后台短期跟踪——调用startUpdatingLocation()并在willResignActive中停止。
每种模式都会增加能耗。Location Mode——消耗最大,持续跟踪可能将工作时间减少30-50%。Audio Mode——中等(15-20%)。Fetch和Processing——最小(2-5%)。BLE Mode——低(5-10%),得益于蓝牙LE的能效。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。