原文链接:developer.apple.com/documentati…‑Property‑List/UIBackgroundModesApple Deve...
UIBackgroundModes:Info.plist 的配置键,用来告诉系统:我的 App 需要在后台跑哪些业务。 支持:iOS4.0+、iPadOS4.0+、visionOS1.0+、watchOS4.0+ plist 里显示名字:Required background modes(所需后台模式) 数据类型:字符串数组,可以同时开启多个后台模式Apple Deve...。
大白话:iOS App 退到后台锁屏后,默认很快就会被系统挂起(休眠,代码不再跑)。如果你要锁屏之后还能干活,就必须在这里声明你要干什么;只声明还不够,业务代码也要对应实现,否则不会生效,还会被 App Store 拒审Apple Deve...。
一、全部可选值 + 使用场景(大白话)
表格
| 字符串值 | 中文通俗含义 | 什么业务才用这个 | 重要提醒 |
|---|---|---|---|
audio | 后台音频 | 音乐播放器、播客、录音、语音通话;锁屏继续播放声音Apple Deve... | ❌禁止拿静音音频用来保活干别的,会拒审!只有真播放音频才允许Apple Deve... |
bluetooth‑central | 蓝牙中心模式 | App 去连接蓝牙外设(手环、体重秤),锁屏也接收蓝牙数据Apple Deve... | 需要蓝牙权限描述,不能为了保活乱开 |
bluetooth‑peripheral | 蓝牙外设模式 | 手机本身当做蓝牙外设,别的设备连我的手机 | 耗电高,需要用户授权 |
external‑accessory | MFi 外设配件通信 | 通过 Lightning/USB 连接苹果认证硬件设备,后台收发数据腾讯云 | 仅限 MFi 认证硬件 |
fetch | 后台主动拉取数据 | 系统空闲的时候,定期唤醒 App 拉取新内容(比如新闻刷新) | 系统完全控制时机,不能控制多久唤醒一次,不是定时任务;iOS13 后推荐用 BGTaskScheduler 替代 |
location | 后台定位 | 导航、运动轨迹记录,锁屏持续拿 GPS 位置Apple Deve... | 必须申请Always始终定位权限,非常耗电 |
nearby‑interaction | 近场交互 | 使用 NearbyInteraction 框架做设备距离探测 | AR / 设备近距离交互场景 |
network‑authentication | 网络认证 | 后台处理网络证书、WiFi 认证登录 | 极少用 |
newsstand‑content | 报刊杂志下载 | 已经废弃,旧报刊 App 后台下载期刊 | 新项目不要用 |
processing | 后台长时间处理任务 | 后台做长时间运算:视频转码、大批量同步数据Apple Deve... | iOS13+,配合 BGTaskScheduler,有时间上限 |
push‑to‑talk | 一键对讲 | 对讲机类 App,后台对讲语音 | 专门对讲业务 |
remote‑notification | 远程推送唤醒 | 收到 APNs 推送的时候,后台唤醒 App 处理数据(静默推送) | 不是展示通知,是收到推送后后台跑代码;普通弹窗通知不需要这个 |
screen‑capture | 屏幕录制 | App 后台录屏、投屏 | 录屏类应用 |
voip | VoIP 网络电话 | 网络电话,后台监听来电(现在推荐 CallKit)Apple Deve... | 老 VoIP 方案,新版本尽量走 CallKit |
文档说明:不要手动直接改 Info.plist 源码,优先在 Xcode → Signing & Capabilities 添加 Background Modes,勾选对应选项,Xcode 自动帮你写入 UIBackgroundModes 数组Apple Deve...。
二、怎么配置(两种方式)
方式 1:Xcode 图形界面(官方推荐,不容易写错)
- 选中项目 → Target → Signing & Capabilities
- 点
+ Capability,搜索添加 Background Modes - 在列表勾选你实际需要的功能,Xcode 自动写入 Info.plist 的
UIBackgroundModes数组Apple Deve...。
方式 2:直接编辑 Info.plist 源码
<key>UIBackgroundModes</key>
<array>
<string>audio</string>
<string>location</string>
</array>
不建议手动手写,容易格式错误;提交审核 plist 原始 key 就是
UIBackgroundModes,可视化显示叫Required background modesApple Deve...。
三、简单代码示例(几个高频场景)
⚠️只配置 plist 后台模式,不写业务代码,完全不会生效! 配置只是告诉系统 “我有权限做这件事”,真正干活还需要对应框架代码。
1️⃣ audio 后台音频
import AVFoundation
func configAudioSession() {
let session = AVAudioSession.sharedInstance()
do {
try session.setCategory(.playback, mode: .default)
try session.setActive(true)
} catch {
print("音频会话失败:(error)")
}
}
要点:必须激活 AVAudioSession;不能播放无声音频用来保活跑网络 / 定位,审核直接拒绝Apple Deve...。
2️⃣ location 后台定位
import CoreLocation
let manager = CLLocationManager()
func configLocation() {
manager.requestAlwaysAuthorization() // 必须申请始终定位权限
manager.allowsBackgroundLocationUpdates = true // 允许后台更新位置
manager.startUpdatingLocation()
}
3️⃣ fetch 后台拉取(旧 API,不推荐新项目)
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
// 后台被唤醒,拉取网络数据
fetchNewData { success in
if success {
completionHandler(.newData)
}else{
completionHandler(.noData)
}
}
}
注意:fetch 时机完全由系统根据用户使用习惯调度,不能设置固定间隔,iOS13 以后优先用
BGTaskScheduler后台任务框架Apple Deve...。
四、性能、电量、审核最佳实践(重点)
- 只勾选真正要用到的模式!多勾选没用的会直接拒审
App Store 审核规则 2.5.4:后台能力只能用于声明的业务,不能拿来做通用保活、埋点统计、广告刷新。
- 后台模式≠永久常驻后台 系统依然可以在电量低、内存紧张时挂起 / 杀掉 App;后台只是给你 “拿到后台运行资格”,不是无限时间。
- 电量优化建议
location定位:不用的时候立刻stopUpdatingLocation(),不要一直开着;优先用区域监听而不是持续高频定位。audio:音频停止播放的时候,关闭 AVAudioSession,释放资源。bluetooth:没有外设连接时关闭蓝牙管理器,不要持续扫描。
- 不要利用
audio静音音频、location假定位来 “作弊保活”,这是苹果明确禁止,大量案例因此被拒审。 - 区分两套后台能力:
- UIBackgroundModes:专门给音频、定位、蓝牙、VoIP 这类持续硬件业务;
- BGTaskScheduler(iOS13+) :适合短时间数据同步、文件处理,不要用 UIBackgroundModes 去做普通网络同步。
- watchOS 不使用
UIBackgroundModes,用WKBackgroundModes;macOS 没有这个能力Apple Deve...。
五、容易踩坑
- 只在 plist 写了配置,没有写对应框架代码,后台完全不生效,还会被拒。
remote‑notification静默推送:必须服务端推送 payload 设置content‑available:1,普通通知不会唤醒。- fetch 不是定时器:不要指望它每隔几分钟就跑一次,系统会合并调度,时机不可控。
- 后台模式只是获得运行机会,锁屏断网、低电量模式下,系统依然会限制你的后台执行