根据方案包含/排除资源

问题描述

| 我有一些仅能在模拟器上运行的大型资源,我希望这些资源自动从所有设备构建中排除。缺少复制资源的自定义生成脚本的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通信数据。这些数据绝不是核心应用程序的一部分,因此我不希望它与应用程序本身一起签入,或者默认情况下不属于项目的一部分。