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

Dun*_*n C 4 xcode build ios

背景:

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

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

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

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

我的问题:

我可以让批处理工具修改项目中要上传到服务器的多媒体文件的Xcode设置,以便不再将这些文件复制到应用程序捆绑包中吗?我希望能够从“复制捆绑资源”构建阶段文件列表中删除这些条目。(或者取消选中“目标成员身份”复选框,我相信这也是一样。)

我对makefile和构建规则的复杂性不甚了解,因此需要指导。

编辑:

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

当我project.pbxproj从项目中复制时,取消选中文件的“目标成员身份”复选框,并复制该project.pbxproj文件的另一个副本,然后进行比较,发现有2个不同之处。选中有问题的文件的“目标成员身份”复选框后,该文件将列在中的3个位置中project.pbxproj;如果未选中此复选框,则将其仅显示在2个地方中。

被删除的2个条目是:

文件顶部看起来像“对象”字典的条目,带有注释行

/* Begin PBXBuildFile section */
Run Code Online (Sandbox Code Playgroud)

在带有注释/ *资源*的部分中,在键为“文件”的列表中,该文件似乎是文件ID的数组(十六进制长字符串)。

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

在我看来,我可以删除“资源”部分中的对象字典和文件ID数组中的输入行。

谁能读懂有关通过编程修改Xcode项目的project.pbxproj文件从Copy Bundle Resources构建阶段删除文件的安全性和有效性的信息?

Pet*_*e24 5

您可以使用名为xcodeproj的红宝石来编辑项目设置,而不是手动编辑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
Run Code Online (Sandbox Code Playgroud)