子目录中的资源文件被复制到 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 的根目录的主要内容,如果未能解决你的问题,请参考以下文章