2009-07-18 36 views
9

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

回答

6

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

然后,你只需要确保你的CFBundleVersion随着时间的推移总是增加,但可以是任何东西[*],而你分别使用1.2.4b和1.2.4作为CFBundleStortVersionString。只要该测试版的CFBundleVersion高于当前的CFBundleVersion,并且最终的非beta版发布的CFBundleVersion高于测试版,则所有内容都会按照您的想法运行。请注意,尽管Apple的文档没有提及它,但9999.99.99几乎是LaunchServices可以识别的最高版本,并且它将忽略超出第三个的任何数字块,因此计划使用一个方案甚至不会比这更高; Sparkle更新仍然有效,但操作系统会对最新版本的副本感到困惑。

+1

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

6

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

更重要的是,如果您使用Subversion或CVS作为您的版本控制系统,该工具具有内置支持。例如,我想增加我的版本号,我只是在终端输入:

agvtool -usesvn bump -all 

这增加我的应用程序的每个目标的版本号,更新Info.plist文件,然后提交整个事情自动到S​​VN。还有一个new-marketing-version动词,您可以使用该动词在所有项目的目标中设置CFBundleShortVersionString。查看agvtool的手册页(即在终端输入man agvtool)以获取更多详细信息。

那么这与Sparkle有什么关系呢?我使用内部编号作为我的sparkle:version号码。使用内部版本号让Sparkle很容易判断它是否是当前版本。为了用户的利益,我喜欢在营销版本号中输入版本号。所以我的测试版本号如下所示:1.2.3 (456)。苹果公司和Safari做了一些非常相似的事如果我现在进入Safari>关于Safari,我会看到4.0.2版本(5530.19)。

8

我最近也考虑过这样做。我的应用程序的开发设置是Xcode(显然)使用Sparkle,并且我将代码保存在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是得到通过我的喜好窗口用户设置的常数。它所做的是确保对您的供稿网址的GET请求包含beta = 1。在服务器上,您可以对此进行解释并提供Beta版本的Appcast,或者它不存在正常版本。我不会解释你如何做到这一点,无论是使用PHP,.htaccess。