View in English

  • 打开菜单 关闭菜单
  • Apple Developer
搜索
关闭搜索
  • Apple Developer
  • 新闻
  • 探索
  • 设计
  • 开发
  • 分发
  • 支持
  • 账户
在“”范围内搜索。

快捷链接

5 快捷链接

视频

打开菜单 关闭菜单
  • 专题
  • 相关主题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 概要
  • 转写文稿
  • 代码
  • 探索 Apple 托管的 Background Assets

    本次讲座将以 Background Assets 为基础,介绍用于为游戏和其他应用程序下载内容素材包的新功能。了解 Apple 如何为你托管这些素材包,或如何管理自托管选项。我们将深入探索原生 API 整合及相应的 App Store 实现,并为你提供工具来提升 App 的内容交付体验和用户体验。

    章节

    • 0:00 - 简介
    • 1:01 - Background Assets 新功能
    • 7:32 - 示例 App 开发
    • 17:24 - Beta 版测试与分发

    资源

    • Maximum build file sizes
    • Overview of Apple-hosted asset packs
    • Testing asset packs locally
      • 高清视频
      • 标清视频

    相关视频

    WWDC25

    • 借助 App Store Connect API 实现开发流程自动化
    • App Store Connect 的新功能

    WWDC23

    • Background Assets 的新动向
  • 搜索此视频…

    大家好 我叫 Gabriel 我是 App Store 团队的 一名软件工程师 我叫 Jenny 是 App Processing 团队的工程师 今天 我们将介绍一种 通过 Background Assets 在 App Store 上为 App 分发资源的新方式 我将讲解 App 与资源 在用户设备上的协同机制 以及如何利用 Apple 托管服务管理你的资源 本次讲座 会首先回顾现有资源分发技术 包括 Background Assets 接着重点介绍今年的更新 包括用于管理 Background Assets 的全新 Swift 与 Objective-C API 以及 Apple 托管服务

    我们将演示如何将这些新功能集成到 iOS、iPadOS、macOS、Apple tvOS 和 visionOS App 中 并完成本地测试

    如果你希望由 Apple 托管和分发资源 我们还将带你完成 Beta 版测试 和 App Store 分发的准备工作

    现在请 Gabriel 为大家回顾 Background Assets 及相关最新进展

    谢谢 Jenny 当用户从 App Store 下载 App 时 他们希望立即使用它 如果打开 App 后还需要 等待其他内容下载完成 用户可能会直接退出甚至删除 App

    通过 Background Assets 我们将帮助开发者更轻松地 打造出色的首次启动体验 你可以配置系统在设备上的 资源下载方式 且无需更新主 App 即可随时更新这些资源 例如 为刚下载游戏的新用户 优先提供教程关卡 让他们快速开始游玩 同时后台继续下载游戏剩余内容 提供可通过 App 内购买项目 解锁的 附加可下载内容 (DLC) 或通过加速提交流程 为设备端机器学习模型 推送更新至 App Store 假设你正在开发一款 包含多个关卡 包括教程关卡的游戏 对于每个关卡的资源交付 你有四种可选方案: 将所有资源打包在主 App 套装内、 使用 URLSession、 按需资源 或 Background Assets 这些方案各有优劣 我来逐一分析一下

    若将所有资源打包在主 App 套装内 即使用户只需要 其中一部分资源来启动教程关卡 也不得不等待全部资源下载完成 此外 大多数平台有 4GB 的体积限制 且更新单个资源时需重新上传 并重新提交整个 App 按需资源虽然能让用户 更快进入教程关卡 因为它允许将部分 App 套装与 TestFlight 或 App Store 分开下载 但若想更新某些资源文件 仍需重新提交整个 App 更新 按需资源是一项传统技术 即将被弃用

    取而代之的是 Background Assets 这个方案允许你将 App 资源 托管在自己的服务器上 无需更新整个 App 即可随时更新资源 Background Assets 的核心在于 下载器扩展 通过编写代码 你可以在用户打开 App 前 就调度资源下载任务 这在你需要完全掌控 下载行为及后续处理时非常理想 但我们深知 对大多数开发者而言 最关键的是确保 App 资源 随时可用且保持最新 借助全新的 托管式 Background Assets 系统将自动为你的资源包管理下载、 更新、压缩等全流程操作 事实上 我们已编写了一套 系统提供的下载器扩展 无需编写任何自定义代码 即可直接集成到 App 中 此外 针对 TestFlight 和 App Store 上架的应用 我们推出了 Apple 托管的 Background Assets 服务 选择这项服务后 你不再需要自行搭建资源服务器 Apple Developer Program 会员 已包含 200GB 的托管容量

    如果你仍在使用按需资源 我们建议你尽快迁移至 Background Assets 通过托管式 Background Assets 你可以将资源文件 如游戏教程关卡的 贴图、音效和图形处理器着色器等 分组打包成多个资源包 系统将根据下载策略 自动在用户设备上 下载这些资源包 目前提供三种下载策略: 必要资源、预载资源和按需资源 必要资源下载策略意味着系统会自动 下载资源包并将它整合到 安装流程中 资源包的下载进度会计入 用户在 App Store、TestFlight 或 主屏幕上看到的整体下载进度条 当安装完成且用户打开 App 时 资源包已准备就绪可供使用

    预载资源下载策略 是指系统在 App 安装期间 即开始下载资源包 但下载过程可能会 在 App 安装完成后 继续在后台进行 按需资源下载策略 则需要你显式调用 API 方法请求后 系统才会下载对应的资源包 你可以选择自行托管这些资源包 或者让 Apple 代你托管 现在请 Jenny 来介绍 Apple 服务器 如何交付资源包和 App 构建 没问题! 每个由 Apple 托管的资源包 均可用于单个 App 并支持你选择的多个平台 设备要下载 App 二进制文件 及它使用的资源包 你需要先将两者分别上传至 App Store Connect 然后你便可以提交这些文件以供审核 以便通过 TestFlight 进行外部测试 并提交 App Store 分发

    上传后 资源包会被分配一个版本号 且不与任何特定的 App 构建绑定 App 与资源包在设备上的匹配逻辑 取决于资源包版本的状态 下面我通过几个示例来说明

    假设某个资源包 存在三个不同版本 版本 1 已在 App Store 正式发布 版本 2 面向 TestFlight 外部 Beta 版发布 版本 3 则用于 TestFlight 内部 Beta 版 每个发布渠道同一时间 只能激活一个资源包版本 与此同时 你设备上的一些 App 版本 可能是通过 App Store 下载的 也可能是通过 TestFlight 外部 Beta 版或内部 Beta 版获取的 服务器会选择在这个特定情景下 为你的所有 App 版本 提供实时版本的资源包

    这意味着从 App Store 下载的 1.0 版本 (第 1 个构建) 将使用资源包版本 1

    TestFlight 外部 Beta 版测试中的 2.0 版本 (第 1 个构建) 将使用资源包版本 2 内部 Beta 版测试中的 2.0 版本 (第 2 个构建和第 3 个构建) 将使用资源包版本 3

    现在 关键是要理解 更新资源包版本时的 行为逻辑

    例如 如果你对资源包版本 2 满意 可将它提交至 App Store 分发 它将取代旧版本 并在 App Store 生效

    这意味着所有从 App Store 下载的 App 版本 包括用户设备上仍安装的旧版 都将自动切换使用 资源包版本 2 因此 在更新资源包前 请务必确保 它能兼容旧版 App 构建和版本 现在 我们来看一个 App 构建更新的示例 假设你要提交 2.0 版本的第 3 个构建 进行外部 Beta 版测试 通过审核后 如果这个构建是 通过外部 Beta 版下载的 它将使用较旧的资源包版本 2 若希望它搭配使用 较新的资源包版本 3 请务必同时提交这个新的资源包版本 现在你已经熟悉了资源包的概念 Gabriel 将为你演示如何创建资源包 并在 App 中使用 谢谢 Jenny 现在 由我来为大家展示如何在 App 中使用托管式 Background Assets

    要开始使用 托管式 Background Assets 你需要创建资源包、采用新的 API 并在本地测试 App 和资源包

    下面我将详细介绍如何创建资源包

    你可以使用全新的支持 macOS、 Linux 和 Windows 系统的打包工具 这个工具能从你的源代码仓库 获取文件 并将它们打包成压缩档案 以便分发至 TestFlight 和 App Store 在 macOS 系统中 这个打包工具 已随 Xcode 一同安装 而对于 Linux 和 Windows 用户很快 就能通过 Apple 开发者网站的 下载专区获取 现在 我将为你演示 这款工具的实际操作流程

    首先运行模板命令 来生成清单模板 在 macOS 上安装 Xcode 然后在终端 运行 xcrun ba-package template 若使用 Linux 或 Windows 系统 需 先将工具添加至 shell 的搜索路径 再运行 ba-package template 命令 打包工具将自动生成清单模板 这个清单是一个 JSON 文件 你需要填写相关内容以向 Apple 说明资源包的配置信息 你可以选择自定义 ID 这个 ID 将用于 在 App 代码中识别资源包、 设置下载策略 以及指定资源包支持的平台组合

    首先来填写文件选择器 文件选择器用于从你的源代码仓库中 选择一组文件包含在资源包中 文件选择器分为两种类型: 一种是选择单个文件的选择器 另一种是选择整个目录

    我们来为游戏的开场动画视频 添加一个文件选择器 使用相对于源代码仓库 根目录的相对路径

    这个资源包的 ID 是“Tutorial” 因为它包含游戏教程关卡的 资源文件 现在 我们来配置下载策略 由于教程是玩家最先体验的内容 我们需要让教程资源包 在玩家首次打开游戏前就已本地可用 因此 这种情况非常适合 使用必需资源下载策略

    这个教程关卡仅与 新安装游戏的玩家相关 对于已安装游戏和 只是更新到新版本的玩家 应该不需要重新下载教程

    因此 我们需要将必需资源下载策略 限制为仅首次安装时生效 排除后续更新情况 这意味着只有当玩家 首次在设备上下载游戏时 才会获取教程相关的资源包

    现在清单文件已填写完毕 我们再次运行打包工具 来生成压缩档案 我们将当前目录设置为 代码仓库的根目录 并传入清单文件路径 以及压缩档案的保存路径 现在资源包已打包完成 我们来看看如何在游戏中使用它

    只需几行代码 你就可以使用 Background Assets 中的新 API 来读取资源包中的文件 首先 我们需要在 Xcode 中 添加一个下载器扩展 这个下载器扩展能让你的 App 在主程序未运行时 例如在安装过程中 调度资源包的下载任务

    让我们添加一个新目标 选择 Background Download 模板

    在这里 你可以选择使用 Apple 的托管服务或自己的服务器

    模板默认生成 Swift 代码 但如果你愿意 也可轻松替换为 Objective-C 代码

    今年 系统现已提供一个 功能完备的下载器扩展 支持自动下载、后台更新等特性 你可以直接集成到 App 中 而无需编写任何自定义代码 Xcode 通过 Background Download 模板生成的代码片段 默认已配置为使用系统实现 这意味着你无需编写其他扩展代码

    实际上 如果你不需要自定义 下载行为 甚至可以完全移除 模板生成的 shouldDownload(_:) 方法存根 现在 你只需添加几行 Xcode 自动生成的代码 即可为 App 集成下载器扩展

    若需要自定义下载行为 你可以自行实现 shouldDownload(_:) 方法 系统会根据资源包的下载策略 在计划后台下载每个新资源包时 调用这个方法 你只需返回 一个布尔值来决定是否执行下载即可 当你的某些资源包 存在特定兼容性要求时 这一机制将非常实用 现在 你已实现下载器扩展 接下来了解一下如何在主 App 中 使用已下载资源包内的文件

    第一步是调用共享的 AssetPackManager 上的 ensureLocalAvailability(of:) 方法 这个方法会检查目标资源包 是否已下载 若未下载 则会启动下载流程 并等待完成 在大多数情况下 下载器扩展已预先完成资源包下载 因此这个方法会立即返回 若遇到需要重新下载资源包的 罕见情况 建议向用户显示可视化的 下载进度信息

    在 Swift 中 你可以通过 异步序列监听 statusUpdates(forAssetPackWithID:) 方法返回的状态更新

    而在 Objective-C 中 则需要创建一个遵循 BAManagedAssetPackDownloadDelegate 协议的对象 并将它赋值给 共享资源包管理器的 delegate 属性

    如需取消下载 只需对下载状态更新中 接收到的任意进度结构体 调用 cancel() 方法即可 当 ensureLocalAvailability(of:) 方法无异常返回时 即表示请求的资源包已就绪 可在本地直接使用

    要读取资源包中的文件 请调用共享资源包管理器的 contents(at:searchingInAssetPackWithID:options:) 方法 第一个参数是相对于 源代码库根目录的相对路径 即你先前运行打包工具 创建资源包时所在的目录 指向你要读取的文件 系统会自动将所有资源包 合并到一个共享命名空间中 实际上就像将你的源代码库 从开发机器复制粘贴到 用户设备上一样重建了它 这意味着当你需要 在运行时读取某个特定文件时 无需跟踪这个文件 位于哪个资源包中 默认情况下 contents(at:searchingInAssetPackWithID:options:) 方法会返回一个内存映射数据实例 这种设计即使对于占用大量内存的 大型资源文件也同样适用

    若你需要底层文件描述符访问权限 例如以过程式方式将文件读入内存 则可改用 descriptor(for:searchingInAssetPackWithID:) 方法 但需注意 使用完毕后 必须手动关闭文件描述符 你还可以通过为这两个方法的 assetPackID 参数指定非 nil 值 将搜索范围限定到特定资源包 系统会自动追踪 App 已下载的资源包 并在后台保持它们的更新状态 但需注意的是 只要 App 仍保留在设备上 系统不会自动删除任何资源包 因此 当确定不再需要 某个特定资源包时 最佳实践是 调用共享资源包管理器的 remove(assetPackID:) 方法 及时释放存储空间 例如 当玩家完成教程关卡后 你即可移除“Tutorial”资源包

    若玩家重置游戏进度并重新开始教程 随时可调用 ensureLocalAvailability(of:) 方法重新下载这个资源包

    请注意 用户可在 设备“Settings”App 的存储空间中 查看已下载资源包占用的存储空间 接下来 你需要将主 App 和下载器扩展添加到 同一个 App 组 系统会通过这个 App 组 协调主 App 与扩展之间的通信

    然后在主 App 的 Info.plist 中 添加 BAAppGroupID 键 将它的字符串值设为 App 组 ID

    同时添加 BAHasManagedAssetPacks 键并设置布尔值为 true 或 yes

    若使用 Apple 托管服务 请添加 BAUsesAppleHosting 键 并设置布尔值为 true 或 yes 如未采用 Apple 托管 请参阅本讲座“资源”部分的 相关文档 了解其他必备的 Info.plist 键 包括 BAManifestURL 的 配置说明 完成 App 与扩展配置后 现在可开始测试了

    我们全新推出了适用于 macOS、Linux 和 Windows 系统的 Background Assets 模拟服务器 方便你在提交 TestFlight 或 App Store 前测试资源包下载功能 与打包工具一样 这个模拟服务器 与 macOS 版 Xcode 捆绑发布 Linux/Windows 版本即将登陆 Apple 开发者网站 下载中心 Background Assets 采用 HTTPS 进行所有下载操作 因此你首先需要签发 SSL 证书 为此 你需要创建根证书颁发机构 在测试设备上安装 这个证书颁发机构 之后使用这个机构签发 SSL 证书 最后启动模拟服务器 并配置它使用 SSL 证书 更多细节请参阅本讲座 “资源”部分的相关文档 完成 SSL 证书签发后 你可以运行 ba-serve 命令 启动模拟服务器 传入要提供的资源包归档文件路径 并设置服务器绑定主机地址 主机地址可以是 IP 地址、 主机名或域名 在 macOS 上 工具会提示你选择身份凭证 即钥匙串中的证书与私钥对 在 Linux 或 Windows 平台 需通过命令行 传入证书及私钥路径 传递 help 参数可查看其他选项 包括设置自定义端口号 macOS 即将支持跳过身份凭证提示 在 iOS、iPadOS 和 visionOS 测试 设备上 (Apple tvOS 设备即将支持) 前往“开发者设置” “开发覆盖”选项 输入模拟服务器的基准 URL 含主机地址及端口 在 macOS 测试设备上 运行 xcrun ba-serve url-override 输入相同信息

    当你从 Xcode 构建并运行 App 时 App 将从你的模拟服务器下载资源包 现在请 Jenny 介绍资源包的 Beta 版测试 与分发流程 - Jenny? - 谢谢 Gabriel 既然你已准备好新版 App 二进制文件和资源包 接下来我将演示如何为 TestFlight Beta 版测试和 App Store 分发做准备

    若使用 Apple 托管服务 你需要将 App 二进制文件 与资源包分别上传 至 App Store Connect 可选择使用 TestFlight 进行测试 最终在 App Store 分发

    让我们深入了解一下 资源包的上传流程 有几种方法可以上传资源包:

    若通过拖拽式 UI 界面操作 可使用 macOS 系统的“Transporter”App

    若需完全掌控流程透明度 则可借助 App Store Connect REST API 构建自动化脚本 对于简化的命令行界面 跨平台的 iTMSTransporter 工具 能提供实用命令 并代你向 App Store Connect API 发起请求 你可以查阅所有这些工具的相关文档 接下来 我将为你演示如何使用 Transporter 和 App Store Connect API 使用“Transporter”App 只需将 Tutorial.aar 压缩包拖放至 Transporter 窗口

    选择目标 App 后点击“交付” 即可将它作为 Tutorial 资源包 的新版本上传

    你可以直接在 “Transporter”App 中 实时查看资源包的上传状态

    若需完全掌握上传流程的细节 则可使用 App Store Connect API 具体分为三个步骤: 创建资源包记录、 为资源包创建版本记录 然后将压缩包上传至资源包版本 首先 要创建资源包记录 你需要向 backgroundAssets 资源发起 POST 请求

    在请求体中 需在 assetPackIdentifier 字段 填入资源包名称 在关联关系部分 填入 App 的 Apple 账户 这个 API 调用将返回资源包的 UUID 供后续 API 调用使用

    接着 通过向 backgroundAssetVersions 资源 发起 POST 请求 来创建资源包新版本

    在关联关系部分 使用前一步 API 响应 提供的资源包 ID 系统会根据现有版本号 自动递增生成新版本号 此时我们将获得版本 1 API 响应中还会返回一个 ID 用于对应 Tutorial 资源包的版本 1

    当资源包版本创建成功后 你可以通过 backgroundAssetUploadFiles 资源 为 Tutorial.aar 压缩包文件 申请上传许可 这一步骤与其他上传操作 如 App Store 截屏上传类似

    需要提供资产类型、文件名、 文件大小、MD5 校验

    以及与 backgroundAsset 版本 ID 的关联关系 调用的响应包含上传文件的 ID、 以及详细的上传指引说明

    成功上传压缩包后 需向 backgroundAssetUploadFiles 发起 PATCH 请求 并附上你的上传文件 ID 系统随即开始处理资源包

    要查看资源包的处理进度 请随时登录 App Store Connect 查看可用资源包的完整信息 或调用 App Store Connect API 来获取

    在 App Store Connect 中 你可以在 TestFlight 标签页下 查看资源包的处理状态 当上传成功处理后 状态将变更为“可供内部测试” 这表示新版本已准备就绪 可用于你当前在 TestFlight 进行内部测试的 App 构建版本 你将收到一封电子邮件 通知你新的资源包版本已可用 你还可以设置 Web 挂钩 来获取这一通知

    想了解更多关于 Web 挂钩的 最新信息 欢迎观看 WWDC25 讲座 “借助 App Store Connect API 实现开发流程自动化”

    若资源包压缩文件在处理过程中 发现问题 版本状态将变更为 Failed 同时你也会收到通知 你可以针对问题进行修复 并重新上传 新版资源包 通过 App Store Connect API 你可以向多个资源发起 GET 请求 以查看 App 所有资源包的列表、 各资源包的版本记录 及每个版本对应的状态 可以通过 backgroundAssetVersions 资源实时追踪上传进度

    当资源包处理完成后 系统将生成 内部 Beta 版资源 资源包版本会显示为 READY_FOR_TESTING

    成功上传 App 二进制文件 及资源包后 即可在 TestFlight 中 开始 Beta 版测试

    在 App Store Connect 中 你可以看到当前 Tutorial 版本 1 已可供内部测试 若希望让更广泛的测试群体体验 你的 App 构建版本和资源包 你可以单独提交它们进行外部测试

    要提交资源包 点击具体的版本 选择“提交以供外部测试” 版本通过审核后 状态将变为 “可供外部测试” 同时你会收到通知

    通过 App Store Connect API 你还可以使用 betaBackgroundAssetReviewSubmissions 资源提交资源包版本

    可以使用外部 Beta 版资源 跟踪审核状态 当资源包版本准备好供外部测试时 系统会显示

    当测试完成后 若你准备将资源包版本 发布至 App Store 可将它提交至 App Review 在 App Store 分发

    你可以前往 App Store Connect 上 的“分发”选项卡查看资源包 现在 你可以单独提交 一个资源包版本 或与其他资源包、App 版本 或其他审核项目捆绑提交 若资源包版本与 App 版本同时提交 App Review 团队将使用 你选择的资源包版本 来审核你的 App

    要添加资源包以供审核 请单击“选择资源包”

    选择版本 然后添加至审核队列

    审核通过后 资源包版本状态将变为 “可供分发”

    通过 App Store Connect API 还可以使用 reviewSubmissions 资源提交审核

    在审核期间 你可以通过 App Store releases 资源 查看审核状态 当它准备好分发时 即表示用户 可从 App Store 下载新资源 今天我们的内容非常丰富! 我们讲解了资源包的概念、 如何创建资源包并在 App 中使用 以及如何上传并 提交至 Apple 托管服务 希望本次讲座能帮助你快速上手 全新的托管式 Background Assets

    现在轮到你动手实践了 请尝试使用打包工具 创建你的第一个资源包 如果你的 App 仍在使用按需资源 请评估如何迁移至 Background Assets 查阅相关文档 并在 App 中 适配全新的 Background Assets API 最后 我们期待你的反馈 欢迎通过“反馈助理” 告诉我们哪些功能运作良好 哪些仍需改进 你还可以观看“App Store Connect 的新功能”讲座 了解今年 App Store Connect 的 所有更新内容 此外 请观看 WWDC23 的 “App Store Connect 的新功能” 深入了解 Background Assets 的 现有功能 包括本地测试的实用技巧

    感谢参与期待收到你的宝贵意见

    • 8:26 - Fill out the manifest

      {
      	"assetPackID": "[Asset-Pack ID]",
      	"downloadPolicy": {
      		"essential": { // Possible keys: “essential”, “prefetch”, or “onDemand”
      			// Essential and prefetch download policies require a list of installation event types. For an on-demand download policy, the value for the “onDemand” key must be an empty object.
      			"installationEventTypes": [
      				// Remove undesired elements from this array.
      				"firstInstallation",
      				"subsequentUpdate"
      			]
      		}
      	},
      	"fileSelectors": [
      		// You can add as many file and/or directory selectors as you want.
      		{
      			"file": "[Path to File]"
      		},
      		{
      			"directory": "[Path to Directory]"
      		}
      	],
      	"platforms": [
      		// Remove undesired elements from this array.
      		"iOS",
      		"macOS",
      		"tvOS",
      		"visionOS"
      	]
      }
    • 10:44 - Add a downloader extension

      import BackgroundAssets
      import ExtensionFoundation
      import StoreKit
      
      @main
      struct DownloaderExtension: StoreDownloaderExtension {
      	
      	func shouldDownload(_ assetPack: AssetPack) -> Bool {
      		return true
      	}
      	
      }
    • 11:39 - Download an asset pack

      let assetPack = try await AssetPackManager.shared.assetPack(withID: "Tutorial")
      
      // Await status updates for progress information
      let statusUpdates = AssetPackManager.shared.statusUpdates(forAssetPackWithID: "Tutorial")
      Task {
      	for await statusUpdate in statusUpdates {
      		// …
        }
      }
      
      // Download the asset pack
      try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack)
    • 12:22 - Receive download status updates in Objective-C

      #import <BackgroundAssets/BackgroundAssets.h>
      
      @interface ManagedAssetPackDownloadDelegate : NSObject <BAManagedAssetPackDownloadDelegate>
      
      @end
      
      @implementation ManagedAssetPackDownloadDelegate
      
      - (void)downloadOfAssetPackBegan:(BAAssetPack *)assetPack { /* … */ }
      
      - (void)downloadOfAssetPackPaused:(BAAssetPack *)assetPack { /* … */ }
      
      - (void)downloadOfAssetPackFinished:(BAAssetPack *)assetPack { /* … */ }
      
      - (void)downloadOfAssetPack:(BAAssetPack *)assetPack hasProgress:(NSProgress *)progress { /* … */ }
      
      - (void)downloadOfAssetPack:(BAAssetPack *)assetPack failedWithError:(NSError *)error { /* … */ }
      
      @end
    • 12:29 - Attach the delegate in Objective-C

      static void attachDelegate(ManagedAssetPackDownloadDelegate *delegate) {
      	[[BAAssetPackManager sharedManager] setDelegate:delegate];
      }
    • 12:33 - Cancel an asset-pack download

      let statusUpdates = AssetPackManager.shared.statusUpdates(forAssetPackWithID: "Tutorial")
      for await statusUpdate in statusUpdates {
      	if case .downloading(_, let progress) = statusUpdate {
      		progress.cancel()
      	}
      }
    • 12:41 - Use an asset pack

      // Read a file into memory
      let videoData = try AssetPackManager.shared.contents(at: "Videos/Introduction.m4v")
      
      // Open a file descriptor
      let videoDescriptor = try AssetPackManager.shared.descriptor(for: "Videos/Introduction.m4v")
      defer {
      	do {
      		try videoDescriptor.close()
      	} catch {
      		// …
      	}
      }
    • 13:56 - Remove an asset pack

      // Remove the asset pack
      try await AssetPackManager.shared.remove(assetPackWithID: "Tutorial")
      
      // Redownload the asset pack
      let assetPack = try await AssetPackManager.shared.assetPack(withID: "Tutorial")
      try await AssetPackManager.shared.ensureLocalAvailability(of: assetPack)
    • 14:53 - Info.plist

      <key>BAAppGroupID</key>
      <string>group.com.naturelab.thecoast</string>
      <key>BAHasManagedAssetPacks</key>
      <true/>
      <key>BAUsesAppleHosting</key>
      <true/>
    • 0:00 - 简介
    • 了解后台素材 ・€・ 一种在 App Store 上分发 App 素材的新方式。回顾当前的素材交付技术,了解新的 Swift 和 Objective-C API,并学习如何在 iOS、iPadOS、macOS、Apple tvOS 和 visionOS 中集成这些功能。此外,还将讨论 Apple 素材托管,包括为 Beta 版测试和 App Store 分发做准备。

    • 1:01 - Background Assets 新功能
    • 后台素材让你能够将 App 素材与主 App 分开下载和更新,提升了 App 启动体验。这种方式使用户能够立即开始使用 App,同时附加内容会在后台进行下载。 素材包主要有三种下载策略:必备、预取和按需。你可以将素材包托管在自己的服务器上,也可以使用新的 Apple 托管后台素材服务,这项服务在 Apple Developer Program 会员资格中包含 200GB 的存储空间。 管理式后台素材取代了已弃用的按需资源技术。它提供了更出色的控制和灵活性,让你能够优化 App 性能和用户参与度。系统会自动管理下载、更新和压缩,使它易于实现。

    • 7:32 - 示例 App 开发
    • 要在 App 中使用管理式后台素材,必须使用适用于 macOS、Linux 和 Windows 的新打包工具创建素材包。这个工具会生成一个 JSON 清单文件,你可以在其中指定素材包的 ID、下载策略、支持的平台以及要通过文件选择器包含的文件。 你可以配置下载策略,确保必备素材在 App 启动前就已本地可用,并将下载限制为仅在首次安装时进行。清单填写完成后,打包工具会生成一个压缩归档文件。 要将素材包集成到 App 中,请在 Xcode 中添加下载器扩展,用于安排在后台下载素材包。系统提供了一个功能完备的下载器扩展,支持自动下载和更新。 在主 App 中使用 AssetPackManager 访问已下载的文件,确保本地可用性,并在必要时等待状态更新,从而通过优化的素材管理提供无缝用户体验。要使用 Background Assets 框架,必须将委托协议附加到共享素材包管理器的 delegate 属性。 下载状态更新会提供 progress 结构,必要时可用于取消下载。当 ensureLocalAvailability(of:) 方法无错误返回,表明素材包可供本地使用时,可使用 contents(at:searchingInAssetPackWithID:options:) 或 descriptor(for:searchingInAssetPackWithID:) 方法读取文件。 系统会自动管理素材包的更新和存储,但建议手动移除未使用的素材包以释放空间。 要实现主 App 与下载器扩展之间的协调,必须将它们添加到同一 App 组,并配置特定的 Info.plist 键。 测试时,系统提供了一个需要 SSL 证书的模拟服务器。你必须在测试设备的 Development Overrides 中输入模拟服务器的基准 URL。配置完成后,App 会在测试期间从模拟服务器下载素材包。

    • 17:24 - Beta 版测试与分发
    • 要为 App 的 TestFlight Beta 测试和 App Store 分发做准备,你必须将 App 二进制文件和素材包上传到 App Store Connect。 上传素材包可通过多种方法实现,包括提供拖放界面的 macOS 版“Transporter”App,或实现完全控制和自动化操作的 App Store Connect REST API。 使用 API 主要涉及三个步骤:创建素材包记录、创建版本记录,以及上传归档文件。素材包处理完成后,你可以提交以在 TestFlight 中进行内部或外部测试。 测试通过后,你可以将素材包版本提交至 App Review 团队,以便在 App Store 上分发。你可以通过 App Store Connect 或 API 监控上传、提交和审核的进度与状态。

Developer Footer

  • 视频
  • WWDC25
  • 探索 Apple 托管的 Background Assets
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载 (英文)
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    获取 Apple Developer App。
    版权所有 © 2025 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则