UIBackgroundModes 苹果官方文档翻译 + 大白话讲解

0 阅读5分钟

原文链接: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‑accessoryMFi 外设配件通信通过 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 后台录屏、投屏录屏类应用
voipVoIP 网络电话网络电话,后台监听来电(现在推荐 CallKit)Apple Deve...老 VoIP 方案,新版本尽量走 CallKit

文档说明:不要手动直接改 Info.plist 源码,优先在 Xcode → Signing & Capabilities 添加 Background Modes,勾选对应选项,Xcode 自动帮你写入 UIBackgroundModes 数组Apple Deve...。

二、怎么配置(两种方式)

方式 1:Xcode 图形界面(官方推荐,不容易写错)

  1. 选中项目 → Target → Signing & Capabilities
  2. 点 + Capability,搜索添加 Background Modes
  3. 在列表勾选你实际需要的功能,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...。

四、性能、电量、审核最佳实践(重点)

  1. 只勾选真正要用到的模式!多勾选没用的会直接拒审

App Store 审核规则 2.5.4:后台能力只能用于声明的业务,不能拿来做通用保活、埋点统计、广告刷新。

  1. 后台模式≠永久常驻后台 系统依然可以在电量低、内存紧张时挂起 / 杀掉 App;后台只是给你 “拿到后台运行资格”,不是无限时间。
  2. 电量优化建议
  • location定位:不用的时候立刻stopUpdatingLocation(),不要一直开着;优先用区域监听而不是持续高频定位。
  • audio:音频停止播放的时候,关闭 AVAudioSession,释放资源。
  • bluetooth:没有外设连接时关闭蓝牙管理器,不要持续扫描。
  1. 不要利用audio静音音频、location假定位来 “作弊保活”,这是苹果明确禁止,大量案例因此被拒审。
  2. 区分两套后台能力:
  • UIBackgroundModes:专门给音频、定位、蓝牙、VoIP 这类持续硬件业务;
  • BGTaskScheduler(iOS13+) :适合短时间数据同步、文件处理,不要用 UIBackgroundModes 去做普通网络同步。
  1. watchOS 不使用UIBackgroundModes,用WKBackgroundModes;macOS 没有这个能力Apple Deve...。

五、容易踩坑

  1. 只在 plist 写了配置,没有写对应框架代码,后台完全不生效,还会被拒。
  2. remote‑notification静默推送:必须服务端推送 payload 设置content‑available:1,普通通知不会唤醒。
  3. fetch 不是定时器:不要指望它每隔几分钟就跑一次,系统会合并调度,时机不可控。
  4. 后台模式只是获得运行机会,锁屏断网、低电量模式下,系统依然会限制你的后台执行