建構和釋出為 iOS 應用

這個課程將為你提供關於如何將 Flutter App 釋出到 App StoreTestFlight 的說明。

預先準備

建構和釋出一個 macOS 應用需要使用 Xcode,你必須要有一個執行著 macOS 系統的裝置來學習本指南文件。

在開始釋出你的 app 的處理序之前,確保你已經看過了 Apple 的 App Store 稽核指南

想要釋出你的 app 到 App Store,你需要註冊 Apple Developer Program。你可以在蘋果的 選擇會員資格(開發者型別) 中檢視到關於多種不同會員型別的選擇。

在 App Store Connect 上註冊你的 App

App Store Connect (曾經的 iTunes Connet)是你將會管理應用生命週期的地方。你將會定義應用的名稱和描述以及截圖,設定價格,並管理釋出到 App Store 和 Testflight。

註冊你的 app 需要兩步:登記唯一的套裝 ID(Bundle ID),並在你的 App Store Connect 中建立一個 app。

關於更多 App Store Connect 的細節,檢視 App Store Connect 指南。

登記套裝 ID

每一個 iOS 應用都與一個在 Apple 登記的唯一的套裝 ID 關聯。要為你的應用登記一個套裝 ID,請參考下面的步驟:

  1. 在你的開發者帳號頁面開啟 App IDs 頁面。

  2. 點選 + 來建立一個新的套裝 ID。

  3. 輸入一個 App 名稱,選擇 Explicit App ID,然後輸入一個 ID。

  4. 選擇你的 App 將要使用的服務,然後點選 繼續

  5. 在下一頁,確認細節並點選 註冊 來註冊你的 Bundle ID。

在 App Store Connect 建立一個應用記錄

在 App Store Connect 中註冊你的應用:

接下來,你需要在 App Store Connect 註冊你的應用:

  1. 在你的瀏覽器裡開啟 App Store Connect

  2. 在 App Store Connect 的落地頁,點選 My Apps

  3. 在我的 app 頁面的頂部左側,點選 + ,然後選擇 New App

  4. 在出現的表單中填寫你的 app 細節。在平台部分,確保 iOS 被選中。由於 Flutter 暫時不支援 tvOS,保持該選項為未選。點選 Create

  5. 跳轉到你的應用詳情,然後從側邊欄選擇 App Information

  6. 在基礎資訊部分,選擇你在前一步註冊的套裝 ID。

想要獲取更多資訊,可以看這個幫助頁面 新增 App 至您的帳戶

檢查 Xcode 專案設定

在這一步,你需要在 Xcode 工作空間檢查絕大多數重要設定。關於更多的步驟和描述,檢視 為 App 分發做準備

在 Xcode 中跳轉到你的目標設定:

  1. 在 Flutter 工程目錄下執行命令 open ios/Runner.xcworkspace 開啟預設的 Xcode workspace。

  2. 想要看你的 app 設定,在 Xcode 的專案導航欄中選擇 Runner

接下來,你需要驗證最重要的配置:

選擇 General 標籤頁,在 Identity 部分:

Display Name
應用的名字。

Bundle Identifier
在 App Store Connect 註冊的 App ID。

Signing & Capabilities 部分:

Automatically manage signing
是否需要 Xcode 自動管理 app 簽名和設定。這個預設被設定為 true ,對於絕大多數 App 來說都是適用的。對於更復雜的場景,檢視 程式碼簽名指南

Team
選擇關聯到你註冊的 Apple 開發者賬戶的團隊。如果需要,選擇 Add Account…, 然後更新選項。

Build Settings 標籤頁的 Deployment 部分:

iOS Deployment Target
設定你的應用可以支援到的最低的 iOS 版本。 Flutter 支援 iOS 11 及其之後的版本,如果你的應用包含了 iOS 11 不支援的 Objective-C 或 Swift 程式碼,請將這裡一併設定為相應所需的最高版本。

你專案的 General 標籤頁應該看起來像是這樣的:

Xcode Project Settings

更多關於 App 簽名新的介紹,檢視文件 建立, 匯出, 和刪除簽名證書

更新應用的開發版本

如果你在 Xcode 工程裡更改了 Deployment Target,你需要開啟 Flutter app 的 ios/Flutter/AppframeworkInfo.plist 檔案並修改 MinimumOSVersion 值與之匹配。

新增應用圖示

當你建立一個新的 Flutter 應用時,則會建立一個預設的圖示。在這一步,你將使用你自己的圖示替換佔位圖示:

  1. 回顧 iOS 的 App Icon 指南。

  2. 在 Xcode 專案導航欄,選擇 Runner 目錄中的 Assets.xcassets,更新佔位圖示為你自己的 app 的圖示。

  3. 透過執行 flutter run 來驗證你的圖示是否已經被替換。

新增啟動畫

與應用圖示類似,你可以透過下面的方法替換佔位的啟動畫:

  1. 在 Xcode 的工程導航中選擇 Runner 資料夾下的 Assets.xcassets,然後將自己的啟動畫替換掉佔位啟動畫即可。

  2. 重新啟動你的應用來驗證是否替換成功,不要使用熱重載。

建立一個建構歸檔,並上傳到 App Store Connect

在開發過程中,你將會使用 debug 模式來完成建構、除錯並測試。當你準備好透過 App Store 或 TestFlight 交付你的 app 給使用者時,你需要準備一個 release 建構。

更新應用的建構編號和版本號

預設應用的版本號是 1.0.0,如果需要更新這個版本號,到 pubspec.yaml 檔案中更新下面這一行:

version: 1.0.0+1

版本號是由三個數字並用半形句號 (點) 隔開的,比如上面顯示的 1.0.0。後面是一個可選的建構編號,比如這個例子中使用 + 隔開的數字 1

建構名稱和建構編號都可以透過在執行命令 flutter build ipa 的時候透過 --build-name--build-number 覆蓋設定。

在 iOS 中,build-name 對應 CFBundleShortVersionStringbuild-number 對應著 CFBundleVersion。瞭解更多關於 iOS 中的版本資訊,請在 Apple 開發者文件網站檢視 Core Foundation Keys 文件。

在 Xcode 中這樣設定,也可以覆蓋 pubspec.yaml 中的建構名稱和建構編號:

  1. ios 資料夾中開啟 Runner.xcworkspace

  2. 在 Xcode 專案導航欄中選擇 Runner,然後在設定介面側邊欄選擇 Runner 目標。

  3. 在 Identity 部分,更新 Version 為你想要釋出的使用者可見的版本號。

  4. 在 Identity 部分,更新 Build 標示為一個唯一的 Build 數字,用來在 App Store Connect 上追蹤,每一個上傳都需要一個獨立的 Build 數字。

建立一個應用套裝 (app bundle)

執行命令列 flutter build ipa 之後會在 build/ios/archive 資料夾下產生一個 Xcode 建構歸檔(.xcarchive 文件),在 build/ios/ipa 資料夾下會產生一個 App Store 銷售套裝檔案(.ipa 檔案)。

可以考慮新增 --obfuscate--split-debug-info 命令列標記來 混淆你的 Dart 程式碼,使應用更難被逆向工程解析。

你可以使用不同的 應用匯出方法 而非只能輸出用於 App Store 釋出的應用,可用的命令列引數有 --export-method ad-hoc--export-method development--export-method enterprise

上傳應用套裝到 App Store Connect

最後,建立一個建構歸檔並將其上傳到 App Store Connect

  1. 安裝並開啟 Transporter macOS 應用,將 build/ios/ipa/*.ipa 下的應用套裝拖入 Transporter 應用中。

  2. 也可以在命令列執行下面的命令將應用套裝上傳:

    xcrun altool --upload-app --type ios -f build/ios/ipa/*.ipa --apiKey your_api_key --apiIssuer your_issuer_id
    

    執行 man altool 命令瞭解如何使用 App Store Connect API 金鑰進行認證。

  3. 在 Xcode 中開啟 build/ios/archive/MyApp.xcarchive

    點選 Validate App 按鈕。如果報告了任何問題,記錄下他們並重新開始一個新的建構。在你上傳一個歸檔前,可以一直使用同一個 Build ID。

    當這個歸檔校驗成功以後,點選 Distribute App

你可以在 App Store Connect 中應用詳情頁面的 Activities 標籤頁檢視你的建構狀態。

當你的建構已經通過了校驗,可以將你的建構透過 TestFlight 釋出給你的測試人員或直接將其釋出到 App Store 的時候,你會在 30 分鐘內收到一封信來提醒你。

更多內容可參考 上傳 App 到 App Store Connect

使用 Codemagic 命令列工具建立一個建構歸檔

該步驟包含了在 Flutter 專案的目錄下,透過終端使用 Flutter 建構命令和 Codemagic 命令列工具,建構歸檔並上傳至 App Store 的課程。該操作可以讓你完全控制分發證書和臨時鑰匙串,將它們與登入的進行隔離。

  1. 安裝 Codemagic 命令列工具:

    pip3 install codemagic-cli-tools
    
  2. 你需要使用包含 App 管理許可權的 App Store Connect 帳號,產生一個 App Store Connect API Key。為了使後續的命令更加簡潔,你可以在環境變數中配置這些內容: issuer id、key id 以及 API key 檔案。

    export APP_STORE_CONNECT_ISSUER_ID=aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
    export APP_STORE_CONNECT_KEY_IDENTIFIER=ABC1234567
    export APP_STORE_CONNECT_PRIVATE_KEY=`cat /path/to/api/key/AuthKey_XXXYYYZZZ.p8`
    
  3. 你需要匯出或者建立一個 iOS 分發證書,用來簽名及歸檔建構。

    如果你已經有可用的 證書,你可以使用以下命令匯出私鑰:

    openssl pkcs12 -in <certificate_name>.p12 -nodes -nocerts | openssl rsa -out cert_key
    

    你也可以使用以下命令建立新的私鑰:

    ssh-keygen -t rsa -b 2048 -m PEM -f cert_key -q -N ""
    

    之後你便可以用命令列工具基於這個私鑰建立新的 iOS 分發建構了。

  4. 配置一個用於簽名的臨時鑰匙串:

    keychain initialize
    
  5. 從 App Store Connect 上獲取簽名檔案:

    app-store-connect fetch-signing-files $(xcode-project detect-bundle-id) \
        --platform IOS \
        --type IOS_APP_STORE \
        --certificate-key=@file:/path/to/cert_key \
        --create
    

    其中,cert_key 是你匯出的 iOS 分發證書的私鑰,或者是自動產生新證書的新私鑰。如果 App Store Connect 中不存在這個證書,將會透過私鑰建立。

  6. 將獲取到的證書新增到你的鑰匙串中:

    keychain add-certificates
    
  7. 更新 Xcode 專案設定,使用獲取到的簽名配置:

    xcode-project use-profiles
    
  8. 獲取 Flutter 依賴:

    flutter packages pub get
    
  9. 獲取 CocoaPods 依賴:

    find . -name "Podfile" -execdir pod install \;
    
  10. 建構 Flutter 的 iOS 專案:

    flutter build ipa --release \
        --export-options-plist=$HOME/export_options.plist
    

    注意 export_options.plist 路徑來源於 xcode-project use-profiles 命令的輸出。

  11. 將應用釋出到 App Store Connect:

    app-store-connect publish \
        --path $(find $(pwd) -name "*.ipa")
    
  12. 如前文所示,記得將你的登入鑰匙串設定為預設,避免裝置出現認證問題:

    keychain use-login
    

在 30 分鐘內,你會收到一封郵件,提醒你建構已驗證,可以在 TestFlight 上釋出。這時你可以選擇在 TestFlight 上釋出,或是直接在 App Store 上釋出。

在 TestFlight 釋出你的應用

TestFlight allows developers to push their apps to internal and external testers. This optional step covers releasing your build on TestFlight.

  1. App Store Connect中,你的應用的詳情頁面跳轉到 TestFlight Tab。

  2. 在側邊欄選擇 Internal Testing

  3. 選擇要釋出給測試人員的建構,然後點選 儲存

  4. 為每一個內部測試人員新增郵件。你可以在 App Store Connect 的 使用者與角色 頁面新增額外的內部使用者,他們將會出現在頁面頂部的下拉選單中。

關於更多資訊,請檢視 使用 TestFlight 分發應用 (Distribute an app using TestFlight (iOS, tvOS, watchOS))

在 App Store 釋出你的應用

當你準備釋出你的 app 到這個世界時,跟隨下面的步驟,來提交你的 App 去稽核,並將其釋出到 App Store。

  1. 從你的 app 在 App Store Connect 的頁面中的側邊欄中選擇 Pricing and Availability,然後完善所有的必填資訊。

  2. 從側邊欄選擇狀態。如果這是第一次釋出這個 App,這個狀態將會是 1.0 Prepare for Submission,填寫所有需要填寫的區域。

  3. 點選 提交稽核

Apple 將會在他們的稽核過程結束後提醒你。你的 app 將會根據 Version Release 部分的介紹進行釋出。

關於更多細節,檢視 透過 App Store 分發一個 App.

故障排除

分發你的應用 指南,提供了詳細的釋出應用到 App Store 過程的內容。