版本vs构建在Xcode中

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

我的问题是:

  • 版本和生成字段有什么区别?

  • 为什么升级到Xcode 4后版本字段为空?


  • 苹果种类重新排列/重新使用的领域。

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

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

    该版本通常用于您似乎已经使用它与Xcode 3.我不知道你在问什么级别的版本/建设差异,所以我会回答它的哲学。

    有各种各样的计划,但受欢迎的计划是:

    {MajorVersion}。{MinorVersion}。{}修订

  • 主要版本 - 主要更改,重新设计和功能更改
  • 次要版本 - 次要改进,功能增加
  • 修订版 - 修补程序的修补程序编号
  • 然后,构建单独用于指示版本或整个产品生命周期的构建总数。

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

  • 版本1.0.0可能构建542.它需要542个版本才能达到1.0.0版本。
  • 版本1.0.1可能构建为578。
  • 版本1.1.0可能建立694。
  • 版本2.0.0可能构建949。
  • 包括Apple在内的其他开发人员的内部版本号由主要版本+次要版本+版本号构成。 这些是实际的软件版本号,而不是用于市场营销的值。

    如果您转到Xcode菜单> 关于Xcode ,您会看到版本和内部版本号。 如果你点击更多信息...按钮,你会看到一堆不同的版本。 由于在Xcode 5中删除了更多信息...按钮,因此也可以从系统信息应用程序的软件>开发人员部分获取该信息,该信息通过打开Apple菜单> 关于本机 > 系统报告...提供

    例如,Xcode 4.2(4C139)。 市场营销版本4.2是Build主要版本4,构建次要版本C和内部版本号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文件,则还有可选的附加步骤。

    这是从这篇how-to文章扩展而来的。

    在Xcode 4.2 - 5.0中:

  • 加载你的Xcode项目。
  • 在左侧窗格中,单击层次结构顶部的项目。 这将加载项目设置编辑器。
  • 在中心窗格的左侧,在TARGETS标题下单击您的应用程序。 您需要为每个项目目标配置此设置。
  • 选择Build Phases选项卡。
  • 在Xcode 4的右下角,点击Add Build Phase按钮并选择Add Run Script
  • 在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通用版本工具( agvtool )也可用。 如果您更喜欢使用它,那么首先需要改变一些事情:

  • 选择Build Settings选项卡。
  • 在“ 版本控制”部分下,将“ 当前项目版本”设置为要使用的初始内部版本号,例如1
  • 回到构建阶段选项卡上,在复制包资源阶段之后拖放您的运行脚本阶段,以避免在尝试构建和更新包含构建编号的源文件时出现争用情况。
  • 请注意,使用agvtool方法,您可能仍会定期获取失败/已取消的构建,而且没有任何错误。 出于这个原因,我不推荐在这个脚本中使用agvtool

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

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

    next-version参数递增next-version号( bump也是同一个事物的别名),并且-all更新Info.plist与新的版本号。

  • 如果您有显示版本和内部版本的设置包,则可以将以下内容添加到脚本末尾以更新版本和内部版本。 注意:更改PreferenceSpecifiers值以匹配您的设置。 PreferenceSpecifiers:2表示查看plist文件中PreferenceSpecifiers数组下的索引2处的项目,因此对于基于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
    

  • (只需将其留在这里供我自己参考)。这将显示您在Xcode目标中看到的“版本”和“构建”字段的版本和构建:

    - (NSString*) version {
        NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
        NSString *build = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
        return [NSString stringWithFormat:@"%@ build %@", version, build];
    }
    

    在Swift中

    func version() -> String {
        let dictionary = NSBundle.mainBundle().infoDictionary!
        let version = dictionary["CFBundleShortVersionString"] as? String
        let build = dictionary["CFBundleVersion"] as? String
        return "(version) build (build)"
    }
    

    内部编号是一个内部编号,用于指示应用程序的当前状态。 它与版本号的不同之处在于它通常不面向用户,并且不象版本号通常那样表示任何差异/特征/升级。

    像这样想:

  • 构建( CFBundleVersion ):构建的编号。 通常你从1开始,并在应用程序的每个版本中增加1。 它可以快速比较哪个版本更新,它代表了代码库的进度感。 在使用QA进行工作时,这些可能会非常有价值,并且需要确保在正确的构建中记录错误。
  • 营销版本( CFBundleShortVersionString ):您用于表示此版本应用的用户CFBundleShortVersionString 。 通常这会遵循Major.minor版本方案(例如MyAwesomeApp 1.2),以便让用户知道哪些版本的维护更新较少,哪些版本具有很大的新功能。
  • 为了在您的项目中有效地使用它,Apple提供了一个名为agvtool的强大工具。 我强烈建议使用它,因为它比编写plist更改更简单。 它使您可以轻松设置内部版本号和市场营销版本。 当脚本编写时(例如,轻松更新每个版本的内部版本号或甚至查询当前内部版本号是什么)时,它非常有用。 它甚至可以做更多奇特的事情,比如当你更新内部版本号时为你标记你的SVN。

    要使用它:

  • 在版本控制下的Xcode中将您的项目设置为使用“Apple Generic”。
  • 在终端
  • agvtool new-version 1 (将agvtool new-version 1设置为1)
  • agvtool new-marketing-version 1.0 (将营销版本设置为1.0)
  • 查看agvtool的手册页获取大量信息

    链接地址: http://www.djcxy.com/p/67115.html

    上一篇: Version vs build in Xcode

    下一篇: Where to put database access/functionality in clojure application?