【问题标题】:Can I programmatically remove files from the Xcode "copy Bundle resources" list? from a command line tool?我可以以编程方式从 Xcode“复制捆绑资源”列表中删除文件吗?从命令行工具?
【发布时间】:2017-09-01 21:30:42
【问题描述】:

背景:

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

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

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

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

我的问题:

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

我不是复杂的 makefile 和构建规则方面的专家,所以我需要指导。

编辑:

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

当我从一个项目复制project.pbxproj 时,取消选中文件的“目标成员资格”复选框,并复制project.pbxproj 文件,然后比较它们,我发现了两个不同之处。当相关文件的“目标成员资格”复选框被选中时,它会在project.pbxproj 中的 3 个位置列出,当未选中该复选框时,它只会在 2 个位置列出。

被删除的 2 个条目是:

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

/* Begin PBXBuildFile section */

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

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

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

阅读这篇文章的任何人都可以了解以编程方式修改 Xcode 项目的 project.pbxproj 文件以从 Copy Bundle Resources 构建阶段删除文件的安全性和有效性吗?

【问题讨论】:

    标签: ios xcode build


    【解决方案1】:

    您可以使用名为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      • 2015-05-06
      • 2018-09-30
      相关资源
      最近更新 更多