我应该使用什么值CFBundleVersion和CFBundleShortVersionString?

这是我的第一个iOS应用程序提交,我不希望我的应用程序被拒绝。

这是从苹果文件:

CFBundleVersion (String – iOS,OS X)指定包的版本号,它标识包的迭代(释放或未发布)。 构build版本号应该是一个由三个非负的,句点分隔的整数组成的string,第一个整数大于零。 该string应该只包含数字(0-9)和句点(。)字符。 前导零从每个整数中截断,将被忽略(即1.02.3相当于1.2.3)。 此密钥不可本地化。

CFBundleShortVersionString (String – iOS,OS X)指定包的发行版本号,它标识应用程序的已发布迭代。 发行版本号是由三个以句点分隔的整数组成的string。 第一个整数表示应用程序的主要修订,例如实现新function或重大更改的修订。 第二个整数表示实现不太突出的特性的修订。 第三个整数表示维护版本。

此键的值不同于“CFBundleVersion”的值,该值标识应用程序的迭代(释放或未释放)。 该密钥可以通过将其包含在InfoPlist.strings文件中进行本地化。

但似乎有点奇怪。 我对此的解释是把两个值相同,即:

CFBundleVersion: 1.0.0 CFBundleShortVersionString: 1.0.0 

有人可以确认100%是我应该放的吗?

这样想:“短版”( CFBundleShortVersionString )是公共版本号。 “版本”( CFBundleVersion )更像是一个内部版本号,比公开的“短版”更为频繁。 我个人使用相同的,但很多人更新每个版本的“版本”。 无论哪种方式,你通常更新“短版”,当你释放到苹果。 更新“版本”的频率取决于您和您的需求。

CFBundleShortVersionString为您提供您的应用程序的版本 。 通常,每次将应用程序发布到AppStore时,它都会增加。 这是在应用程序的AppStore页面的“版本”部分中可见的版本。

CFBundleVersion为您提供构build编号 ; 用于开发和testing,即“技术”用途。 这意味着,最终用户很less对构build编号感兴趣,但在开发过程中,您可能需要知道每个构build中正在开发和修复的内容。 通常,每增加一次alphatesting,它都会增加。 持续集成工具(如Jenkins)可以自动递增每个构build版本号的最后一位。

版本和内部版本号

这两个数字是相互独立的,但保持平行以避免混淆是一个好主意。 正如Phil和likeTheky曾经说过的那样,请记住,一旦您的应用程序通过AppStore评论,您需要增加内部版本号,无论是否发布。

比方说,你有一个testing良好的构build,准备AppStore。 版本号是1.0.0 ,版本号是1.0.0.32 。 提交应用程序后,您需要将版本更新为1.0.1,并将版本号更新为1.0.1.0

rmaddy的回答是正确的。 我会再添加两个想法。

第三版本号

请注意iTunesConnect网站上指定的第三个版本号,作为应用程序定义的一部分。 如果这个数字与Xcode中的数字不同,Apple会给你一个警告。 你可以忽略警告,因为它不是一个显示限制器(不是“错误”)。

date – 时间作为版本

另外,你不需要用三个数字来标点符号。 对于某些应用程序来说,这可能会感觉不到,传统上,第一个数字的变化表示某种通常会影响兼容性的戏剧性变化。

对于其他应用程序,您可能只需使用ISO 8601标准格式样式(YYYYMMDDHHMM)中的date时间值。 例如, 201606070620 。 该年份 – date – 小时 – 分钟的顺序呈现不断增加的数字,由于填充零,总是相同的长度,当按字母顺序sorting也是按时间顺序的。

我在iOS 7,8和9的iOS iOS应用程序中成功使用了这种风格的版本号。

你甚至可以自动生成这个值。 在您的项目的“ Target >“ Build Phases > Run Script面板中:

  1. Shell字段中指定: /bin/sh
  2. 粘贴下面的5行脚本。
  3. (可选)选中Show environment variables in build logcheckbox。
  4. Run script only when installingcheckboxRun script only when installing取消选中Run script only when installing

每次您执行构build时, UTC时区中的当前date时间都将被捕获。 脚本中的-u标志使用UTC而不是您当前的默认时区。 通常最适合程序员和系统pipe理员使用和思考UTC而不是本地时区。

 #!/bin/bash buildNumber=$(date -u "+%Y%m%d%H%M") /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString $buildNumber" "$INFOPLIST_FILE" # Version number /usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildNumber" "$INFOPLIST_FILE" # Build number echo "DateTime for app version number: $buildNumber" 

或者做一个混合版本,版本号为1.2.3 ,date时间为版本号。 要做混合,只需在前面注释掉CFBundleShortVersionString行。

我使用CFBundleVersion来指示CFBundleShortVersionString的内部构build。 我使用testing飞行为我的testing人员提交构build,所以他们之间的差异非常有用。

苹果文件说,CFBundleVersion“应该是一个由3个非负的,句点分隔的整数组成的string”,但实际上它可以超过3个部分(如上面的答案所示)。 我用它来表示我的开发版本,说我的CFBundleShortVersionString是1.0.0,我可以使用1.0.0.11 CFBundleVersion来表明这是我的第11版发布1.0.0

每个提交到app store的CFBundleVersion应该比以前更大,否则你将得到错误ITMS-90478 :“无效版本。由于新版本提交的更新版本已经closures,因此不能导入版本为”xxx“的版本。一个不同的版本号。“

CFBundleShortVersionString只能有3个部分,否则会得到ERROR ITMS-90060:Info.plist文件中的键CFBundleShortVersionString'xxx'的值必须是由三个非负整数组成的句点分隔列表。

Basil Bourque提到的第三个数字 ,即iTunesConnect上显示的版本号码可能会变得复杂。

我使用不同于CFBundleShortVersionString的 iTunesConnect编号,因为当我第一次将应用程序提交给应用程序商店时,我们已经有了很多内部版本。 所以我用1.0的iTunesConnect编号和5.x的CFBundleShortVersionString。 在app store的下一个版本中,我提供了一个函数来检查app store中是否有更新版本,并意识到我现在遇到了麻烦,因为我只能获得iTunesConnect号码(使用http://itunes.apple.com/lookup?bundleId= )所以我需要做一些计算才能比较它与CFBundleShortVersionString数字。

我试图通过使用iTunesConnect号码作为我的CFBundleShortVersionString来解决,但得到了错误, 错误ITMS-90062 :“此捆绑包无效。Info.plist文件中的关键CFBundleShortVersionString [xxx]的值必须包含比以前批准的版本[xxx]“。

所以我会build议让他们一样。

我从来没有见过的任何地方讨论CFBundleVersion中每个字段的最大数量是多less?

通过在应用程序中将CFBundleVersion设置为1.1.1并查看“lsregister -dump”中版本的hex值,我确定第一个字段的最大值是(2 ^ 22)-1或4194303,最大值第二和第三个字段的值是(2 ^ 21)-1或2097151。

这3个字段共计64位。

这对我们这些基于date和时间的CFBundleVersion有影响。

我将第一个字段设置为YYYYMMDD。 这总是大于最大允许的版本,这导致了不可预测的结果,至less可以说,当Launch Services决定在安装多个版本时运行哪个版本的应用程序,并使用类似于“open -a Appname '从命令行。

请广泛传播。 我相信很多人都会因此而脱臼。

最明智的scheme是使用版本号(即CFBundleShortVersionString )作为实际版本号,然后使用版本号(即CFBundleVersion )来表示提交给App Store。 所以,除非有任何问题,因此重新提交,这个数字总是1.对于新版本,如果以前在TestFlighttesting或审查中有问题,我会重置为1。

内部编号提供了一种方法来命名您为特定版本提交的每个提交内容。 如上面定义中所述,您为特定版本的应用程序提供的所有构build的集合称为该版本的“发行版本”。 对于iOS应用程序,内部版本号在每个发行版中必须是唯一的, 但是在不同的发行版中, 它们不需要是唯一的 [我强调]。 也就是说,对于iOS应用程序,如果需要,可以在不同的发行版中再次使用相同的内部版本号。

从技术说明TN2420:版本号和内部版本号 。