我的应用程序使用 Cocoa Framework Sparkle 来部署更新。我通常不部署我的软件的测试版,但对于我的下一次更新,我觉得我需要这样做。我的问题是使用 Sparkle 部署测试版的最佳编号策略是什么。对于测试我的测试版的任何人,我希望在我发布下一个正式版本时更新是无缝的,但对于其他用户,我希望整个系统完全不可见。我目前使用 1.2.3 之类的编号系统进行更新。
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 来做到这一点。
最好的方法可能是完全断开您的 CFBundleVersion(它必须只包含 . 和数字,并且由 Sparkle 的版本比较和操作系统使用)和 CFBundleShortVersionString(它可以被任何东西,并且是用户所看到的)。
然后,您只需要确保您的 CFBundleVersion 始终随时间增加,但可以是任何东西[*],而您分别使用 1.2.4b 和 1.2.4 作为 CFBundleStortVersionString 用于 beta 和最终版本。只要测试版的 CFBundleVersion 高于您当前的 CFBundleVersion,并且最终非测试版的 CFBundleVersion 高于测试版,一切都会按照您想要的方式进行。
[*] 请记住,尽管 Apple 的文档没有提及,但 9999.99.99 几乎是 LaunchServices 可以识别的最高版本,并且它将忽略第三个以外的任何数字块,因此计划使用不会甚至更高;Sparkle 更新仍然有效,但操作系统会混淆哪个副本是最新版本。
我喜欢使用 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)。