此篇文章完整範例呈現於GitHub,若有需要參考可直接clone 並切換到每個階段,有任何問題也歡迎直接在底下留言或在GitHub 開issue。


如果因應需求,需要讓兩個app 是可以同時安裝的話,這樣的設定是不夠的,但我們需要改的東西不多,讓我們延續上例繼續改進。

首先我們可以先到Project 當中,打開app target 的Info.list 看一看,我們可以看到Bundle identifier 已經是透過參數帶入。

螢幕快照 2019-03-14 下午2.58.20

若想要Build 成獨立的app 我們則需要兩個不同的Bundle ID 才有辦法達成,因此,我們除了原本的Bundle ID 之外,我們希望可以在原本的Bundle ID 後面,再加上不同版本所需要的suffix,如:

  • com.marcus.SeparateEnvironment
  • com.marcus.SeparateEnvironment.beta

如果有其他平台或CI 狀態需求的話,可自行增加或修改。

我們來到Build Settings 的地方,找到Bundle ID 的section,對於DebugRelease 這兩個config 進行調整(對我們來說這兩個是我們原本的測試版本)。

螢幕快照 2019-03-14 下午3.02.58

除此之外,同理我們可以將App Name 也做出區隔:

螢幕快照 2019-03-14 下午3.31.44

螢幕快照 2019-03-14 下午4.37.42

這時候我們就可以看到,App 已經獨立開來了,但是icon 卻一樣,該如何使用不同的icon 呢?

螢幕快照 2019-03-14 下午4.41.21

首先與前面Bundle ID 和App Name 一樣,我們先把Beta app 的icon set 名字改成AppIconBeta,然後到Assets.xcassets 加一個新的set 即可。

螢幕快照 2019-03-14 下午4.44.37

螢幕快照 2019-03-14 下午4.44.51

Watch App 的坑

如果你的App 有Watch AppWatch Extension Target 的話,你可能會想要在Bundle ID 後面直接加上.beta,但根據Apple 命名的規則,可能會造成Archive 失敗,這點可千萬要記得。

螢幕快照 2019-03-14 下午5.08.55

螢幕快照 2019-03-14 下午5.12.04

另外,還有兩個地方要調整,第一個是Watch AppInfo.plist內,有個WKCompanionAppBundleIdentifier,後面必須改成參數。

首先我們先在Build Settings 裡面新增一個User-Defined Setting,叫做COMPANION_APP_BUNDLE_ID

螢幕快照 2019-03-14 下午5.15.46

螢幕快照 2019-03-14 下午5.20.40

然後將Info.plist 當中的WKCompanionAppBundleIdentifier 改成使用$(COMPANION_APP_BUNDLE_ID)

螢幕快照 2019-03-14 下午5.24.47

同理,也運用在Watch ExtensionInfo.plistBuild Settings 當中:

螢幕快照 2019-03-14 下午5.24.14

如此一來,在Archive 成兩個App 時,也會根據不同的Bundle ID 而使用不同的Watch App Bundle ID 了。

結論

前公司使用許多的Ruby Script 在Archive 之前,去變更Bundle ID 與App Icon 之類的,但這樣做不僅會造成Git 的異動,對於開發者來說切換相當不便,如果我們透過Xcode Config 與Scheme 去做切換的話,不僅是開發者來說更易於切換,也讓CI 在進行不同平台建置時,不需要再調整一堆的設定,只要選定Scheme 即可,CI 的設定也變得更加簡潔。