ios - 版本与在 Xcode 中构建

标签 ios xcode

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

我的问题是:

  • version 和 build 字段之间有什么区别?
  • 为什么升级到 Xcode 4 后版本字段为空?
  • 最佳答案

    Apple 对这些领域进行了重新排列/重新利用。

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

    查看信息选项卡时,如果右键单击并选择 显示原始键/值 ,您会看到实际名称为 CFBundleShortVersionString (版本)和 CFBundleVersion ( build )。

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

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

    {MajorVersion}.{MinorVersion}.{Revision}

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

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

    许多开发人员从 0 开始构建编号,每次构建时都会将编号增加 1,并永远增加。在我的项目中,我有一个脚本,每次构建时都会自动增加构建号。请参阅下面的说明。
  • 版本 1.0.0 可能是 build 542。需要 542 个 build 才能达到
    1.0.0 版本。
  • 版本 1.0.1 可能是内部版本 578。
  • 1.1.0 版可能是内部版本 694。
  • 2.0.0 版可能是内部版本 949。

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

    如果你去 Xcode 菜单 > 关于 Xcode ,您将看到版本号和内部版本号。如果您点击 更多信息... 按钮,你会看到一堆不同的版本。自 更多信息... 按钮已在 Xcode 5 中删除,此信息也可从 获得软件 > 开发人员 的部分系统信息应用程序,打开即可获得 苹果 菜单 > 关于这台 Mac > 系统报告... .

    例如,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,还有一些可选的附加步骤。文件。

    这是从操作方法文章 here 扩展而来的.

    在 Xcode 4.2 - 5.0 中:
  • 加载您的 Xcode 项目。
  • 在左侧 Pane 中,单击层次结构最顶部的项目。这将加载项目设置编辑器。
  • 在中央窗口 Pane 的左侧,单击 下的您的应用程序目标标题。您需要为每个项目目标配置此设置。
  • 选择 构建阶段 标签。
  • 在 Xcode 4 中,单击右下角的 添加构建阶段 按钮并选择 添加运行脚本 .
  • 在 Xcode 5 中,选择 编辑菜单 > 添加构建阶段 > 添加运行脚本构建阶段 .
  • 拖放新 运行脚本 阶段将其移至 之前复制捆绑资源阶段(当 app-info.plist 文件将与您的应用程序捆绑在一起时)。
  • 中新运行脚本 相,集 shell 牌 :/bin/bash .
  • 将以下内容复制并粘贴到整数内部版本号的脚本区域中:
    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 ) 也可用。如果您更喜欢使用它,那么首先需要更改几件事情:
  • 选择 build设置 标签。
  • 版本控制 部分,设置 当前项目版本 到您要使用的初始版本号,例如 1 .
  • 回到 构建阶段 选项卡,拖放您的 运行脚本 相后复制捆绑资源阶段以避免在尝试构建和更新包含构建号的源文件时出现竞争条件。

  • 请注意,使用 agvtool方法您可能仍然会定期失败/取消构建而没有错误。出于这个原因,我不建议使用 agvtool用这个脚本。

    尽管如此,在您的 运行脚本 阶段,您可以使用以下脚本:
    "${DEVELOPER_BIN_DIR}/agvtool" next-version -all
    
    next-version参数增加内部版本号( bump 也是同一事物的别名),而 -all更新 Info.plist使用新的内部版本号。
  • 如果您有一个显示版本和构建的设置包,您可以将以下内容添加到脚本的末尾以更新版本和构建。注意:更改 PreferenceSpecifiers值以匹配您的设置。 PreferenceSpecifiers:2表示查看 PreferenceSpecifiers 下索引 2 处的项目数组在您的 plist 文件中,因此对于基于 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
    
  • 如果您有适用于 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
    
  • 关于ios - 版本与在 Xcode 中构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6851660/

    相关文章:

    iphone - 如何在 iPhone xcode 上检测 GPS 的开/关以及我们如何知道我们的应用程序不允许使用 GPS?

    ios - 无法将类型 '[String : AnyObject]?.Type'(又名“Optional<Dictionary<String, AnyObject>>.Type)的值转换为预期的参数类型

    xcode - 将 UITableView 名称保存到按钮操作的数组中

    iphone - Objective-C:用大量文本拆分类的方法

    iOS 模拟器在 Apple M1 上滚动太快

    iphone - 在堆叠 View 之间传递数据

    javascript - 不要在 iOS 上显示键盘

    objective-c - NSMutableString 和(字符)编码问题 : getting\U00fc in case of ü

    android - Android 和 iOS 应用程序是否可以显示完全相同的字体?

    ios - 如何停止对 ipad 的支持