部署Beta软件更新和Sparkle

时间:2009-07-18 07:41:15

标签: cocoa frameworks beta

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

3 个答案:

答案 0 :(得分:9)

我最近也考虑过这样做。我的应用程序的开发设置是使用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}"

因此,对于测试版,我可以将变更集标记为“0.29b”或其他任何内容。为了使想要获得测试版的用户能够实现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是用户在我的首选项窗口中设置的常量。这样做是为了确保您的Feed网址的GET请求包含beta = 1。在服务器上,您可以解释此问题,并提供测试版的appcast,或者它是否不存在正常版本。我不会解释你怎么能这样做,要么使用php,.htaccess等等。

答案 1 :(得分:7)

最好的方法可能是完全断开你的CFBundleVersion(它必须只包含。和数字,并由Sparkle的版本比较和操作系统使用)和CFBundleShortVersionString(可以通过任何方式,也就是用户看到的)。< / p>

然后,你必须确保你的CFBundleVersion总是随着时间的推移而增加,否则可以是任何[*],而你分别使用1.2.4b和1.2.4作为beta版和最终版的CFBundleStortVersionString。只要测试版的CFBundleVersion高于您当前的CFBundle版本,并且最终非测试版的CFBundleVersion高于测试版,一切都将以您想要的方式运行。

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

答案 2 :(得分:6)

我喜欢使用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无法确定它是否是当前版本。为了用户的利益,我喜欢将内部版本号放在营销版本号中。所以我的测试版版本看起来像这样:1.2.3 (456)。 Apple做与Safari非常相似的事情。如果我去Safari&gt;关于Safari现在,我看到版本4.0.2(5530.19)。