PAYATHON 2026

如何在 Xcode 26 中将整个文件夹加入 app bundle?

数据阿明

在 Xcode 26 中,选中已加入项目的文件夹,在右侧 File Inspector 将 Build Rules 设为 Apply Once to Folder,再通过 Target Membership 将文件夹关联到应用 target,让构建系统按整个文件夹处理资源。

为什么原来的操作方式不容易找到?

文件夹出现在 Project navigator 中,并不代表它已经按完整目录参与资源打包。还需要确认它的构建处理方式和所属的 target。

如果 Build Rules 当前为 Apply to Each File,构建系统会逐个处理其中的文件。需要整体复制目录时,应改为 Apply Once to Folder。Godot 官方文档中的 Xcode 文件夹资源配置也列出了这一选项和 Target Membership 设置。配置示例

如何配置整个文件夹?

  1. 将需要打包的文件夹从 Finder 拖入 Xcode 的 Project navigator。
  2. 如果添加对话框中有分组方式选项,选择 Create folders。文件是复制到项目目录还是保留在原位置,可按项目需要选择。
  3. 在 Project navigator 中选中文件夹本身,打开右侧的 File Inspector。
  4. 找到 Build Rules,设置为 Apply Once to Folder。
  5. 在 Target Membership 中添加或选中实际需要这些资源的应用 target。
  6. 重新构建应用,检查生成的 .app 中是否包含该文件夹及其内容。

资源复制到哪里取决于 bundle 的平台结构。Apple 文档说明,Copy Bundle Resources 会把资源放入 bundle 指定的资源目录;“加入 app bundle”不等于将文件嵌入可执行二进制。Apple 构建阶段说明

如何读取文件夹中的资源?

假设打包后的资源目录中包含 Templates/config.json,可以指定子目录来查找:

import Foundation

if let url = Bundle.main.url(
    forResource: "config",
    withExtension: "json",
    subdirectory: "Templates"
) {
    do {
        let data = try Data(contentsOf: url)
        print("Loaded \(data.count) bytes")
    } catch {
        print("Failed to read resource: \(error)")
    }
} else {
    print("Resource not found: Templates/config.json")
}

Templates 是相对于 bundle 资源目录的子目录名称。使用 Bundle API 可以避免手动拼接不同平台的 .app 内部路径。Apple Bundle API

设置后仍然找不到文件,检查什么?

  • 确认选中的是需要打包的文件夹,并且 Build Rules 已设为 Apply Once to Folder。
  • 确认 Target Membership 对应当前正在构建的应用 target。
  • 检查构建产物中的实际目录结构。如果文件存在但位置不符,先调整文件夹的打包方式,再核对读取路径。
  • 核对文件名、扩展名和目录名的大小写。Bundle 查找资源时区分大小写。Apple 资源查找说明

备注:内容仅供参考。