Discover Apple-Hosted Background Assets
App Services 入门 1m

探索 Apple 托管的 Background Assets

Discover Apple-Hosted Background Assets

2025年6月9日

在 Apple 官方观看视频

一句话判断

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()

值得深挖的点

  1. 资源包和 app build 是独立版本化的。更新资源包不需要更新 app,但要注意向后兼容——当你发布新的资源包版本,所有 App Store 上的 app(包括旧版本)都会收到新资源包。

  2. 系统自动合并所有资源包的文件命名空间。你不需要关心哪个文件在哪个包里,直接用源码仓库的相对路径读取就行。系统会自动找到正确的资源包。

  3. 下载 progress 可观察statusUpdates(forAssetPackWithID:) 返回异步序列,可以显示下载进度、支持取消。

  4. 测试流程需要 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-packageba-serve 工具支持 macOS、Linux、Windows。
  • 机器学习模型更新是另一个典型用例——不需要重新提交 app 就能更新 on-device 模型。
应用服务 App Store, Distribution & Marketing 图形与游戏 系统服务