infoDictionary 内部版本号未与 Plist 同步

Posted

技术标签:

【中文标题】infoDictionary 内部版本号未与 Plist 同步【英文标题】:infoDictionary Build Number Not Synchronized With Plist 【发布时间】:2010-11-10 14:54:20 【问题描述】:

我按照本指南在 XCode iPhone 项目 (guide) 中实现内部版本号。 我试过了,在 NSLogging 时我得到了错误的内部版本号。它没有正确更新,并且总是在 info.plist 后面一两个数字。我需要它是相同的数字。有人知道为什么会这样吗?

即 "[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBuildNumber"]" 与 plist 的 CFBuildNumber 不同。

脚本设置为先运行,然后再复制捆绑资源和所有内容。这是我得到的输出和 info.plist 数字:

应用程序版本:1.0 内部版本号:52 内部版本日期:2010 年 11 月 10 日星期三 15:10:05 CET (info.plist 是内部版本号:54 和日期:2010 年 11 月 10 日星期三 15:10:43 CET)

应用程序版本:1.0 内部版本号:54 内部版本日期:2010 年 11 月 10 日星期三 15:10:43 CET (info.plist 是内部版本号:55 和日期:2010 年 11 月 10 日星期三 15:12:54 CET)

应用程序版本:1.0 内部版本号:54 内部版本日期:2010 年 11 月 10 日星期三 15:10:43 CET (info.plist 是内部版本号:56 和日期:2010 年 11 月 10 日星期三 15:13:49 CET)

应用程序版本:1.0 内部版本号:56 内部版本日期:2010 年 11 月 10 日星期三 15:13:49 CET (info.plist 是内部版本号:57,日期:2010 年 11 月 10 日星期三 15:14:46 CET)

它似乎始终遵循这种模式。所以继续它会是 56 (real 58), 58 (real 59), 58 (real 60), 60 (real 61), 60 real (62), 62 (real 63) 等等。

脚本(设置为在其他所有内容之前运行)是:

#!/bin/bash
# Auto Increment Version Script
buildPlist="Project-Info.plist"
CFBuildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBuildNumber" $buildPlist)
CFBuildNumber=$(($CFBuildNumber + 1))
/usr/libexec/PlistBuddy -c "Set :CFBuildNumber $CFBuildNumber" $buildPlist
CFBuildDate=$(date)
/usr/libexec/PlistBuddy -c "Set :CFBuildDate $CFBuildDate" $buildPlist

【问题讨论】:

【参考方案1】:

因为项目的 Info.plist 在“运行脚本”阶段之前处理。请参阅 XCode 中的“构建结果”窗口。要解决此问题,您应该 1)创建类型为“仅运行脚本”的新目标并将其配置为更新版本号 2) 创建类型为“Aggregate”的新目标,并将“版本更新”目标和“您的产品”目标添加到其中。

因此,当您构建“聚合”目标时,第一步 - 将更新版本,第二步 - 您的产品。

【讨论】:

谢谢,但目标太多了。我试图指向我在复制捆绑阶段添加的另一个 plist 文件,并在我的运行脚本中添加了“touch -cm”以强制 Xcode 每次都复制该文件,但 Xcode 仍然没有一半时间复制该文件。 我最终使用了已经复制的 plist 文件 $TARGET_BUILD_DIR/$INFOPLIST_PATH,并在脚本运行之前放置了“复制捆绑资源”阶段。这样号码将始终同步。但是你把我带到了那里,所以我会给你道具。谢谢。 无需创建聚合目标。当您显示任何目标的信息时,您可以指定“直接依赖项”,并且您可以在其中包含任何其他目标,该目标会在所选目标之前自动运行。因此您只需要一个单独的 shell 脚本目标并包含该目标作为所有其他人的直接依赖项。 "1) 创建类型为“仅运行脚本”的新目标并将其配置为更新版本号“这是什么?我在 XCode 4 中看不到它。【参考方案2】:

我最终使用了已经复制的 plist 文件$TARGET_BUILD_DIR/$INFOPLIST_PATH,并在脚本运行之前放置了“复制捆绑资源”阶段。这样号码将始终同步。

【讨论】:

嗨@vakio — 根据您从这个问题中获得的经验,我想知道您是否对***.com/questions/69939617/… 有答案? @jeff-h 你好!抱歉,我只记得对此感到沮丧并摆弄它的试错风格,直到某些东西刚刚开始工作。我记得一开始它似乎总是正确地编辑文件,但由于某种原因,它后来被幽灵缓存版本覆盖了......

以上是关于infoDictionary 内部版本号未与 Plist 同步的主要内容,如果未能解决你的问题,请参考以下文章

“InfoDictionary 版本”在信息属性列表(plist 文件)中表示啥?

“InfoDictionary 版本”在信息属性列表(plist 文件)中表示啥?

Swift 5 中未更新应用程序版本和内部版本号

获取版本号

Main.bundle.infoDictionary 向我返回空字典

ios 获取app版本号