VSTS佈署Xamarin.iOS到Hockeyapp,自動更新版號和切換BundleIdentifier

在VSTS上面,可以建置Xamarin並將App發佈到HockeyApp上面進行,就可以讓用戶透過HockeyApp下載App,且HockeyApp本身可以讓APP有更新上架後,讓用戶開啟App之後,自動跳出更新App的訊息,這樣好處就可以減少開發人員再去做版本更新的通知功能。HockeyApp其背後的通知更新的機制在於Build版號要更新,才會通知有下載用戶說有新版本上架,換句話說如果只是單純上架新版的ipa是沒有用的

要做到版本更新,手動方式就是在Hockapp介面去調整build number,不過,這樣似乎有一點麻煩,期望可以這部分自動化,讓ipa檔上傳後就自動更新版號。因此,必須在VSTS做一些設定即可

自動更新版號


要做到自動更新版號,主要需了解HockeyApp版號的控制,由下圖可以知道,版號的取得是來自於plist檔案中的CFBundleVersion數值

只要知道它取得資訊地方,基本上在VSTS內要做到修改版號這件事情就簡單多。只要我們在Build的時候,去修改CFBundleVersion數值,不就可以了嗎?基於此想法,所以,後續動作就是修改plist檔案。

預設在VSTS裡面並沒有像MAC有方便更新plist的工具,所以,需安裝一個套件來幫我們簡化這個步驟,套件名稱為Colin's ALM Corner Build & Release Tools

這工具可以修改東西有這些:

  • Version Assemblies
  • Replace Tokens
  • DacPac Change Report Task
  • Tokenizer
  • Coverage Gate

主要是透過Version Assemblies方式去修改plist檔案,原本Build Xamarin流程

我們加上一個Version Assemblies Task,輔助我們修改plist檔案

在這Task幾個項目要設定

  • Source Path : 要取得plist檔案目錄
  • File Pattern : 這邊當然是指定plist檔案囉,/Info.plist
  • Version Source : 設定版本號的來源,可以使用Build Number或自訂變數,如果你要有自己的版本號設定,就選用自訂變數,不過,這邊的自訂變數,必須切記要符合Apple版本的編碼格式:1.0.0
  • Variable to use : 要使用的自訂變數,這邊一般可以使用Build.BuildNumber,原本因該是$Build.BuildNumber,但是這邊不可以加上$
  • Version Extract Pattern : 原本版本的型態格式,這邊使用Custom Regex,由我們來定義,符合plist內的CFBundleVersion格式
  • Custom Regex Find Pattern : Regex的表達式:(?:\d+\.\d+\.)(\d+),就直接抄這個,不需要變更

這運作機制,其實就是幫忙找到plist檔案,有設定CFBundleVersion版本的地方,用$Build.BuildNumber去Replace原本設定值,另外,在Advanced的Replace Pattern設定為1.0.0,且一個重點就是Build Regex Group Index必須視為0

因此,當每次build完後,就可以增量增加版號,這時候再把build好的ipa檔,傳到HockeyApp就可以

切換bundle identifier


我們都知道在iOS中BundleIdentifier名稱是唯一的,且每個名稱都會帶入一個憑證。一般我們在開發階段可以使用apple develop的憑證,做開發與發佈。不過,如果要正式發布給用戶安裝,就不能使用開發的憑證,必須到正式發布的憑證,憑證的改變還算簡單,這要在Build Xamarin.iOS的Task中,去更換P12 Certificate File,P12 Password & Provisioning Profile File對應的資訊就可以

但是,困難的是修改bundle identifier,畢竟在開發階段是不會設定bundle identifier為正式發布的名稱,而是當我們要Release時候,才會進行變更。要做這方面原本以為很困難,不過,發現這資訊也是被綁在plist檔案內,這時候發現一道曙光。就是如上面更新版號一樣作法去修改plist檔案

不過,這邊操作起來就簡單許多,因為我們只要Replace開發用的BundleIdentifier名稱,換成正式發布的名稱就可以,這樣上面會動到的地方有:

  • Variable to use : 用變數指定正式發布名稱
  • Version Extract Pattern : 一樣用Custom Regex
  • Custom Regex Find Pattern : 設定測試的BundleIdentifier的名字,後面可以直接Replace這個名字
    另外,在Advanced設定
  • Custom Regex Replace Pattern : 設定測試的BundleIdentifier的名字
  • Replace Pattern : 設定Custom Regex
  • Build Regex Group Index : 設定為0

這樣就可以變更名稱了,以上這些步驟都要在build之前,這樣才會把資訊跟ipa檔一起打包

所以,後續只要透過Branch去拆分開發與正式版本就可以,也就可以達到自動化佈署與切換的功能