我的应用程序使用Cocoa Framework Sparkle来部署更新.我通常不会部署我的软件的测试版,但对于我的下一次更新,我觉得我需要.我的问题是使用Sparkle部署beta的最佳编号策略是什么.对于测试我的测试版的任何人,当我发布下一个正式版时,我希望更新是无缝的,但对于其他用户,我希望整个系统完全不可见.我目前使用像1.2.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"或其他任何内容.为了使想要获得测试版的用户能够实现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等等.
最好的方法可能是完全断开你的CFBundleVersion(它必须只包含.和数字,并由Sparkle的版本比较和操作系统使用)和CFBundleShortVersionString(它可以是任何东西,并且是用户看到的).
然后,你必须确保你的CFBundleVersion总是随着时间的推移而增加,但是否则可以是任何[*],而你分别使用1.2.4b和1.2.4作为beta版和最终版本的CFBundleStortVersionString.只要测试版的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无法确定它是否是当前版本.为了用户的利益,我喜欢将内部版本号放在营销版本号中.所以我的测试版版本看起来像这样:1.2.3 (456)
.Apple做与Safari非常相似的事情.如果我现在去Safari>关于Safari,我会看到版本4.0.2(5530.19).