App Services 入门 1m
探索 Apple 托管的 Background Assets
Discover Apple-Hosted Background Assets
2025年6月9日
一句话判断
On-Demand Resources 要退役了,Background Assets 的 Managed 模式接管——Apple 帮你托管 200GB 的资源包,系统自动下载、更新、压缩,你甚至不需要写 downloader extension。
这场 Session 讲了什么
游戏和大型 app 的资源分发一直是痛点:全打进主包太大(还有 4GB 限制),On-Demand Resources 又要跟着 app 一起更新。Background Assets 的 Managed 模式解决了这些问题。
三种下载策略:
- Essential:集成到安装流程,用户下载 app 时资源包一起下好,贡献到 App Store 的下载进度条。可以限定只在首次安装时下载。
- Prefetch:安装期间开始下载,但安装完成后可能还在后台继续。
- On-demand:只有你调 API 请求时才下载。
Apple 托管 vs 自托管:
- Apple 托管免费提供 200GB 空间(Developer Program 会员即可)
- 不需要自己搭服务器
- 资源包和 app build 独立上传、独立审核、独立版本管理
- 资源包更新后,所有已安装的 app 版本都会自动切换到新版本
开发体验:
ba-package工具:打包资源为.aar压缩包ba-serve工具:本地 mock server 测试下载- 系统提供默认 downloader extension,不需要写任何代码
- AssetPackManager API:
ensureLocalAvailability()、contents(at:)、remove()
值得深挖的点
-
资源包和 app build 是独立版本化的。更新资源包不需要更新 app,但要注意向后兼容——当你发布新的资源包版本,所有 App Store 上的 app(包括旧版本)都会收到新资源包。
-
系统自动合并所有资源包的文件命名空间。你不需要关心哪个文件在哪个包里,直接用源码仓库的相对路径读取就行。系统会自动找到正确的资源包。
-
下载 progress 可观察。
statusUpdates(forAssetPackWithID:)返回异步序列,可以显示下载进度、支持取消。 -
测试流程需要 SSL 证书。本地 mock server 需要自签 SSL 证书,然后在测试设备的 Developer Settings 里配置 base URL。
代码片段
创建资源包 manifest:
{
"id": "Tutorial",
"downloadPolicy": {
"essential": {
"firstInstallOnly": true
}
},
"platforms": ["ios", "ipados"],
"fileSelectors": [
{ "file": "assets/tutorial/cutscene.mp4" },
{ "directory": "assets/tutorial/levels/" }
]
}
打包命令:
xcrun ba-package template # 生成 manifest 模板
xcrun ba-package create \
--manifest manifest.json \
--source-root . \
--output Tutorial.aar
在 app 里读取资源包文件:
// 确保资源包已下载
try await AssetPackManager.shared.ensureLocalAvailability(of: "Tutorial")
// 读取文件——用源码仓库的相对路径
let cutsceneData = try AssetPackManager.shared.contents(
at: "assets/tutorial/cutscene.mp4",
searchingInAssetPackWithID: nil // nil = 自动搜索所有包
)
// 用完后释放空间
try await AssetPackManager.shared.remove(assetPackWithID: "Tutorial")
系统默认 downloader extension(几乎零代码):
// Xcode 模板自动生成,使用系统实现
// 甚至可以删除 shouldDownload(_:) 方法
class DownloaderExtension: BMBackgroundDownloadExtension {
// 系统自动管理下载、更新、压缩
}
最佳实践
- 如果还在用 On-Demand Resources,立即开始迁移到 Background Assets。ODR 即将被废弃。
- Tutorial 关卡用 Essential + firstInstallOnly,新用户能立即开始玩,老用户不需要重复下载。
- DLC 用 On-demand,用户购买后再下载。
- 用 Apple 托管省事,200GB 免费,不需要搭服务器。上传用 Transporter app 或 App Store Connect API。
- 资源包更新前测试向后兼容性,因为旧版本 app 也会收到新资源包。
- 不需要的资源包及时 remove(),用户能在 Settings 里看到你的 app 占了多少空间。
- Info.plist 配置:
BAHasManagedAssetPacks = true,Apple 托管加BAUsesAppleHosting = true,主 app 和 extension 加同一个 App Group。
还有什么值得关注
- WWDC23 的 “What’s new in Background Assets” 补充了非 Managed 模式的用法(自托管场景)。
- App Store Connect API 支持自动化资源包上传、版本管理、审核提交。配合 webhook 做 CI/CD 很方便。
ba-package和ba-serve工具支持 macOS、Linux、Windows。- 机器学习模型更新是另一个典型用例——不需要重新提交 app 就能更新 on-device 模型。
应用服务 App Store, Distribution & Marketing 图形与游戏 系统服务