【问题标题】:Deploying Beta software updates and Sparkle部署 Beta 软件更新和 Sparkle
【发布时间】:2010-11-11 22:17:53
【问题描述】:

我的应用程序使用 Cocoa Framework Sparkle 来部署更新。我通常不部署我的软件的测试版,但对于我的下一次更新,我觉得我需要这样做。 我的问题是使用 Sparkle 部署测试版的最佳编号策略是什么。对于测试我的测试版的任何人,我希望在我发布下一个正式版本时更新是无缝的,但对于其他用户,我希望整个系统完全不可见。我目前使用 1.2.3 之类的编号系统进行更新。

【问题讨论】:

    标签: cocoa frameworks beta


    【解决方案1】:

    最好的方法可能是完全断开您的 CFBundleVersion(它必须只包含 . 和数字,并且用于 Sparkle 的版本比较和操作系统)和 CFBundleShortVersionString(它可以被任何东西,并且是用户所看到的)。

    然后,您只需要确保您的 CFBundleVersion 始终随着时间的推移而增加,否则可以是任何东西[*],而您分别使用 1.2.4b 和 1.2.4 作为 CFBundleStortVersionString 用于测试版和最终版。只要测试版的 CFBundleVersion 高于您当前的 CFBundleVersion,并且最终非测试版的 CFBundleVersion 高于测试版,一切都会按照您想要的方式进行。

    [*] 请记住,尽管 Apple 的文档没有提及,但 9999.99.99 几乎是 LaunchServices 能够识别的最高版本,并且它将忽略第三个之后的任何数字块,因此计划使用一个方案甚至不会更高; Sparkle 更新仍然有效,但操作系统会混淆哪个副本是最新版本。

    【讨论】:

    • 我选择这样做的方法是将 CFBundleVersion 从 1.2.5 更新到 1.2.5.1,并将 CFBundleShortVersionString 更新到 1.2.6 beta。当我发布最终版本时,我会将 CFBundleVersion 更新到 1.2.6,然后所有用户都可以使用最新版本,包括 beta 测试人员和非 beta 测试人员。唯一的问题是我无法更新使用 Sparkle 的 beta 测试人员使用的版本,但对于当前的测试,我希望只需要一个 beta 版本。
    【解决方案2】:

    我喜欢使用 Xcode 附带的 Apple 版本控制工具。它维护一个与您的营销版本号 (1.2.3) 不同的并行内部版本号(例如 12345)。您可以使用命令行工具agvtool 调用它。

    此外,如果您使用 Subversion 或 CVS 作为您的版本控制系统,则此工具具有内置支持。例如,我想增加我的内部版本号,我只需在终端中输入:

    agvtool -usesvn bump -all
    

    这会增加我的应用程序中每个目标的构建号,更新Info.plist 文件,然后将整个内容自动提交给 SVN。还有一个new-marketing-version 动词可用于在所有项目目标中设置CFBundleShortVersionString。查看agvtool 的手册页(即在终端输入man agvtool)了解更多详情。

    那么这和 Sparkle 有什么关系呢?我使用内部版本号作为我的sparkle:version 编号。使用内部版本号让 Sparkle 很容易确定它是否是当前版本。为了用户的利益,我喜欢将内部版本号放在营销版本号中。所以我的 beta 版本号看起来像这样:1.2.3 (456)。 Apple 与 Safari 的做法非常相似。如果我现在去 Safari > About Safari,我会看到版本 4.0.2 (5530.19)。

    【讨论】:

      【解决方案3】:

      我最近也在考虑这样做。我的应用程序的开发设置是带有 Sparkle 的 Xcode(显然),我在 Mercurial 存储库中维护我的代码。作为构建过程的一部分,我使用“hg id”查询 Mercurial 以填充 Info.plit。这是在我的 Xcode 目标的构建脚本中完成的。这是脚本:

      /usr/libexec/PlistBuddy -c "Set :CFBundleVersion `/usr/local/bin/hg id -in`" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
      /usr/libexec/PlistBuddy -c "Set :CFBundleShortVersionString `/usr/local/bin/hg id -t`" "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}"
      

      因此,对于 beta 版本,我可以将我的变更集标记为“0.29b”或其他任何内容。为了让想要获得 beta 版本的用户实现这一点,我实现了 SUUpdater 委托方法:

      #pragma mark -
      #pragma mark SUUpdate Delegate methods
      
      - (NSArray *)feedParametersForUpdater:(SUUpdater *)updater sendingSystemProfile:(BOOL)sendingProfile {
          if([[NSUserDefaults standardUserDefaults] boolForKey:BSEnableBetaUpdates]) {
              return [NSArray arrayWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"beta", @"key", [NSNumber numberWithBool:YES], @"value", @"Enable beta updates", @"displayKey", @"Yes", @"displayValue", nil], nil];
          } else {
              return nil;
          }
      }
      

      其中 BSEnableBetaUpdates 是用户在我的首选项窗口中设置的常量。这样做是确保对您的提要 url 的 GET 请求包含 beta=1。在服务器上,您可以解释这一点并提供 beta 版本的应用广播,或者如果它不存在正常版本。我不会解释你如何做到这一点,无论是使用 php,.htaccess 什么的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        • 1970-01-01
        • 2019-10-02
        • 1970-01-01
        相关资源
        最近更新 更多