跳至主要內容

加入 iOS App Clip 目標

本指南說明如何手動將另一個 Flutter 渲染的 iOS App Clip 目標新增至您現有的 Flutter 專案或加入應用程式專案。

若要查看可運作的範例,請參閱 GitHub 上的App Clip 範例

步驟 1 - 開啟專案

#

開啟您的 iOS Xcode 專案,例如完整 Flutter 應用程式的 ios/Runner.xcworkspace

步驟 2 - 加入 App Clip 目標

#

2.1

按一下「專案導覽器」中的專案,以顯示專案設定。

按一下目標列表底部的 + 以新增新目標。

2.2

為您的新目標選取 App Clip 類型。

2.3

在對話方塊中輸入您新目標的詳細資料。

為「介面」選取 Storyboard

語言 選取與您原始目標相同的語言。

(換句話說,為了簡化設定,請不要為 Objective-C 主目標建立 Swift App Clip 目標,反之亦然。)

2.4

在下列對話方塊中,啟用新目標的新配置。

2.5

回到專案設定中,開啟 Build Phases 標籤。將 Embedded App Clips 拖曳到 Thin Binary 上方。

步驟 3 - 移除不需要的檔案

#

3.1

在「專案導覽器」中,在新建立的 App Clip 群組中,刪除除了 Info.plist<app clip target>.entitlements 之外的所有內容。

將檔案移至垃圾桶。

3.2

如果您沒有使用 SceneDelegate.swift 檔案,請移除 Info.plist 中對它的參考。

開啟 App Clip 群組中的 Info.plist 檔案。刪除 Application Scene Manifest 的整個字典項目。

步驟 4 - 共用建置設定

#

對於加入應用程式專案,此步驟並非必要,因為加入應用程式專案有它們自訂的建置設定和版本。

4.1

回到專案設定中,現在選取專案項目,而不是任何目標。

Info 標籤中的 Configurations 可展開群組下,展開 DebugProfileRelease 項目。

針對每個項目,從下拉式選單中為 App Clip 目標選取與為正常應用程式目標選取的項目相同的值。

這可讓您的 App Clip 目標存取 Flutter 所需的建置設定。

iOS Deployment Target 設定為至少 16.0,以利用 15MB 的大小限制。

4.2

在 App Clip 群組的 Info.plist 檔案中,設定

  • Build version string (short)$(FLUTTER_BUILD_NAME)
  • Bundle version$(FLUTTER_BUILD_NUMBER)

步驟 5 - 共用程式碼與資源

#

選項 1 - 共用所有內容

#

假設目的是在標準應用程式和 App Clip 中顯示相同的 Flutter UI,請共用相同的程式碼和資源。

針對以下每一個項目:Main.storyboardAssets.xcassetsLaunchScreen.storyboardGeneratedPluginRegistrant.mAppDelegate.swift(如果使用 Objective-C 則為 Supporting Files/main.m),選取檔案,然後在檢查器的第一個標籤中,也在 Target Membership 核取方塊群組中包含 App Clip 目標。

選項 2 - 為 App Clip 自訂 Flutter 啟動

#

在這種情況下,不要刪除步驟 3中列出的所有內容。相反,請使用支架和iOS 加入應用程式 API來執行 Flutter 的自訂啟動。例如,顯示自訂 Flutter 路由

步驟 6 - 加入 App Clip 關聯網域

#

這是 App Clip 開發的標準步驟。請參閱Apple 官方文件

6.1

開啟 <app clip target>.entitlements 檔案。新增 Associated Domains 陣列類型。在陣列中新增一列 appclips:<您的套件 ID>

6.2

相同的關聯網域權限也需要新增到您的主要應用程式。

<app clip target>.entitlements 檔案從您的 App Clip 群組複製到您的主要應用程式群組,並將其重新命名為與您的主要目標相同的名稱,例如 Runner.entitlements

開啟檔案並刪除主要應用程式權限檔案的 Parent Application Identifiers 項目(為 App Clip 的權限檔案保留該項目)。

6.3

回到專案設定中,選取主要應用程式的目標,開啟 Build Settings 標籤。將 Code Signing Entitlements 設定設定為為主要應用程式建立的第二個權限檔案的相對路徑。

步驟 7 - 整合 Flutter

#

對於加入應用程式,這些步驟並非必要。

7.1

對於 Swift 目標,將 Objective-C Bridging Header 建置設定為 Runner/Runner-Bridging-Header.h

換句話說,與主要應用程式目標的建置設定相同。

7.2

現在開啟 Build Phases 標籤。按一下 + 符號,然後選取 New Run Script Phase

將該新階段拖曳到 Dependencies 階段下方。

展開新階段,並將此行新增至指令碼內容

bash
/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build

取消勾選 Based on dependency analysis

換句話說,與主要應用程式目標的建置階段相同。

這可確保在執行 App Clip 目標時編譯您的 Flutter Dart 程式碼。

7.3

再次按一下 + 符號,然後選取 New Run Script Phase。將其保留為最後一個階段。

這次新增

bash
/bin/sh "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" embed_and_thin

取消勾選 Based on dependency analysis

換句話說,與主要應用程式目標的建置階段相同。

這可確保將您的 Flutter 應用程式和引擎嵌入到 App Clip 套件中。

步驟 8 - 整合外掛程式

#

8.1

開啟您的 Flutter 專案或加入應用程式主機專案的 Podfile

對於完整 Flutter 應用程式,請取代以下章節

ruby
target 'Runner' do
  use_frameworks!
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

改為

ruby
use_frameworks!
use_modular_headers!
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))

target 'Runner'
target '<name of your App Clip target>'

在檔案的頂端,也取消註解 platform :ios, '12.0',並將版本設定為兩個目標的 iOS Deployment Target 中最低的版本。

對於加入應用程式,新增到

ruby
target 'MyApp' do
  install_all_flutter_pods(flutter_application_path)
end

改為

ruby
target 'MyApp' do
  install_all_flutter_pods(flutter_application_path)
end

target '<name of your App Clip target>'
  install_all_flutter_pods(flutter_application_path)
end

8.2

從命令列中,輸入您的 Flutter 專案目錄,然後安裝 pod

cd ios
pod install

執行

#

您現在可以從 Xcode 執行您的 App Clip 目標,方法是從配置下拉式選單中選取您的 App Clip 目標,選取 iOS 16 或更高版本的裝置,然後按一下執行。

若要測試從頭啟動 App Clip,也請參閱 Apple 關於測試您的 App Clip 啟動體驗的文件。

偵錯、熱重載

#

很遺憾,由於網路權限限制,flutter attach 無法自動探索 App Clip 中的 Flutter 會話。

為了偵錯您的 App Clip 並使用熱重載等功能,您必須在執行後從 Xcode 中的主控台輸出中尋找 Observatory URI。

然後您必須將其複製並貼回 flutter attach 命令以進行連線。

例如

flutter attach --debug-uri <copied URI>