
If you are not embarrassed by the first version of your product, you've launched too late.
- Reid Hoffman, LinkedIn
現在你已經完成了實體裝置中的 App 測試,那麼下一步呢?直接上傳你的 App 到 App Store 讓人下載嗎?是的,如果你的 App 很簡單,你可以這麼做;如果你開發的是一個高品質的 App,就不要急於發布你的 App,我建議你在正式發布前先對 App 進行 Beta 測試。
Beta 測試是軟體產品發布週期中的一個步驟,我知道你已經使用內建的模擬器在自己的裝置上測試過 App,有趣的是,即使你是 App 的開發者,也可能無法發現某些錯誤, 而透過 Beta 測試,你會驚訝地發現此階段中仍然有許多的缺陷被找出來。Beta 測試一般是向特定數量的使用者開放,他們可能是你的 App 潛在使用者、部落格粉絲、臉書粉絲、同事、朋友、甚至家庭成員。Beta 測試的目的是讓一小群人實際使用你的 App,對其測試並提供回饋;在此階段中,你希望 Beta 測試者發現儘可能多的錯誤,以讓你在 App 正式推出之前,先修復這些問題。
你也許想了解如何為你的 App 進行 Beta 測試、Beta 測試者如何在 App Store 上架之前執行你的 App,以及測試人員如何回報錯誤呢?
在 iOS 開發中,Apple 提供了一個名為「TestFlight」的工具來簡化 Beta 測試。你也許曾經聽過 TestFlight,它作為一個行動 App 測試的獨立行動平台已經好幾年了。2014 年2 月,Apple 收購了 TestFlight 的母公司 Burstly,現在 TestFlight 已整合到 App Store Connect(之前稱為 iTunes Connect )與 iOS 中,讓你可以只使用電子郵件位址來邀請 Beta 測試者。
TestFlight 區分了Beta 測試者與內部使用者,從概念上來說,兩者皆是你在 Beta 測試階段的測試者,但是TestFlight 把內部使用者視為在 App Store Connect 中擔任技術者或管理者角色的開發團隊成員,你最多可邀請100 名內部使用者來測試你的 App;另一方面, Beta 測試者被視為你的團隊與公司之外的外部使用者,你最多可邀請 10,000 名使用者來對你的 App 進行 Beta 測試。
如果你要讓外部使用者測試你的 App,則在邀請外部使用者之前,你的 App 必須先通過 Apple 的審查,但這個限制不適用於內部使用者,當你將 App 上傳到 App Store Connect 後,內部使用者便可做 Beta 測試。
和 CloudKit 類似,TestFlight 不是免費提供的,你必須先註冊 Apple 開發者計畫(每年99 美元),才能使用TestFlight。
在本章中,我會帶領你使用 TestFlight 做 Beta 測試。我們一般需要進行下列幾項工作, 以做發布 App 前的 Beta 測試:
首先, 你需要在 App Store Connect 有一個App 紀錄, 才能夠上傳 App。App Store Connect 是一個網頁應用程式, 供 iOS 開發者管理在 App Store 上銷售的 App。如果你已經註冊 iOS 開發者計畫,則可以透過下列網址訪問App Store Connect: https://appstoreconnect.apple.com。當登入 App Store Connect 之後,選擇「Apps」以及「+」圖示來建立新的 iOS App,如圖 26.1 所示。

系統會提示你填入下列資訊,如圖 26.2 所示:

當你點選「Create」按鈕後,你將進入另一個畫面來填寫 App 的詳細資訊。
首先,在側邊列選單中點選「App Information」,這個部分將顯示你剛才填寫的 App 詳細資訊,除了你的 App 名稱之外,你還可以提供副標題來進一步描述你的 App,如圖 26.3 所示。

另外,你可以提供其他語言的 App 資訊,只需點選「English(U.S.)」按鈕來選擇另一種語言。有一個選項必須設定,即選擇App 的主要類別,這是你的 App 在 App Store 中所列的分類,請選擇最適合 App 的類別,例如:你可以為 FoodPin App 選擇「Food & Drink」類別。
在側邊列選單中,你應該會看到「Pricing and Availability」區塊,這是你設定 App 價格的地方。預設上,你的App 可以全球下載,如果你想要限制 App 只在某些國家/地區上架,你可以點選「Availability」區塊下的「Edit」按鈕,然後選擇你想上架的國家。請記得在進行下一個部分之前,先儲存所有的變更。
從 macOS Big Sur 開始,可以在 Apple silicon Mac 上使用兼容的 iPhone 與 iPad App; 預設上,你的 iOS App 可供 macOS 的使用者來使用,如果你不希望 Apple silicon Macs 的使用者下載你的 App,則取消勾選 「Make this app available」核取方塊。
自 2018 年10 月3 日開始,需要為所有 App 與 App 更新制定隱私權政策,以便進行在 App Store 發布或者透過TestFlight 做外部測試。在側邊列選單中選擇「App Privacy」,然後填寫你的隱私權政策的 URL,並點選「Get Started」按鈕,以聲明你的 App 是否會從使用者那裡收集任何資料。
除了基本資訊以外,你還需要提供其他資訊,如螢幕截圖、App 描述、App 圖示、聯絡資訊等。在側邊列選單中,選擇「Prepare for Submission」選項來開始。

如圖 26.4 所示,這些是你的 App 的預覽畫面。對於螢幕截圖,你需要提供至少一張 6.5 英吋(或 6.7 英吋)裝置的螢幕截圖,另外你也可以上傳 iPhone 5.5 英吋的螢幕截圖。如果你的 App 支援 iPad,則需要提供 iPad 的螢幕截圖。
欲新增螢幕截圖,可點選「Choose File」,或者只需將檔案拖曳到方框即可,另外你也可以加入 App 預覽影片。
Note: 你可以進一步參考Apple 的《App Store Connect 開發者指南》的內容,以了解詳細資訊: https://developer.apple.com/support/app-store-connect/ 。

接著,填入你的 App 描述(Description )與宣傳文字(Promotional Text )。宣傳文字會出現在描述的上方,長度最多輸入 170 個字元,你可以使用此欄位來分享有關你的 App 的任何資訊,例如:你的 App 正在促銷中,便可使用這個欄位來通知你的潛在使用者, 並可隨時修改宣傳文字。
「關鍵字」(Keyword)是用來描述 App 性質,你應該輸入至少一組的關鍵字來描述你的 App;假使你有多個關鍵字,則可以使用逗號來分開它們,例如:「food,restaurant,recipe」。關鍵字是作為 App Store 搜尋參考用,這是影響你的 App 下載的最重要元素之一,你也許聽過「應用程式商店排名優化」( App Store Optimization,ASO),關鍵字優化是 ASO 的一部分,這裡我將不進行關鍵字優化的探討,若是你想要學習更多關於關鍵字優化的知識,則可參考 這篇文章 (https://neilpatel.com/blog/app-store-optimization/) ,或者Google 一下「ASO」。
另外,「Support URL」欄位是必填的,你可以填入你的網站或部落格的 URL,如果你沒有的話,可以到 wordpress.com 註冊一個網站。
你可以跳過「Build」部分,直接進入「General App Information」部分,這是關於你的 App 的一般資訊。你必須為你的 App 分級,只需點選 Rating 旁的「Edit」按鈕,然後填寫表單即可,App Store Connect 便會依照你的答案來為 App 分級。

對於「Copyright」欄位,你只需在獲得所有權的年份之前填寫你的姓名或公司(例如: 2023 AppCoda Limited ),如圖 26.7 所示。

只需在此部分填寫你的聯絡資訊即可。這個範例帳號欄位是可選填的,它適用於那些需要登入的 App,而對於不需要登入的 App,則取消勾選「Sign-in required」核取方塊。
當 App通過審核後,你就可以自動或手動發布你的 App,只需將其設定為「Automatically release this version」即可,最後點選右上角的「Save」按鈕來儲存變更。
如果你沒有漏掉任何必需的資訊,「Submit for Review」按鈕應該會啟動,這表示你的 App 紀錄已經在 App Store Connect 上成功建立了。
現在回到 Xcode,我們將建立 App 並上傳到 App Store Connect,但在此之前,請檢查你的專案,並確定版本號碼與你在 App Store Connect 上輸入的版本號碼是相符的。在專案導覽器中,選擇專案及目標來顯示專案編輯器(Project Editor ),然後在 Genernal 標籤下,檢查 Identity 區塊下的 Version 欄位,由於這是第一版,所以我們在Build 欄位設定為「1」,如圖 26.8 所示。

在發布 App 之前,請確認你已加入 App 圖示與啟動畫面(Launch Screen )。App 圖示是由素材目錄所管理,你可以在 Asset.xcassets 中找到 AppIcon 集。
從Xcode 14 開始,Xcode 為開發者綁定 App 圖示做了改進。在 Xcode 14 之前,你必須提供各種尺寸的 App 圖示,以配合不同的裝置,而現在只需要包含一個 1024×1024 像素的 App 圖示,Xcode 即會負責產生其餘的圖示。
你可以使用像是 Sketch 與 Figma 等設計工具來設計 App 圖示,建立完成後,你可將圖示拖曳至素材目錄中。

「啟動畫面」是開啟 App 時顯示給使用者的第一個畫面。以 UIKit 來說,Xcode 可以讓開發者使用故事板或介面建構器檔案來設計啟動畫面,但是對於 SwiftUI 專案而言,建立啟動畫面的程序略有不同。
圖 26.10 顯示了我們將要建立的啟動畫面,這是只顯示一張圖片的超簡單畫面;啟動畫面還具有淺色及深色模式的不同背景顏色。

要實作這個啟動畫面,先到下列連結下載圖片: https://www.appcoda.com/resources/swift53/FoodPinSwiftUILaunchImage.zip ,然後將圖片匯入素材目錄。

我們還需要建立一個新的顏色素材,以支援淺色及深色模式下的不同顏色。將顏色集命名為「LaunchScreenBackground」,並設定顏色代碼如下:
在 SwiftUI 專案中,預設上不會產生啟動畫面,你需要在 Info.plist 檔中手動新增它。開啟檔案後,你應該會看到一個名為「Launch Screen」的項目,點擊其左側的箭頭,以變更箭頭方向,接著點擊「+」按鈕來新增項目,如圖 26.12 所示。
有多個選項可供你選擇。要設定背景顏色,則設定鍵為「Background color」、值為 「LaunchScreenBackground」(即我們在前面所建立的顏色集);對於「Image Name」,則設定「ramen」(即你匯入到素材目錄中的圖片檔)。

如果我們想要確保圖片保持在安全區域內,則加入「Image respects safe area insets」, 並設定其值為「YES」。其餘選項是用於設定導覽列、標籤列與工具列的外觀,你可以依照你的偏好來決定是否啟用。
完成設定後,你可以點擊「Run」按鈕,以在模擬器上執行 App。當啟動 App 時,它應該顯示啟動畫面,而背景顏色會自適應底層的介面樣式。如果你的模擬器無法顯示啟動畫面,則到模擬器選單並點選「Device → Restart」來清除快取。
在 App 上傳到 App Store Connect 之前,你需要打包 App 檔案。首先,查看「Archive」方案設定, 確定「Build Configuration」為「Release」( 而不是DeBug)。至 Xcode 選單中,選擇「Product → Scheme → Edit Scheme」,然後選擇打包方案,並檢查「Build Configuration」的設定,這個選項應設定為「Release」,如圖 26.13 所示。

現在你已準備好打包你的 App 了。假如你是使用模擬器,Archive 功能是關閉的,因此你需要從方案彈出式選單中選擇「Any iOS Device」或你的裝置名稱(如果你已經將裝置連接到 Mac 電腦),然後到 Xcode 選單並選擇「Product → Archive」,如圖 26.14 所示。

打包完之後,你打包好的檔案會出現在 Organizer 中,它已準備好上傳到 App Store Connect,但是最好透過驗證程序來檢查是否有任何問題,只需點選「Validate App」按鈕,即可開始驗證程序,如圖 26.15 所示。

系統將提示你選擇 App Store 發布選項,只需接受預設的設定並繼續即可,在接下來的畫面中選擇「Automatically manage signing」,來讓 Xcode 為你簽署發行版本,現在點選「Validate」繼續。如果系統要求你產生一個 Apple 發布憑證(Apple Distribution certificate ),則請勾選核取方塊,這是在 App Store 上發布App 的必要步驟。

當你的 App 皆符合所有的要求,則你應該會看到「Your app successfully passed all validation checks」的訊息,如圖 26.16 所示。"
如果驗證成功,你可以點擊「Distribute App」按鈕來上傳檔案到 App Store Connect。由於我們要上傳到 App Store,因此當詢問發布方法時,請選擇「App Store Connect」。同樣的,只需接受 App Store 發布選項的預設設定,然後選擇「Automatically manage signing」選項。
現在點選「Upload」選項來開始上傳你的 App 打包檔到 App Store Connect,如圖 26.17 所示。在你看到「Upload Success」訊息之前,整個過程約需要幾分鐘的時間。

現在你已經將建置版本上傳到 App Store Connect,我們來了解如何推出你的 App 來進行內部測試。
回到 https://appstoreconnect.apple.com,選擇「My Apps」,然後選取你的 App。在選單中選擇「TestFlight」,App Store Connect 需要一些時間來處理你剛上傳的建置版本, 如果你在 TestFlight 沒有看見任何內容,則到 Activity 檢查狀態,也許 App Store Connect 仍在處理你的建置版本,請稍待片刻。
假設你的建置版本已經準備好進行測試,則應該會出現在 TestFlight 中,你需要先點選 「Manage」按鈕,以提供出口合規資訊(Export Compliance Information),如圖 26.18 所示。

在通知內部使用者測試 App 之前,你必須在 TestFlight 填寫測試資訊,包括回饋電子郵件、隱私權政策、行銷URL 和許可協定。點選「Test Information」並填寫所需的資訊, 你的測試者就可將回饋傳送到回饋電子郵件位址,因此請務必確認輸入正確的資訊。
當你填好所需資訊後,從側邊列選單中選擇「App Store Connect Users」,點選「Testers」旁邊的「+」按鈕並選擇測試者,然後點選「Add」來做確認,如圖 26.19 所示。如此, TestFlight 會自動以電子郵件通知測試者。

Note: 內部使用者是指 App Store Connect 團隊中擔任管理員、法律或技術角色的使用者,如果你想要加入更多的使用者或者變更他們的角色,則選擇「App Store Connect → Users and Roles」,然後點選「+」按鈕來新增使用者,另外你可直接加入獨立的測試者。
當測試者收到電子郵件通知,他/她需要點選「View in TestFlight」按鈕,iOS 會自動在 Safari 中開啟這個連結,測試者只需跟著指示來安裝 TestFlight App,便可以使用兌換碼來下載你的 App,如圖 26.20 所示。

你的 Beta 版 App 會在 90 天後過期,未來 Beta 版 App 有任何更新,你的內部測試者可以持續取得最新上傳的版本。
你可最多邀請 100 名內部使用者來進行測試,一旦你的 App 達到了使用者的期望,你就可以邀請更多的使用者來測試你的 App。TestFlight 可讓你邀請最多 10,000 名外部使用者來進行 Beta 測試,你所需要的只是每一個測試者的電子郵件位址,以便你向他們發送邀請。
若要新增外部測試者,則在側邊列選單中點選「Add External Testers」,你可以建立多個群組來管理你的測試者。在出現的提示視窗中,輸入你的群組名稱,然後點擊「Create」按鈕,如圖 26.21 所示。.

跟著指示來加入新測試者,你可以手動填寫他們的電子郵件位址或者透過上傳 CSV 檔來匯入。
當你建立群組後,在側邊列選單中選擇「iOS」,並點選 App 圖示。接下來,點選「Group」旁邊的「+」圖示,在彈出式選單中,選取你剛才建立的群組並繼續,跟著指示輸入 Beta 測試人員的測試資訊。
如前所述,在傳送你的測試邀請之前,你的 App 必須先通過 Apple 的審核,所以最後一步是點擊「Submit for Review」按鈕,以將你的A pp 送審,如圖 26.22 所示。

你的 App 提交審核之後,建置狀態(Build Status )會變更成等待建置版本通過核淮, 通常只需不到兩天的時間就會通過審核。
在 Apple 審核通過之後,你便可以通知外部使用者進行 Beta 測試。
FoodPin App 利用 iCloud 資料庫來儲存公共紀錄。至目前為止,我們只在 CloudKit 的開發環境(Development Environment )中測試我們的 App,對於使用 TestFlight 發布的 App,便不再允許使用開發環境,因此你必須要將開發環境的資料庫設定部署到生產環境中。
要做到這一點,回到 CloudKit 儀表板並選擇你的容器。在側邊列選單中,你應該會找到「Deploy Schema Changes...」按鈕,點選它來設定為生產環境(Production Environment)。

你會看到確認部署的提示視窗,點選「Deploy」按鈕來繼續,如圖 26.23 所示。部署只會將模式(例如:記錄類型)提升到生產環境,但它不會將開發環境的紀錄複製到生產環境,因此你必須要在部署後建立有紀錄的生產環境。
TestFlight 提供一個強大的工具,讓我們輕鬆地對我們的 App 做 Beta 測試。在本章中, 我引導你了解 TestFlight Beta 測試的基礎知識,如果你目前正在開發下一個 App,我鼓勵你利用這個工具邀請你的朋友及 Beta 使用者在正式發布之前測試你的 App,這一步驟對於建立高品質的 App 至關重要。