我可以以编程方式从Xcode“复制捆绑资源”列表中删除文件吗?从命令行工具?

时间:2016-03-09 21:53:27

标签: ios xcode build

背景:

由于客户端需要添加大量多媒体文件,我正在为客户构建的iOS应用程序变得越来越荒谬。 (视频,高分辨率图像和声音。)

应用程序从运行时读取的一组页面描述符文件中驱动它的UI。它使用这些页面描述符文件使用唯一ID从应用程序故事板加载场景,然后每个页面的视图控制器根据页面描述符确定要显示的多媒体内容。

我计划在页面描述符文件中添加一个download_from_server标志,告诉应用程序需要下载一个zip文件,其中包含该页面视图控制器的所有多媒体内容以及服务器中的所有子页面。在运行时,应用程序将看到标志,停止并要求用户点击“确定”开始下载内容,或单击“取消”返回上一页。如果他们单击“确定”,则应用程序将下载zip文件,将其解压缩到文档目录中,并为该页面保存持久的“多媒体内容已下载”标记。该应用程序将知道在文档目录和应用程序包中查找多媒体资产。

我将编写一个批处理工具来遍历文件描述符树。当它找到设置了download_from_server标志的描述符时,它将根据该页面的多媒体内容及其所有子页面构建一个zipfile。然后我会将所有这些zip文件上传到服务器。

我的问题:

我是否可以让我的批处理工具修改项目中正在上传到服务器的多媒体文件的Xcode设置,以便这些文件不再复制到应用程序包中,如果是这样,怎么办?我希望能够从“复制捆绑资源”构建阶段文件列表中删除这些条目。 (或者取消选中目标成员资格复选框,我相信它也会做同样的事情。)

我不熟悉makefile的复杂性和构建规则,所以我需要指导。

编辑:

似乎Xcode使用项目的project.pbxproj文件中的条目来跟踪在构建时将哪些文件复制到应用程序中。

当我从项目中复制project.pbxproj时,取消选中文件的“目标成员资格”复选框,并制作project.pbxproj文件的另一个副本,并对它们进行比较,发现2个差异。当有问题的文件选中“目标成员资格”复选框时,它会在project.pbxproj中的3个位置列出,如果未选中该复选框,则仅列在2个位置。

删除的2个条目是:

在文件顶部看起来像“对象”字典的条目,用注释行标记

/* Begin PBXBuildFile section */

在标有注释/ * Resources *的部分中,在包含键“files”的列表中,该部分似乎是一个文件ID数组(长十六进制字符串。)

是否选中了文件的目标成员资格复选框,它出现在另一个标有注释/* Begin PBXFileReference section */的文件ID数组中。

在我看来,我可以删除对象字典中的输入行以及参考资料部分中的文件ID数组。

任何人都可以通过编程方式修改Xcode项目的project.pbxproj文件以从Copy Bundle Resources构建阶段删除文件来安全有效地阅读此内容吗?

1 个答案:

答案 0 :(得分:2)

您可以使用名为xcodeproj的ruby gem来编辑项目设置,而不是手动编辑pbxproj文件。 (Cocoapods也使用它,因此创建pod目标并向其添加文件)。这将是一个很好的起点。

我不知道你对Ruby有多熟悉,但是值得查看Project类及其native_targets数组属性。您可以按名称找到所需的目标,并且可以通过resource_build_phase属性访问资源构建阶段。您可以编写这样的Ruby脚本(未完全检查):

project = Xcodeproj::Project.open('path to .xcodeproj')
target = project.native_targets
                 .select { |target| target.name == 'YourTargetName' }
                 .first

target.resource_build_phase.files.each do |f|
   f.remove_from_project
end

project.save