2009-07-18 104 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。