小编典典

版本与 Xcode 中的构建

all

我有一个使用 Xcode 3 开发的应用程序,最近开始使用 Xcode 4 进行编辑。在目标摘要中,我有一个 iOS
应用程序目标表单,其中包含以下字段:标识符、版本、构建、设备和部署目标。版本字段为空白,构建字段为 3.4.0(与我仍在使用 Xcode 3
编辑时的应用程序版本相匹配)。

我的问题是:

  1. 版本和构建字段有什么区别?

  2. 为什么我升级到 Xcode 4 后版本字段为空白?


阅读 96

收藏
2022-03-03

共1个答案

小编典典

苹果对这些字段进行了重新排列/重新调整用途。

展望未来,如果您查看应用程序目标的信息选项卡,您应该使用“捆绑版本字符串,短”作为您的版本(例如,3.4.0)和“捆绑版本”作为您的构建(例如,500 或
1A500 )。如果你没有看到它们,你可以添加它们。这些将映射到“摘要”选项卡上的正确版本和构建文本框;它们是相同的值。

查看 Info 选项卡时,如果您右键单击并选择 Show Raw Keys/Values
,您将看到实际名称是CFBundleShortVersionString(Version) 和CFBundleVersion(Build)。

版本通常用于您在 Xcode 3 中使用它的方式。我不确定您在哪个级别询问版本/构建差异,所以我会从哲学上回答它。

有各种各样的方案,但一种流行的是:

{MajorVersion}.{MinorVersion}.{Revision}

  • 主要版本 - 主要更改、重新设计和功能更改
  • 次要版本 - 次要改进,增加了功能
  • 修订版 - 错误修复的补丁号

然后 Build 单独用于表示一个版本或整个产品生命周期的构建总数。

许多开发人员从 0 开始构建编号,每次构建时,他们都会将编号加一,永远增加。在我的项目中,我有一个脚本,每次构建时都会自动增加构建号。请参阅下面的说明。

  • 版本 1.0.0 可能是版本 542。需要 542 次版本才能获得 1.0.0 版本。
  • 版本 1.0.1 可能是内部版本 578。
  • 版本 1.1.0 可能是 build 694。
  • 版本 2.0.0 可能是内部版本 949。

包括 Apple 在内的其他开发人员的内部版本号由主要版本 + 次要版本 + 发布的内部版本数组成。这些是实际的软件版本号,而不是用于营销的值。

如果您转到 Xcode* 菜单 > About Xcode ,您将看到版本号和内部版本号。如果您点击 更多信息…
按钮,您会看到一堆不同的版本。由于在 Xcode 5 中删除了 More Info… 按钮,因此该信息也可从 System
Information应用程序的
Software > Developer部分获得,可通过打开 Apple 菜单 > About
This Mac
> System Report… 获得。
***

例如,Xcode 4.2 (4C139)。营销版本 4.2 是 Build 主要版本 4、Build 次要版本 C 和 Build 号
139。下一个版本(大概是 4.3)可能是 Build 版本 4D,并且 Build 号将从 0 开始并从那里递增。

iPhone 模拟器版本/内部版本号与 iPhone、Mac 等相同。

  • 3.2:(7W367a)
  • 4.0:(8A400)
  • 4.1:(8B117)
  • 4.2:(8C134)
  • 4.3:(8H7)

更新 :根据要求,以下是创建脚本的步骤,该脚本每次在 Xcode
中构建应用程序时都会运行,以读取内部版本号,增加它,并将其写回应用程序的{App}-Info.plist文件。如果您想将版本/内部版本号写入文件,还有可选的附加步骤Settings.bundle/Root*.plist

这是从这里的操作指南文章扩展而来的。

在 Xcode 4.2 - 5.0 中:

  1. 加载您的 Xcode 项目。
  2. 在左侧窗格中,单击层次结构最顶部的项目。这将加载项目设置编辑器。
  3. 在中央窗口窗格的左侧,单击 TARGETS 标题下的应用程序。您需要为每个项目目标配置此设置。
  4. 选择 构建阶段 选项卡。
    • 在 Xcode 4 中,在右下角,单击 Add Build Phase 按钮​​并选择 Add Run Script
    • 在 Xcode 5 中,选择 Editor menu > Add Build Phase > Add Run Script Build Phase
  5. 拖放新的 Run Script 阶段以将其移动到 Copy Bundle Resources 阶段之前(此时 app-info.plist 文件将与您的应用程序捆绑在一起)。
  6. 在新的 运行脚本 阶段,设置 Shell : /bin/bash
  7. 将以下内容复制并粘贴到整数内部版本号的脚本区域中:
    buildNumber=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE")
    

    buildNumber=$(($buildNumber + 1))
    /usr/libexec/PlistBuddy -c “Set :CFBundleVersion $buildNumber” “$INFOPLIST_FILE”

正如@Bdebeez 所指出的,Apple Generic Versioning
Tool

( agvtool) 也可用。如果您更喜欢使用它,那么首先要更改几件事:

* 选择 **构建设置** 选项卡。
* 在 **Versioning** 部分下,将 **Current Project Version** 设置为您要使用的初始内部版本号,例如 **1** 。
* 返回 **Build Phases选项卡,在** **Copy Bundle Resources** 阶段之后拖放 **Run Script** 阶段,以避免在尝试构建和更新包含您的内部版本号的源文件时出现争用情况。 ****

请注意,使用该agvtool方法,您可能仍然会定期获得失败/取消的构建而没有错误。因此,我不建议使用agvtool此脚本。

不过,在您的 运行脚本 阶段,您可以使用以下脚本:

    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all

next-version参数增加内部版本号(bump也是同一事物的别名),并使用新的内部版本号进行-all更新Info.plist

  1. 如果您有一个显示版本和构建的设置包,您可以将以下内容添加到脚本的末尾以更新版本和构建。 注意:更改PreferenceSpecifiers值以匹配您的设置。PreferenceSpecifiers:2表示查看 plist 文件中数组下索引 2 处的项目PreferenceSpecifiers,因此对于基于 0 的索引,这是数组中的第三个首选项设置。
    productVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$INFOPLIST_FILE")
    

    /usr/libexec/PlistBuddy -c “Set PreferenceSpecifiers:2:DefaultValue $buildNumber” Settings.bundle/Root.plist
    /usr/libexec/PlistBuddy -c “Set PreferenceSpecifiers:1:DefaultValue $productVersion” Settings.bundle/Root.plist

如果您使用agvtool而不是直接阅读Info.plist,则可以将以下内容添加到脚本中:

    buildNumber=$("${DEVELOPER_BIN_DIR}/agvtool" what-version -terse)
productVersion=$("${DEVELOPER_BIN_DIR}/agvtool" what-marketing-version -terse1)
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root.plist
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $productVersion" Settings.bundle/Root.plist
  1. 如果您有适用于 iPad 和 iPhone 的通用应用程序,那么您还可以设置 iPhone 文件的设置:
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:2:DefaultValue $buildNumber" Settings.bundle/Root~iphone.plist
    

    /usr/libexec/PlistBuddy -c “Set PreferenceSpecifiers:1:DefaultValue $productVersion” Settings.bundle/Root~iphone.plist

2022-03-03