跳到主内容

将 Flutter 模块集成到您的 iOS 项目中

了解如何将 Flutter 模块集成到现有的 iOS 项目中。

Flutter UI 组件可以作为嵌入式框架逐步添加到您现有的 iOS 应用程序中。要将 Flutter 嵌入到现有应用程序中,请考虑以下三种方法之一。

嵌入方法方法论优势
使用 CocoaPods (推荐) 安装并使用 Flutter SDK 和 CocoaPods。每次 Xcode 构建 iOS 应用时,Flutter 都会从源码编译 flutter_module 将 Flutter 嵌入应用最简单的方法。
使用 iOS 框架 为 Flutter 组件创建 iOS 框架,将其嵌入到您的 iOS 项目中,并更新现有应用的构建设置。 不需要每位开发人员都在其本地机器上安装 Flutter SDK 和 CocoaPods。
使用 iOS 框架和 CocoaPods 在 Xcode 中为您的 iOS 应用和插件嵌入框架,但将 Flutter 引擎作为 CocoaPods podspec 分发。 提供了一种分发庞大 Flutter 引擎 ( Flutter.xcframework ) 库的替代方案。

当您将 Flutter 添加到现有的 iOS 应用时,它会 增加 iOS 应用的大小

对于使用 UIKit 构建的应用示例,请参阅 add_to_app 代码示例 中的 iOS 目录。对于使用 SwiftUI 的示例,请参考 News Feed App 中的 iOS 目录。

开发系统要求

#

Flutter 需要最新版本的 Xcode 和 CocoaPods

创建 Flutter 模块

#

要使用任何方法将 Flutter 嵌入到现有应用程序中,请先创建一个 Flutter 模块。使用以下命令创建 Flutter 模块。

cd /path/to/my_flutter
flutter create --template module my_flutter

Flutter 会在 /path/to/my_flutter/ 下创建模块项目。如果您使用 CocoaPods 方法,请将模块保存在与现有 iOS 应用相同的父目录中。

在 Flutter 模块目录中,您可以运行与其他 Flutter 项目相同的 flutter 命令,例如 flutter runflutter build ios。您也可以在 VS CodeAndroid Studio/IntelliJ 中使用 Flutter 和 Dart 插件运行该模块。该项目在嵌入到现有 iOS 应用之前,包含一个单视图示例版本的模块。这有助于测试代码中仅涉及 Flutter 的部分。

组织您的模块

#

my_flutter 模块的目录结构类似于典型的 Flutter 应用。

  • my_flutter/
    • .ios/
      • Runner.xcworkspace
      • Flutter/
        • podhelper.rb
    • lib/
      • main.dart
    • test/
    • pubspec.yaml

您的 Dart 代码应添加到 lib/ 目录中。您的 Flutter 依赖项、包和插件必须添加到 pubspec.yaml 文件中。

隐藏的 .ios/ 子文件夹包含一个 Xcode 工作区,您可以在其中运行模块的独立版本。此包装器项目可引导您的 Flutter 代码。它包含有助于构建框架或使用 CocoaPods 将模块嵌入到现有应用程序中的辅助脚本。

将 Flutter 模块嵌入 iOS 应用

#

开发完 Flutter 模块后,您可以使用页面顶部表格中描述的方法将其嵌入。

您可以在模拟器或真机上以 Debug(调试)模式运行,并在真机上以 Release(发布)模式运行。

使用 CocoaPods 和 Flutter SDK

#

方法

#

第一种方法使用 CocoaPods 来嵌入 Flutter 模块。CocoaPods 管理 Swift 项目的依赖项,包括 Flutter 代码和插件。每次 Xcode 构建应用时,CocoaPods 都会嵌入 Flutter 模块。

这允许使用最新版本的 Flutter 模块进行快速迭代,而无需在 Xcode 之外运行额外的命令。

要了解有关 CocoaPods 的更多信息,请查阅 CocoaPods 入门指南

观看视频

#

如果您通过观看视频学习效果更好,此视频涵盖了将 Flutter 添加到 iOS 应用的过程

在 YouTube 新标签页中观看:“如何将 Flutter 添加到现有 iOS 应用的步骤指南”

要求

#

项目中工作的每位开发人员都必须安装本地版本的 Flutter SDK 和 CocoaPods。

示例项目结构

#

本节假设您的现有应用和 Flutter 模块位于同级目录中。如果您有不同的目录结构,请调整相对路径。示例目录结构如下

  • my_flutter/
    • .ios/
    • Flutter/
      • podhelper.rb
  • MyApp/
    • Podfile

更新您的 Podfile

#

将您的 Flutter 模块添加到 Podfile 配置文件中。本节假设您将 Swift 应用命名为 MyApp

  1. (可选) 如果您现有的应用缺少 Podfile 配置文件,请导航到应用目录的根目录。使用 pod init 命令创建 Podfile 文件。

  2. 更新您的 Podfile 配置文件。

    1. platform 声明之后添加以下行。

      MyApp/Podfile
      ruby
      flutter_application_path = '../my_flutter'
      load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
      
    2. 对于每个需要嵌入 Flutter 的 Podfile 目标 (target),添加对 install_all_flutter_pods(flutter_application_path) 方法的调用。在前面的步骤设置之后添加这些调用。

      MyApp/Podfile
      ruby
      target 'MyApp' do
        install_all_flutter_pods(flutter_application_path)
      end
      
    3. Podfilepost_install 代码块中,添加对 flutter_post_install(installer) 的调用。此代码块应该是 Podfile 配置文件中的最后一个代码块。

      MyApp/Podfile
      ruby
      post_install do |installer|
        flutter_post_install(installer) if defined?(flutter_post_install)
      end
      

要查看 Podfile 示例,请参考此 Flutter Podfile 示例

嵌入您的框架

#

在构建时,Xcode 会将您的 Dart 代码、每个 Flutter 插件以及 Flutter 引擎打包到它们各自的 *.xcframework 包中。然后,CocoaPod 的 podhelper.rb 脚本会将这些 *.xcframework 包嵌入到您的项目中。

  • Flutter.xcframework 包含 Flutter 引擎。
  • App.xcframework 包含此项目编译后的 Dart 代码。
  • <plugin>.xcframework 包含一个 Flutter 插件。

要将 Flutter 引擎、您的 Dart 代码和 Flutter 插件嵌入到您的 iOS 应用中,请完成以下程序。

  1. 刷新您的 Flutter 插件。

    如果您更改了 pubspec.yaml 文件中的 Flutter 依赖项,请在您的 Flutter 模块目录中运行 flutter pub get。这会刷新 podhelper.rb 脚本读取的插件列表。

    flutter pub get
    
  2. 使用 CocoaPods 嵌入插件和框架。

    1. 导航到 /path/to/MyApp/MyApp 下的 iOS 应用项目。

    2. 使用 pod install 命令。

      pod install
      

    您的 iOS 应用的 Debug(调试)Release(发布)构建配置会嵌入 该构建模式对应的 Flutter 组件

  3. 构建项目。

    1. 在 Xcode 中打开 MyApp.xcworkspace

      请务必打开 MyApp.xcworkspace,而不是打开 MyApp.xcodeproj.xcworkspace 文件包含 CocoaPod 依赖项,而 .xcodeproj 则不包含。

    2. 选择 Product > Build 或按下 Cmd + B

设置 LLDB 初始化文件

#
  1. 生成 Flutter LLDB 文件。

    1. 在您的 Flutter 应用程序中,运行以下命令
    flutter build ios --config-only
    

    这将在 .ios/Flutter/ephemeral 目录中生成 LLDB 文件。

  2. 设置 LLDB 初始化文件。

    1. 转到 Product > Scheme > Edit Scheme

    2. 选择左侧边栏中的 Run(运行)部分。

    3. 使用与您在“更新您的 Podfile”部分中放入 Podfile 的 Flutter 应用程序相同的相对路径来设置 LLDB Init File(LLDB 初始化文件)

      $(SRCROOT)/../my_flutter/.ios/Flutter/ephemeral/flutter_lldbinit
      

      如果您的方案已经有 LLDB Init File,您可以将 Flutter 的 LLDB 文件添加到其中。Flutter 的 LLDB 初始化文件的路径必须相对于您项目的 LLDB 初始化文件的位置。

      例如,如果您的 LLDB 文件位于 /path/to/MyApp/.lldbinit,您应该添加以下内容

      command source --relative-to-command-file "../my_flutter/.ios/Flutter/ephemeral/flutter_lldbinit"
      

在 Xcode 中链接和嵌入框架

#

方法

#

在第二种方法中,您需要编辑现有的 Xcode 项目,生成必要的框架,并将它们嵌入到您的应用中。Flutter 会为 Flutter 本身、您编译的 Dart 代码以及您的每个 Flutter 插件生成 iOS 框架。嵌入这些框架并更新您现有应用程序的构建设置。

要求

#

此方法不需要额外的软件或硬件要求。请在以下用例中使用此方法

  • 您的团队成员无法安装 Flutter SDK 和 CocoaPods
  • 您不想在现有的 iOS 应用中使用 CocoaPods 作为依赖管理器

局限性

#

Flutter 无法处理 xcframeworks 的公共依赖项。如果宿主应用和 Flutter 模块的插件都定义了相同的 pod 依赖项,并且您使用此选项集成 Flutter 模块,则会导致错误。这些错误包括诸如 Multiple commands produce 'CommonDependency.framework' 之类的问题。

为了解决此问题,请将 Flutter 模块 podspec 文件中的每个插件源码链接到宿主应用的 Podfile。链接源码而不是插件的 xcframework 框架。下一节将解释如何 生成该框架

为防止出现公共依赖项导致的错误,请使用带有 --no-plugins 标志的 flutter build ios-framework

示例项目结构

#

以下示例假设您要将框架生成到 /path/to/MyApp/Flutter/

flutter build ios-framework --output=/path/to/MyApp/Flutter/

每次更改 Flutter 模块中的代码时,请运行此命令。

生成的项目结构应类似于此目录树。

  • /path/to/MyApp/
    • Flutter/
      • Debug/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework(如果您有包含 iOS 平台代码的插件)
        • example_plugin.xcframework(每个插件一个框架文件)
      • Profile/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework
        • example_plugin.xcframework
      • Release/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework
        • example_plugin.xcframework

流程

#

如何将生成的框架链接、嵌入到您现有的 Xcode 应用中,取决于框架的类型。

Flutter 插件可能会产生 静态或动态框架。链接静态框架,永远不要嵌入它们

如果您将静态框架嵌入到 iOS 应用中,您将无法将该应用发布到 App Store。发布将失败,并出现 Found an unexpected Mach-O header code 归档错误。

#

要链接必要的框架,请遵循此流程。

  1. 选择要链接的框架。

    1. Project Navigator(项目导航器)中,点击您的项目。

    2. 点击 Build Phases(构建阶段)选项卡。

    3. 展开 Link Binary With Libraries(用库链接二进制文件)

      Expand the **Link Binary With Libraries** build phase in Xcode

      在 Xcode 中展开 Link Binary With Libraries 构建阶段

    4. 点击 +(加号)。

    5. 点击 Add Other...,然后点击 Add Files...

    6. Choose frameworks and libraries to add:(选择要添加的框架和库:)对话框中,导航到 /path/to/MyApp/Flutter/Release/ 目录。

    7. 按住 Cmd 点击该目录中的框架,然后点击 Open

      Choose frameworks to link from the **Choose frameworks and libraries to add:** dialog box in Xcode

      在 Xcode 的 Choose frameworks and libraries to add: 对话框中选择要链接的框架

  2. 更新库路径以应对构建模式。

    1. 启动 Finder。

    2. 导航到 /path/to/MyApp/ 目录。

    3. 右键点击 MyApp.xcodeproj 并选择 Show Package Contents(显示包内容)

    4. 使用 Xcode 打开 project.pbxproj。该文件将在 Xcode 的文本编辑器中打开。这也会锁定 Project Navigator,直到您关闭文本编辑器。

      The `project-pbxproj` file open in the Xcode text editor

      在 Xcode 文本编辑器中打开的 project-pbxproj 文件

    5. /* Begin PBXFileReference section */ 中查找类似于以下文本的行。

      312885572C1A441C009F74FF /* Flutter.xcframework */ = {
        isa = PBXFileReference;
        expectedSignature = "AppleDeveloperProgram:S8QB4VV633:FLUTTER.IO LLC";
        lastKnownFileType = wrapper.xcframework;
        name = Flutter.xcframework;
        path = Flutter/Release/Flutter.xcframework;
        sourceTree = "<group>";
      };
      312885582C1A441C009F74FF /* App.xcframework */ = {
        isa = PBXFileReference;
        lastKnownFileType = wrapper.xcframework;
        name = App.xcframework;
        path = Flutter/Release/App.xcframework;
        sourceTree = "<group>";
      };
      
    6. 将前一步中突出显示的 Release 文本更改为 $(CONFIGURATION)。此外,请用引号将路径括起来。

      312885572C1A441C009F74FF /* Flutter.xcframework */ = {
        isa = PBXFileReference;
        expectedSignature = "AppleDeveloperProgram:S8QB4VV633:FLUTTER.IO LLC";
        lastKnownFileType = wrapper.xcframework;
        name = Flutter.xcframework;
        path = "Flutter/$(CONFIGURATION)/Flutter.xcframework";
        sourceTree = "<group>";
      };
      312885582C1A441C009F74FF /* App.xcframework */ = {
        isa = PBXFileReference;
        lastKnownFileType = wrapper.xcframework;
        name = App.xcframework;
        path = "Flutter/$(CONFIGURATION)/App.xcframework";
        sourceTree = "<group>";
      };
      
  3. 更新搜索路径。

    1. 点击 Build Settings(构建设置)选项卡。

    2. 导航到 Search Paths(搜索路径)

    3. 双击 Framework Search Paths(框架搜索路径)右侧的内容。

    4. 在组合框中,点击 +(加号)。

    5. 输入 $(inherited),然后按下 Enter

    6. 点击 +(加号)。

    7. 输入 $(PROJECT_DIR)/Flutter/$(CONFIGURATION)/,然后按下 Enter

      Update **Framework Search Paths** in Xcode

      在 Xcode 中更新 Framework Search Paths

链接框架后,它们应该会显示在目标 (target) 的 General(常规)设置的 Frameworks, Libraries, and Embedded Content(框架、库和嵌入内容)部分中。

嵌入动态框架
#

要嵌入您的动态框架,请完成以下程序。

  1. 导航到 General > Frameworks, Libraries, and Embedded Content

  2. 点击您的每个动态框架并选择 Embed & Sign(嵌入并签名)

    Select **Embed & Sign** for each of your frameworks in Xcode

    在 Xcode 中为您的每个框架选择 Embed & Sign

    不要包含任何静态框架,包括 FlutterPluginRegistrant.xcframework

  3. 点击 Build Phases(构建阶段)选项卡。

  4. 展开 Embed Frameworks(嵌入框架)。您的动态框架应显示在该部分中。

    The expanded **Embed Frameworks** build phase in Xcode

    Xcode 中展开的 Embed Frameworks 构建阶段

  5. 构建项目。

    1. 在 Xcode 中打开 MyApp.xcworkspace

      请务必打开 MyApp.xcworkspace,而不是打开 MyApp.xcodeproj.xcworkspace 文件包含 CocoaPod 依赖项,而 .xcodeproj 则不包含。

    2. 选择 Product > Build 或按下 Cmd + B

设置 LLDB 初始化文件

#
  1. 生成 Flutter LLDB 文件。

    1. 在您的 Flutter 应用程序中,如果尚未运行,请重新运行 flutter build ios-framework
    flutter build ios-framework --output=/path/to/MyApp/Flutter/
    

    这将在 /path/to/MyApp/Flutter/ 目录中生成 LLDB 文件。

  2. 设置 LLDB 初始化文件。

    1. 转到 Product > Scheme > Edit Scheme

    2. 选择左侧边栏中的 Run(运行)部分。

    3. LLDB Init File 设置为以下内容

      $(PROJECT_DIR)/Flutter/flutter_lldbinit
      

      如果您的方案已经有 LLDB Init File,您可以将 Flutter 的 LLDB 文件添加到其中。Flutter 的 LLDB 初始化文件的路径必须相对于您项目的 LLDB 初始化文件的位置。

      例如,如果您的 LLDB 文件位于 /path/to/MyApp/.lldbinit,您应该添加以下内容

      command source --relative-to-command-file "Flutter/flutter_lldbinit"
      

在 Xcode 中使用框架并将 Flutter 框架作为 podspec 使用

#

方法

#

此方法将 Flutter 生成为 CocoaPods podspec,而不是向其他开发人员、机器或持续集成系统分发庞大的 Flutter.xcframework。Flutter 仍然会为您的编译后的 Dart 代码以及每个 Flutter 插件生成 iOS 框架。嵌入这些框架并更新您现有应用程序的构建设置。

要求

#

此方法不需要额外的软件或硬件要求。请在以下用例中使用此方法

  • 您的团队成员无法安装 Flutter SDK 和 CocoaPods
  • 您不想在现有的 iOS 应用中使用 CocoaPods 作为依赖管理器

局限性

#

Flutter 无法处理 xcframeworks 的公共依赖项。如果宿主应用和 Flutter 模块的插件都定义了相同的 pod 依赖项,并且您使用此选项集成 Flutter 模块,则会导致错误。这些错误包括诸如 Multiple commands produce 'CommonDependency.framework' 之类的问题。

为了解决此问题,请将 Flutter 模块 podspec 文件中的每个插件源码链接到宿主应用的 Podfile。链接源码而不是插件的 xcframework 框架。下一节将解释如何 生成该框架

为防止出现公共依赖项导致的错误,请使用带有 --no-plugins 标志的 flutter build ios-framework

此方法仅适用于 betastable 发布渠道

示例项目结构

#

以下示例假设您要将框架生成到 /path/to/MyApp/Flutter/

flutter build ios-framework --output=/path/to/MyApp/Flutter/

每次更改 Flutter 模块中的代码时,请运行此命令。

生成的项目结构应类似于此目录树。

  • /path/to/MyApp/
    • Flutter/
      • Debug/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework(如果您有包含 iOS 平台代码的插件)
        • example_plugin.xcframework(每个插件一个框架文件)
      • Profile/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework
        • example_plugin.xcframework
      • Release/
        • Flutter.xcframework
        • App.xcframework
        • FlutterPluginRegistrant.xcframework
        • example_plugin.xcframework

将 Flutter 引擎添加到您的 Podfile

#

使用 CocoaPods 的宿主应用可以将 Flutter 引擎添加到其 Podfile 中。

MyApp/Podfile
ruby
pod 'Flutter', :podspec => '/path/to/MyApp/Flutter/[build mode]/Flutter.podspec'
#

Flutter 插件可能会产生 静态或动态框架。链接静态框架,永远不要嵌入它们

如果您将静态框架嵌入到 iOS 应用中,您将无法将该应用发布到 App Store。发布将失败,并出现 Found an unexpected Mach-O header code 归档错误。

#

要链接必要的框架,请遵循此流程。

  1. 选择要链接的框架。

    1. Project Navigator(项目导航器)中,点击您的项目。

    2. 点击 Build Phases(构建阶段)选项卡。

    3. 展开 Link Binary With Libraries(用库链接二进制文件)

      Expand the **Link Binary With Libraries** build phase in Xcode

      在 Xcode 中展开 Link Binary With Libraries 构建阶段

    4. 点击 +(加号)。

    5. 点击 Add Other...,然后点击 Add Files...

    6. Choose frameworks and libraries to add:(选择要添加的框架和库:)对话框中,导航到 /path/to/MyApp/Flutter/Release/ 目录。

    7. 按住 Cmd 点击该目录中的框架,然后点击 Open

      Choose frameworks to link from the **Choose frameworks and libraries to add:** dialog box in Xcode

      在 Xcode 的 Choose frameworks and libraries to add: 对话框中选择要链接的框架

  2. 更新库路径以应对构建模式。

    1. 启动 Finder。

    2. 导航到 /path/to/MyApp/ 目录。

    3. 右键点击 MyApp.xcodeproj 并选择 Show Package Contents(显示包内容)

    4. 使用 Xcode 打开 project.pbxproj。该文件将在 Xcode 的文本编辑器中打开。这也会锁定 Project Navigator,直到您关闭文本编辑器。

      The `project-pbxproj` file open in the Xcode text editor

      在 Xcode 文本编辑器中打开的 project-pbxproj 文件

    5. /* Begin PBXFileReference section */ 中查找类似于以下文本的行。

      312885572C1A441C009F74FF /* Flutter.xcframework */ = {
        isa = PBXFileReference;
        expectedSignature = "AppleDeveloperProgram:S8QB4VV633:FLUTTER.IO LLC";
        lastKnownFileType = wrapper.xcframework;
        name = Flutter.xcframework;
        path = Flutter/Release/Flutter.xcframework;
        sourceTree = "<group>";
      };
      312885582C1A441C009F74FF /* App.xcframework */ = {
        isa = PBXFileReference;
        lastKnownFileType = wrapper.xcframework;
        name = App.xcframework;
        path = Flutter/Release/App.xcframework;
        sourceTree = "<group>";
      };
      
    6. 将前一步中突出显示的 Release 文本更改为 $(CONFIGURATION)。此外,请用引号将路径括起来。

      312885572C1A441C009F74FF /* Flutter.xcframework */ = {
        isa = PBXFileReference;
        expectedSignature = "AppleDeveloperProgram:S8QB4VV633:FLUTTER.IO LLC";
        lastKnownFileType = wrapper.xcframework;
        name = Flutter.xcframework;
        path = "Flutter/$(CONFIGURATION)/Flutter.xcframework";
        sourceTree = "<group>";
      };
      312885582C1A441C009F74FF /* App.xcframework */ = {
        isa = PBXFileReference;
        lastKnownFileType = wrapper.xcframework;
        name = App.xcframework;
        path = "Flutter/$(CONFIGURATION)/App.xcframework";
        sourceTree = "<group>";
      };
      
  3. 更新搜索路径。

    1. 点击 Build Settings(构建设置)选项卡。

    2. 导航到 Search Paths(搜索路径)

    3. 双击 Framework Search Paths(框架搜索路径)右侧的内容。

    4. 在组合框中,点击 +(加号)。

    5. 输入 $(inherited),然后按下 Enter

    6. 点击 +(加号)。

    7. 输入 $(PROJECT_DIR)/Flutter/$(CONFIGURATION)/,然后按下 Enter

      Update **Framework Search Paths** in Xcode

      在 Xcode 中更新 Framework Search Paths

链接框架后,它们应该会显示在目标 (target) 的 General(常规)设置的 Frameworks, Libraries, and Embedded Content(框架、库和嵌入内容)部分中。

嵌入动态框架
#

要嵌入您的动态框架,请完成以下程序。

  1. 导航到 General > Frameworks, Libraries, and Embedded Content

  2. 点击您的每个动态框架并选择 Embed & Sign(嵌入并签名)

    Select **Embed & Sign** for each of your frameworks in Xcode

    在 Xcode 中为您的每个框架选择 Embed & Sign

    不要包含任何静态框架,包括 FlutterPluginRegistrant.xcframework

  3. 点击 Build Phases(构建阶段)选项卡。

  4. 展开 Embed Frameworks(嵌入框架)。您的动态框架应显示在该部分中。

    The expanded **Embed Frameworks** build phase in Xcode

    Xcode 中展开的 Embed Frameworks 构建阶段

  5. 构建项目。

    1. 在 Xcode 中打开 MyApp.xcworkspace

      请务必打开 MyApp.xcworkspace,而不是打开 MyApp.xcodeproj.xcworkspace 文件包含 CocoaPod 依赖项,而 .xcodeproj 则不包含。

    2. 选择 Product > Build 或按下 Cmd + B

设置 LLDB 初始化文件

#
  1. 生成 Flutter LLDB 文件。

    1. 在您的 Flutter 应用程序中,如果尚未运行,请重新运行 flutter build ios-framework
    flutter build ios-framework --output=/path/to/MyApp/Flutter/
    

    这将在 /path/to/MyApp/Flutter/ 目录中生成 LLDB 文件。

  2. 设置 LLDB 初始化文件。

    1. 转到 Product > Scheme > Edit Scheme

    2. 选择左侧边栏中的 Run(运行)部分。

    3. LLDB Init File 设置为以下内容

      $(PROJECT_DIR)/Flutter/flutter_lldbinit
      

      如果您的方案已经有 LLDB Init File,您可以将 Flutter 的 LLDB 文件添加到其中。Flutter 的 LLDB 初始化文件的路径必须相对于您项目的 LLDB 初始化文件的位置。

      例如,如果您的 LLDB 文件位于 /path/to/MyApp/.lldbinit,您应该添加以下内容

      command source --relative-to-command-file "Flutter/flutter_lldbinit"
      

设置本地网络隐私权限

#

在 iOS 14 及更高版本上,在 iOS 应用的 Debug(调试)版本中启用 Dart 多播 DNS 服务。这使用 flutter attach 添加了 热重载和 DevTools 等调试功能

若要仅在应用的调试版本中设置本地网络隐私权限,请为每个构建配置创建一个单独的 Info.plist。SwiftUI 项目创建时没有 Info.plist 文件。如果需要创建属性列表,可以通过 Xcode 或文本编辑器完成。以下说明假设使用默认的 DebugRelease。请根据应用的构建配置相应地调整名称。

  1. 创建一个新的属性列表。

    1. 在 Xcode 中打开您的项目。

    2. Project Navigator 中,点击项目名称。

    3. 从编辑器窗格的 Targets 列表中,点击您的应用。

    4. 点击 Info 选项卡。

    5. 展开 Custom iOS Target Properties(自定义 iOS 目标属性)

    6. 右键点击列表并选择 Add Row(添加行)

    7. 从下拉菜单中,选择 Bonjour Services。这会在项目目录中创建一个名为 Info 的新属性列表。它在 Finder 中显示为 Info.plist

  2. Info.plist 重命名为 Info-Debug.plist

    1. 点击左侧项目列表中的 Info 文件。

    2. 在右侧的 Identity and Type(标识和类型)面板中,将 Name(名称)Info.plist 更改为 Info-Debug.plist

  3. 创建一个 Release 属性列表。

    1. Project Navigator 中,点击 Info-Debug.plist

    2. 选择 File > Duplicate...(复制...)。您也可以按 Cmd + Shift + S

    3. 在对话框中,将 Save As:(另存为:)字段设置为 Info-Release.plist 并点击 Save(保存)

  4. 将必要的属性添加到 Debug 属性列表中。

    1. Project Navigator 中,点击 Info-Debug.plist

    2. 将字符串值 _dartVmService._tcp 添加到 Bonjour Services 数组中。

    3. (可选) 若要设置您想要的自定义权限对话框文本,请添加键 Privacy - Local Network Usage Description(隐私 - 本地网络使用说明)

      The `Info-Debug` property list with the **Bonjour Services** and **Privacy - Local Network Usage Description** keys added

      添加了 Bonjour ServicesPrivacy - Local Network Usage Description 键的 Info-Debug 属性列表

  5. 设置目标以针对不同的构建模式使用不同的属性列表。

    1. Project Navigator(项目导航器)中,点击您的项目。

    2. 点击 Build Settings(构建设置)选项卡。

    3. 点击 AllCombined 子选项卡。

    4. 在搜索框中输入 plist。这会将设置限制为包含属性列表的设置。

    5. 滚动列表,直到看到 Packaging

    6. 点击 Info.plist File 设置。

    7. Info.plist File 的值从 path/to/Info.plist 更改为 path/to/Info-$(CONFIGURATION).plist

      Updating the `Info.plist` build setting to use build mode-specific property lists

      更新 Info.plist 构建设置以使用构建模式特定的属性列表

      这在 Debug 中解析为 Info-Debug.plist,在 Release 中解析为 Info-Release.plist

      The updated **Info.plist File** build setting displaying the configuration variations

      更新后的 Info.plist File 构建设置,显示配置变体

  6. Build Phases 中移除 Release 属性列表。

    1. Project Navigator(项目导航器)中,点击您的项目。

    2. 点击 Build Phases(构建阶段)选项卡。

    3. 展开 Copy Bundle Resources(复制包资源)

    4. 如果此列表中包含 Info-Release.plist,请点击它,然后点击其下方的 -(减号)以从资源列表中删除该属性列表。

      The **Copy Bundle** build phase displaying the **Info-Release.plist** setting. Remove this setting.

      显示 Info-Release.plist 设置的 Copy Bundle 构建阶段。移除此设置。

  7. 您的 Debug 应用加载的第一个 Flutter 屏幕会提示本地网络权限。

    点击 OK(确定)

    (可选) 若要在应用加载前授予权限,请启用 Settings > Privacy > Local Network > Your App(设置 > 隐私 > 本地网络 > 您的应用)

缓解 Apple Silicon Mac 上的已知问题

#

运行 Apple Silicon 的 Mac 上,宿主应用为 arm64 模拟器构建。虽然 Flutter 支持 arm64 模拟器,但某些插件可能不支持。如果您使用其中一个插件,可能会看到类似 Undefined symbols for architecture arm64 的编译错误。如果发生这种情况,请从宿主应用的模拟器架构中排除 arm64

  1. Project Navigator(项目导航器)中,点击您的项目。

  2. 点击 Build Settings(构建设置)选项卡。

  3. 点击 AllCombined 子选项卡。

  4. Architectures(架构)下,点击 Excluded Architectures(排除的架构)

  5. 展开以查看可用的构建配置。

  6. 点击 Debug

  7. 点击 +(加号)。

  8. 选择 iOS Simulator

  9. 双击 Any iOS Simulator SDK(任何 iOS 模拟器 SDK)的值列。

  10. 点击 +(加号)。

  11. Debug > Any iOS Simulator SDK 对话框中输入 arm64

    Add `arm64` as an excluded architecture for your app

    arm64 添加为您的应用的排除架构

  12. Esc 关闭此对话框。

  13. Release 构建模式重复这些步骤。

  14. 对任何 iOS 单元测试目标重复此操作。

下一步

#

现在,您可以 添加 Flutter 屏幕 到您现有的 iOS 应用中。