此篇文章完整範例呈現於GitHub,若有需要參考可直接clone 並切換到每個階段,有任何問題也歡迎直接在底下留言或在GitHub 開issue。
如果因應需求,需要讓兩個app 是可以同時安裝的話,這樣的設定是不夠的,但我們需要改的東西不多,讓我們延續上例繼續改進。
首先我們可以先到Project 當中,打開app target 的Info.list
看一看,我們可以看到Bundle identifier 已經是透過參數帶入。
若想要Build 成獨立的app 我們則需要兩個不同的Bundle ID 才有辦法達成,因此,我們除了原本的Bundle ID 之外,我們希望可以在原本的Bundle ID 後面,再加上不同版本所需要的suffix,如:
- com.marcus.SeparateEnvironment
- com.marcus.SeparateEnvironment.beta
如果有其他平台或CI 狀態需求的話,可自行增加或修改。
我們來到Build Settings
的地方,找到Bundle ID 的section,對於Debug
與Release
這兩個config 進行調整(對我們來說這兩個是我們原本的測試版本)。
除此之外,同理我們可以將App Name 也做出區隔:
這時候我們就可以看到,App 已經獨立開來了,但是icon 卻一樣,該如何使用不同的icon 呢?
首先與前面Bundle ID 和App Name 一樣,我們先把Beta app 的icon set 名字改成AppIconBeta
,然後到Assets.xcassets
加一個新的set 即可。
Watch App 的坑
如果你的App 有Watch App
或Watch Extension
Target 的話,你可能會想要在Bundle ID 後面直接加上.beta
,但根據Apple 命名的規則,可能會造成Archive 失敗,這點可千萬要記得。
另外,還有兩個地方要調整,第一個是Watch App
的Info.plist
內,有個WKCompanionAppBundleIdentifier
,後面必須改成參數。
首先我們先在Build Settings
裡面新增一個User-Defined Setting
,叫做COMPANION_APP_BUNDLE_ID
:
然後將Info.plist
當中的WKCompanionAppBundleIdentifier
改成使用$(COMPANION_APP_BUNDLE_ID)
:
同理,也運用在Watch Extension
的Info.plist
與Build Settings
當中:
如此一來,在Archive 成兩個App 時,也會根據不同的Bundle ID 而使用不同的Watch App Bundle ID 了。
結論
前公司使用許多的Ruby Script 在Archive 之前,去變更Bundle ID 與App Icon 之類的,但這樣做不僅會造成Git 的異動,對於開發者來說切換相當不便,如果我們透過Xcode Config 與Scheme 去做切換的話,不僅是開發者來說更易於切換,也讓CI 在進行不同平台建置時,不需要再調整一堆的設定,只要選定Scheme 即可,CI 的設定也變得更加簡潔。