子目录中的资源文件被复制到 app bundle 的根目录

Posted

技术标签:

【中文标题】子目录中的资源文件被复制到 app bundle 的根目录【英文标题】:Resource files in subdirectory are copied to root directory of the app bundle 【发布时间】:2012-06-10 14:35:27 【问题描述】:

我不确定这是预期的还是错误的。 我正在尝试在磁盘中创建与 XCode 中相同的文件夹结构。我使用以下步骤将资源文件添加到我的项目中:

    在项目的根文件夹下创建Resources文件夹。 将Resources 文件夹拖到XCode 中,XCode 会为该文件夹创建一个Group。 将我的资源文件从Finder 拖到XCode 中的Resources 文件夹中。

现在我可以看到所有资源文件都列在Build Phrases->Copy Bundle Resources

奇怪的是[[NSBundle mainBundle] pathForResource:@"book" ofType:@"epub"]返回的是可以定位的文件路径,而[[NSBundle mainBundle] pathForResource:@"book" ofType:@"epub" inDirectory:@"Resources"]返回的是(null)

Build Results 窗口中,我注意到这一行:

CpResource MBookReader/Resources/book.epub /Users/neevek/Library/Developer/Xcode/DerivedData/workspace-fykuaikryknuhxgevcdtspkspptj/Build/Products/Debug-iphonesimulator/MBookReader.app/book.epub
cd /Users/neevek/workspace/xcode_projects/MBookReader
setenv PATH "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
builtin-copy -exclude .DS_Store -exclude CVS -exclude .svn -exclude .git -exclude .hg -resolve-src-symlinks -strip-tool /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/strip /Users/neevek/workspace/xcode_projects/MBookReader/MBookReader/Resources/book.epub /Users/neevek/Library/Developer/Xcode/DerivedData/workspace-fykuaikryknuhxgevcdtspkspptj/Build/Products/Debug-iphonesimulator/MBookReader.app

这表明Resources/book.epub文件确实被复制到MBookReader.app/(应用程序包的根目录)。

现在Resources是磁盘中的真实文件夹,为什么文件夹本身没有被复制?

PS。我正在使用 XCode 4.3.2。

【问题讨论】:

我在将“帮助手册”文件放入我的应用程序时遇到了同样的问题;它们需要位于 Resources 下的子目录中。 android 的答案也对我有用! 【参考方案1】:

将资源文件夹添加到 Xcode 时,在滑动窗口中选择“创建文件夹引用”而不是“为任何添加的文件夹创建组”。

也就是说,将问题中的 3 个步骤替换为以下步骤。

    在项目的根目录下创建一个Resources目录。在 Resources 目录中按您希望的方式组织您的目录结构。 将 Resources 目录拖到 XCode 并选择 Create folder references 选项。

你已经完成了。 Xcode 会递归地将你的 Resources 目录的内容复制到包中。

当 Xcode 没有将修改后的文件复制到 Resources 目录中的某个位置时,您可能会遇到麻烦。干净的构建通常可以解决此问题。或者,您可以在构建之前删除 .app 文件。这不会导致未修改的源文件重新生成,但会强制 Xcode 重新复制所有资源。

【讨论】:

不管是真实的目录还是只是一个参考,似乎所有的资源文件都会被复制到app bundle的根目录下,而不管它们在项目构建时所在的目录。 谢谢@android,今晚我会试用并给你反馈。 嗨@android,这不起作用,我按照你列出的步骤操作,当我尝试运行应用程序时,它挂在attaching to TestApp点,模拟器一直显示黑屏,应用程序将无法启动。 @Neevek 此问题与您如何将资源添加到应用程序包中无关。尝试在没有调试器的情况下启动应用程序。您还可以在不启动应用程序的情况下查看 Xcode 生成的 .app 文件,以检查包中的目录结构是否正确。 谢谢,为我工作(XCode 7.3.x)。但是,请注意 - 不要将目录命名为“资源”,否则您会遇到奇怪的问题,例如 Code sign error

以上是关于子目录中的资源文件被复制到 app bundle 的根目录的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 集成Bundle资源文件包

无法将目录从 Bundle 复制到库

NSBundle

使用 NSSavePanel 将文件从 Bundle 保存/复制到桌面

android中怎么获取指定目录下的文件夹

有没有办法在构建完成后将捆绑资源复制到应用程序文件夹?