如何解决根据方案包含/排除资源
| 我有一些仅能在模拟器上运行的大型资源,我希望这些资源自动从所有设备构建中排除。缺少复制资源的自定义生成脚本的Xcode 4,有什么方法可以做到这一点?解决方法
我进入了运行脚本阶段,并具有以下内容:
if [ ${PLATFORM_NAME} != \"iphonesimulator\" ]; then
echo \"device build -- removing resources...\"
rm \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/test_a.mp3\"
rm \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/test_b.mp3\"
# reveal the binary in the Finder
/usr/bin/open --reveal \"${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}\"
else
echo \"simulator build...\"
fi
,目标决定了产品所包含的内容。复制您的目标并为其创建方案。修改该目标的成员身份。
,自定义构建脚本是您在Xcode中最好的朋友。让脚本在构建之后和代码签名之前删除资源。
,Art的答案效果很好。
我添加此替代答案是因为我有某些要求,并且找到了解决这些问题的解决方案。
就我而言,我需要一些大的资源仅用于某些测试版本,但我不希望它们包含在项目中或随项目一起检入。我还想避免Xcode在构建过程中无意义地将大文件从一个文件夹复制到另一个文件夹。
我的解决方案如下:
在Resources/
文件夹下的标题为FolderLinkedResources
的磁盘上创建一个新文件夹。
在Xcode项目中添加对此文件夹的文件夹引用。
这是指向硬盘上实际文件夹而不是项目文件夹组的链接。您可以通过“添加文件”对话框中的选项进行操作:
然后在构建时,我有一个自定义的构建阶段脚本(放置在编译之前),该脚本将所需的资源文件硬链接到磁盘上的引用文件夹中:
# COPY_SPECIAL_RESOURCES is only defined in schemas where I require the special resource(s).
# SpecialResources folder is a sibling folder alongside my entire Xcode project folder
if [ ${COPY_SPECIAL_RESOURCES} == \"1\" ]; then
ln ../SpecialResources/mySpecialResourceFile.bin Resources/FolderLinkedResources/
fi
现在,构建将包括您的特殊资源。
请注意,由于资源文件位于项目中的文件夹引用内,因此构建的应用程序实际上会将资源文件包含在文件夹中,而不是顶层。这意味着检索资源的常规调用将不起作用:
NSString *resourcePath = [[NSBundle mainBundle]
pathForResource:@\"mySpecialResourceFile\"
ofType:@\"bin\"];
要解决此问题,您还需要提供包含资源的文件夹名称:
NSString *resourcePath = [[NSBundle mainBundle]
pathForResource:@\"mySpecialResourceFile\"
ofType:@\"bin\"
inDirectory:@\"FolderLinkedResources\"];
注意:当您直到构建时才真正知道资源是什么时,此技术也很好用!只要您的脚本在文件中进行硬链接,它们就会进入构建。
出于整洁的考虑,我在编译后包含一个运行脚本构建阶段,该阶段清除了硬链接:
if [ ${COPY_SPECIAL_RESOURCES} == \"1\" ]; then
rm -rf Resources/FolderLinkedResources/*.*
fi
最后,如果有人对我的实际用例感兴趣:我已经预先记录了我的应用程序的某些离线测试版本的HTTP通信数据。这些数据绝不是核心应用程序的一部分,因此我不希望它与应用程序本身一起签入,或者默认情况下不属于项目的一部分。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。