自动将日期/时间和内部版本号添加到Info.plist Xcode

自动将日期/时间和内部版本号添加到Info.plist Xcode,xcode,bash,Xcode,Bash,我希望自动将构建日期和构建编号添加到我的Info.plist文件中,仅适用于我将应用程序归档到iOS的构建 我的剧本如下 这里的一切都很好,我在build phase选项卡中的target dependencies之后将此脚本作为构建阶段运行 我遇到的唯一问题是,该项目似乎是使用Info.plist的旧值而不是新值构建的 换句话说,如果我归档应用程序并检查结果ipa中的Info.plist文件,它们将反映旧值。但是,查看项目中的Info.plist可以看出,脚本确实正确执行了,但没有及时使用旧的

我希望自动将构建日期和构建编号添加到我的Info.plist文件中,仅适用于我将应用程序归档到iOS的构建

我的剧本如下 这里的一切都很好,我在build phase选项卡中的target dependencies之后将此脚本作为构建阶段运行

我遇到的唯一问题是,该项目似乎是使用Info.plist的旧值而不是新值构建的

换句话说,如果我归档应用程序并检查结果ipa中的Info.plist文件,它们将反映旧值。但是,查看项目中的Info.plist可以看出,脚本确实正确执行了,但没有及时使用旧的Info.plist构建项目

有什么解决办法吗


这似乎是一个相对容易解决的问题,但我感到惊讶的是,在本主题的文章中,没有多少人问过这个问题。

存档应用程序会生成应用程序,从而增加生成计数。您可以尝试在编译二进制文件之前执行该脚本(只需在构建阶段将运行脚本一直拖到最上面)。如果这不起作用,我敢肯定,如果您要构建归档,有条件地增加2是可能的。

结果证明,答案非常简单。所需的只是打开Info.plist预处理,然后使用
\uuuu TIMESTAMP\uuuu
预处理器指令。

问题是
Info.plist
文件是在运行任何其他文件之前处理的。通过检查构建日志,这涉及将其转换为二进制文件并将其放置在构建目录中

要解决此问题,版本控制脚本必须修改生成目录中的文件,而不是项目目录中的文件。构建目录中
Info.plist
的路径可以通过组合构建过程中设置的以下环境变量获得:

plistpath=${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}
如果您现在在
$plistpath
处修改文件,您将修改最终打包到最终应用程序中的plist


我使用这种技术将构建信息获取到发行版中,版本控制脚本作为第一个构建阶段运行。

一直向上拖动是行不通的。我不像构建编号那样担心,而是担心构建时间戳。我在应用程序中使用此号码在线检查更新。因此,假设我有一段时间没有更新应用程序,我做了很多更改,然后将其存档并准备提交更新。与Info.plist捆绑在一起的时间戳是上次构建应用程序时的时间戳,可能是几个月前。然后,当检查更新时,应用程序会认为它比实际情况旧得多。我需要一个解决方案,而不必手动设置每次生成的日期。我唯一能想到的另一个选择是在存档之前再生成一次。由于检查了发布配置,因此可以创建一个预发布配置,并将其添加到if语句中。复制调试配置,并称之为预发行版?是的,这样就可以了。我只是希望有一个更简单的解决方案,而不是那样的喜怒无常。这似乎是一个非常普遍的需求,但如果这是我唯一的选择,我会选择它。我肯定有。然而,我花了很多时间在网上试图找出类似的东西,但是没有太多关于这些东西的文档,所以只要这些东西有点自动化,我就很高兴。这里真正困扰我的是“有点”。记住构建两次听起来很容易,但这只是另一件不是自动化的事情。我的工作流程中的下一步是将IPA上传到服务器,在那里它会抓取刚刚写入的日期时间。在人们正在运行的应用程序中,它执行web请求,并将服务器上存储的日期时间与应用程序Info.plist中的日期时间进行比较。如果我记得第一次构建两次,但又忘记了另一次,那么整个工作流就会突然中断。我希望能有一个简单的解决方法。你介意分享一下你是如何做到这一点的吗?找不到有关此问题的任何可靠文档。在“生成设置”中,确保选中“全部”(非基本),然后搜索“preprocess info.plist文件”。默认设置为“否”。改为“是”。正如用户ecbtin所建议的,如果在plist的字符串字段中使用指令“TIMESTAMP”,它将映射到当前时间。您可以通过提供包含预处理器常数的头文件来获得cutesy-通过搜索“Info.plist preprocessor Prefix file”来设置该文件
plistpath=${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}