跳到主内容

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

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

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

嵌入方法方法论优势
使用 CocoaPods (推荐) 安装并使用 Flutter SDK 和 CocoaPods。Flutter 每次 Xcode 构建 iOS 应用时都会从源代码编译 flutter_module 将 Flutter 嵌入到您的应用中的最简单方法。
使用 iOS 框架 为 Flutter 组件创建 iOS 框架,将其嵌入到您的 iOS 中,并更新您现有应用程序的构建设置。 不需要每个开发人员在其本地机器上安装 Flutter SDK 和 CocoaPods。
使用 iOS 框架和 CocoaPods 将框架嵌入到您的 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。您还可以使用 Flutter 和 Dart 插件在 VS CodeAndroid Studio/IntelliJ 中运行该模块。该项目包含模块的单视图示例版本,在将其嵌入到您现有的 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 模块。

这允许您在无需在 Xcode 之外运行其他命令的情况下,使用最新版本的 Flutter 模块进行快速迭代。

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

观看视频

#

如果观看视频有助于您学习,此视频涵盖了将 Flutter 添加到 iOS 应用的过程

在 YouTube 上以新标签页观看:“逐步演示如何在现有 iOS 应用中添加 Flutter”

要求

#

您的项目中的每个开发人员都必须在其本地机器上安装 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. 导航到您的 iOS 应用项目,位于 /path/to/MyApp/MyApp

    2. 使用 pod install 命令。

      pod install
      

    您的 iOS 应用的 DebugRelease 构建配置嵌入了与该构建模式对应的 Flutter 组件

  3. 构建项目。

    1. 在 Xcode 中打开 MyApp.xcworkspace

      验证您是否正在打开 MyApp.xcworkspace 而不是打开 MyApp.xcodeproj.xcworkspace 文件具有 CocoaPod 依赖项,而 .xcodeproj 没有。

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

设置 LLDB Init 文件

#
  1. 生成 Flutter LLDB 文件。

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

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

  2. 设置 LLDB Init 文件。

    1. 转到 Product > Scheme > Edit Scheme

    2. 在左侧边栏中选择 Run 部分。

    3. 使用与您在 更新您的 Podfile 部分中放入 Flutter 应用中的相同相对路径设置 LLDB Init File

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

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

      例如,如果您的 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 无法处理 具有 xcframework 的常见依赖项。如果您同时使用主机应用和 Flutter 模块的插件定义相同的 pod 依赖项,并且使用此选项集成 Flutter 模块,则会发生错误。这些错误包括类似 Multiple commands produce 'CommonDependency.framework' 的问题。

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

为了防止由于公共依赖项存在而发生的错误,请使用 flutter build ios-framework 命令,并加上 --no-plugins 标志。

示例项目结构

#

以下示例假定您希望将框架生成到 /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. 项目导航器 中,单击您的项目。

    2. 单击 构建阶段 选项卡。

    3. 展开 链接二进制文件与库

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

      在 Xcode 中展开 链接二进制文件与库 构建阶段

    4. 单击 + (加号)。

    5. 单击 添加其他...,然后单击 添加文件...

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

    7. 命令单击该目录中的框架,然后单击 打开

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

      从 Xcode 的 选择要添加的框架和库: 对话框中选择要链接的框架

  2. 更新库的路径以考虑构建模式。

    1. 启动 Finder。

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

    3. 右键单击 MyApp.xcodeproj 并选择 显示包内容

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

      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. 单击 构建设置 选项卡。

    2. 导航到 搜索路径

    3. 双击 框架搜索路径 右侧。

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

    5. 键入 $(inherited) 并按 Enter

    6. 单击 + (加号)。

    7. 键入 $(PROJECT_DIR)/Flutter/$(CONFIGURATION)/ 并按 Enter

      Update **Framework Search Paths** in Xcode

      更新 Xcode 中的 框架搜索路径

链接框架后,它们应显示在目标 常规 设置的 框架、库和嵌入内容 部分中。

嵌入动态框架
#

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

  1. 导航到 常规 > 框架、库和嵌入内容

  2. 单击您的每个动态框架,然后选择 嵌入 & 签名

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

    在 Xcode 中为您的每个框架选择 嵌入 & 签名

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

  3. 单击 构建阶段 选项卡。

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

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

    Xcode 中展开的 嵌入框架 构建阶段

  5. 构建项目。

    1. 在 Xcode 中打开 MyApp.xcworkspace

      验证您是否正在打开 MyApp.xcworkspace 而不是打开 MyApp.xcodeproj.xcworkspace 文件具有 CocoaPod 依赖项,而 .xcodeproj 没有。

    2. 选择 产品 > 构建 或按 Cmd + B

设置 LLDB Init 文件

#
  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 Init 文件。

    1. 转到 Product > Scheme > Edit Scheme

    2. 在左侧边栏中选择 Run 部分。

    3. LLDB 初始化文件 设置为以下内容

      $(PROJECT_DIR)/Flutter/flutter_lldbinit
      

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

      例如,如果您的 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 无法处理 具有 xcframework 的常见依赖项。如果您同时使用主机应用和 Flutter 模块的插件定义相同的 pod 依赖项,并且使用此选项集成 Flutter 模块,则会发生错误。这些错误包括类似 Multiple commands produce 'CommonDependency.framework' 的问题。

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

为了防止由于公共依赖项存在而发生的错误,请使用 flutter build ios-framework 命令,并加上 --no-plugins 标志。

此方法仅适用于 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. 项目导航器 中,单击您的项目。

    2. 单击 构建阶段 选项卡。

    3. 展开 链接二进制文件与库

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

      在 Xcode 中展开 链接二进制文件与库 构建阶段

    4. 单击 + (加号)。

    5. 单击 添加其他...,然后单击 添加文件...

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

    7. 命令单击该目录中的框架,然后单击 打开

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

      从 Xcode 的 选择要添加的框架和库: 对话框中选择要链接的框架

  2. 更新库的路径以考虑构建模式。

    1. 启动 Finder。

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

    3. 右键单击 MyApp.xcodeproj 并选择 显示包内容

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

      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. 单击 构建设置 选项卡。

    2. 导航到 搜索路径

    3. 双击 框架搜索路径 右侧。

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

    5. 键入 $(inherited) 并按 Enter

    6. 单击 + (加号)。

    7. 键入 $(PROJECT_DIR)/Flutter/$(CONFIGURATION)/ 并按 Enter

      Update **Framework Search Paths** in Xcode

      更新 Xcode 中的 框架搜索路径

链接框架后,它们应显示在目标 常规 设置的 框架、库和嵌入内容 部分中。

嵌入动态框架
#

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

  1. 导航到 常规 > 框架、库和嵌入内容

  2. 单击您的每个动态框架,然后选择 嵌入 & 签名

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

    在 Xcode 中为您的每个框架选择 嵌入 & 签名

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

  3. 单击 构建阶段 选项卡。

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

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

    Xcode 中展开的 嵌入框架 构建阶段

  5. 构建项目。

    1. 在 Xcode 中打开 MyApp.xcworkspace

      验证您是否正在打开 MyApp.xcworkspace 而不是打开 MyApp.xcodeproj.xcworkspace 文件具有 CocoaPod 依赖项,而 .xcodeproj 没有。

    2. 选择 产品 > 构建 或按 Cmd + B

设置 LLDB Init 文件

#
  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 Init 文件。

    1. 转到 Product > Scheme > Edit Scheme

    2. 在左侧边栏中选择 Run 部分。

    3. LLDB 初始化文件 设置为以下内容

      $(PROJECT_DIR)/Flutter/flutter_lldbinit
      

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

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

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

设置本地网络隐私权限

#

在 iOS 14 及更高版本上,在 iOS 应用的 Debug 版本中启用 Dart multicast DNS 服务。这增加了使用 flutter attach 进行 调试功能,例如热重载和 DevTools

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

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

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

    2. 项目导航器 中,单击项目名称。

    3. 目标 列表中,单击您的应用。

    4. 单击 信息 选项卡。

    5. 展开 自定义 iOS 目标属性

    6. 右键单击列表并选择 添加行

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

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

    1. 单击项目列表左侧的 信息 文件。

    2. 在右侧的 身份和类型 面板中,将 名称Info.plist 更改为 Info-Debug.plist

  3. 创建 Release 属性列表。

    1. 项目导航器 中,单击 Info-Debug.plist

    2. 选择 文件 > 复制...。您也可以按 Cmd + Shift + S

    3. 在对话框中,将 保存为: 字段设置为 Info-Release.plist,然后单击 保存

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

    1. 项目导航器 中,单击 Info-Debug.plist

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

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

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

      添加了 Bonjour 服务隐私 - 本地网络使用说明 键的 Info-Debug 属性列表

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

    1. 项目导航器 中,单击您的项目。

    2. 单击 构建设置 选项卡。

    3. 单击 全部组合 子选项卡。

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

    5. 向下滚动列表,直到看到 打包

    6. 单击 信息.plist 文件 设置。

    7. 信息.plist 文件 值从 path/to/Info.plist 更改为 path/to/Info-$(CONFIGURATION).plist

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

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

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

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

      更新的 信息.plist 文件 构建设置显示配置变化

  6. 构建阶段 中删除 Release 属性列表。

    1. 项目导航器 中,单击您的项目。

    2. 单击 构建阶段 选项卡。

    3. 展开 复制捆绑资源

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

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

      显示 Info-Release.plist 设置的 复制捆绑包 构建阶段。删除此设置。

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

    单击 确定

    (可选) 要在应用加载之前授予权限,请启用 设置 > 隐私 > 本地网络 > 您的应用

缓解 Apple Silicon Mac 上的已知问题

#

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

  1. 项目导航器 中,单击您的项目。

  2. 单击 构建设置 选项卡。

  3. 单击 全部组合 子选项卡。

  4. 架构 下,单击 排除的架构

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

  6. 单击 Debug

  7. 单击 + (加号)。

  8. 选择 iOS 模拟器

  9. 双击 任何 iOS 模拟器 SDK 的值列。

  10. 单击 + (加号)。

  11. Debug > 任何 iOS 模拟器 SDK 对话框中键入 arm64

    Add `arm64` as an excluded architecture for your app

    arm64 添加为应用的排除架构

  12. Esc 关闭此对话框。

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

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

下一步

#

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