将 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 run 或 flutter build ios。您也可以在 VS Code 或 Android 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 应用的过程
要求
#项目中工作的每位开发人员都必须安装本地版本的 Flutter SDK 和 CocoaPods。
示例项目结构
#本节假设您的现有应用和 Flutter 模块位于同级目录中。如果您有不同的目录结构,请调整相对路径。示例目录结构如下
-
my_flutter/
- .ios/
Flutter/
- podhelper.rb
-
MyApp/
- Podfile
更新您的 Podfile
#将您的 Flutter 模块添加到 Podfile 配置文件中。本节假设您将 Swift 应用命名为 MyApp。
-
(可选) 如果您现有的应用缺少
Podfile配置文件,请导航到应用目录的根目录。使用pod init命令创建Podfile文件。 -
更新您的
Podfile配置文件。在
platform声明之后添加以下行。MyApp/Podfilerubyflutter_application_path = '../my_flutter' load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')对于每个需要嵌入 Flutter 的 Podfile 目标 (target),添加对
install_all_flutter_pods(flutter_application_path)方法的调用。在前面的步骤设置之后添加这些调用。MyApp/Podfilerubytarget 'MyApp' do install_all_flutter_pods(flutter_application_path) end在
Podfile的post_install代码块中,添加对flutter_post_install(installer)的调用。此代码块应该是Podfile配置文件中的最后一个代码块。MyApp/Podfilerubypost_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 应用中,请完成以下程序。
-
刷新您的 Flutter 插件。
如果您更改了
pubspec.yaml文件中的 Flutter 依赖项,请在您的 Flutter 模块目录中运行flutter pub get。这会刷新podhelper.rb脚本读取的插件列表。flutter pub get -
使用 CocoaPods 嵌入插件和框架。
导航到
/path/to/MyApp/MyApp下的 iOS 应用项目。使用
pod install命令。pod install
您的 iOS 应用的 Debug(调试)和 Release(发布)构建配置会嵌入 该构建模式对应的 Flutter 组件。
-
构建项目。
在 Xcode 中打开
MyApp.xcworkspace。请务必打开
MyApp.xcworkspace,而不是打开MyApp.xcodeproj。.xcworkspace文件包含 CocoaPod 依赖项,而.xcodeproj则不包含。选择 Product > Build 或按下 Cmd + B。
设置 LLDB 初始化文件
#-
生成 Flutter LLDB 文件。
- 在您的 Flutter 应用程序中,运行以下命令
flutter build ios --config-only这将在
.ios/Flutter/ephemeral目录中生成 LLDB 文件。 -
设置 LLDB 初始化文件。
转到 Product > Scheme > Edit Scheme。
选择左侧边栏中的 Run(运行)部分。
使用与您在“更新您的 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 归档错误。
链接所有框架
#要链接必要的框架,请遵循此流程。
-
选择要链接的框架。
在 Project Navigator(项目导航器)中,点击您的项目。
点击 Build Phases(构建阶段)选项卡。
展开 Link Binary With Libraries(用库链接二进制文件)。

在 Xcode 中展开 Link Binary With Libraries 构建阶段
点击 +(加号)。
点击 Add Other...,然后点击 Add Files...。
在 Choose frameworks and libraries to add:(选择要添加的框架和库:)对话框中,导航到
/path/to/MyApp/Flutter/Release/目录。按住 Cmd 点击该目录中的框架,然后点击 Open。

在 Xcode 的 Choose frameworks and libraries to add: 对话框中选择要链接的框架
-
更新库路径以应对构建模式。
启动 Finder。
导航到
/path/to/MyApp/目录。右键点击
MyApp.xcodeproj并选择 Show Package Contents(显示包内容)。使用 Xcode 打开
project.pbxproj。该文件将在 Xcode 的文本编辑器中打开。这也会锁定 Project Navigator,直到您关闭文本编辑器。
在 Xcode 文本编辑器中打开的
project-pbxproj文件在
/* 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>"; };将前一步中突出显示的
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>"; };
-
更新搜索路径。
点击 Build Settings(构建设置)选项卡。
导航到 Search Paths(搜索路径)
双击 Framework Search Paths(框架搜索路径)右侧的内容。
在组合框中,点击 +(加号)。
输入
$(inherited),然后按下 Enter。点击 +(加号)。
输入
$(PROJECT_DIR)/Flutter/$(CONFIGURATION)/,然后按下 Enter。
在 Xcode 中更新 Framework Search Paths
链接框架后,它们应该会显示在目标 (target) 的 General(常规)设置的 Frameworks, Libraries, and Embedded Content(框架、库和嵌入内容)部分中。
嵌入动态框架
#要嵌入您的动态框架,请完成以下程序。
-
导航到 General > Frameworks, Libraries, and Embedded Content。
-
点击您的每个动态框架并选择 Embed & Sign(嵌入并签名)。

在 Xcode 中为您的每个框架选择 Embed & Sign
不要包含任何静态框架,包括
FlutterPluginRegistrant.xcframework。 点击 Build Phases(构建阶段)选项卡。
-
展开 Embed Frameworks(嵌入框架)。您的动态框架应显示在该部分中。

Xcode 中展开的 Embed Frameworks 构建阶段
-
构建项目。
在 Xcode 中打开
MyApp.xcworkspace。请务必打开
MyApp.xcworkspace,而不是打开MyApp.xcodeproj。.xcworkspace文件包含 CocoaPod 依赖项,而.xcodeproj则不包含。选择 Product > Build 或按下 Cmd + B。
设置 LLDB 初始化文件
#-
生成 Flutter LLDB 文件。
- 在您的 Flutter 应用程序中,如果尚未运行,请重新运行
flutter build ios-framework
flutter build ios-framework --output=/path/to/MyApp/Flutter/这将在
/path/to/MyApp/Flutter/目录中生成 LLDB 文件。 - 在您的 Flutter 应用程序中,如果尚未运行,请重新运行
-
设置 LLDB 初始化文件。
转到 Product > Scheme > Edit Scheme。
选择左侧边栏中的 Run(运行)部分。
将 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。
此方法仅适用于 beta 或 stable 发布渠道。
示例项目结构
#以下示例假设您要将框架生成到 /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 中。
pod 'Flutter', :podspec => '/path/to/MyApp/Flutter/[build mode]/Flutter.podspec'
链接并嵌入应用和插件框架
#Flutter 插件可能会产生 静态或动态框架。链接静态框架,永远不要嵌入它们。
如果您将静态框架嵌入到 iOS 应用中,您将无法将该应用发布到 App Store。发布将失败,并出现 Found an unexpected Mach-O header code 归档错误。
链接所有框架
#要链接必要的框架,请遵循此流程。
-
选择要链接的框架。
在 Project Navigator(项目导航器)中,点击您的项目。
点击 Build Phases(构建阶段)选项卡。
展开 Link Binary With Libraries(用库链接二进制文件)。

在 Xcode 中展开 Link Binary With Libraries 构建阶段
点击 +(加号)。
点击 Add Other...,然后点击 Add Files...。
在 Choose frameworks and libraries to add:(选择要添加的框架和库:)对话框中,导航到
/path/to/MyApp/Flutter/Release/目录。按住 Cmd 点击该目录中的框架,然后点击 Open。

在 Xcode 的 Choose frameworks and libraries to add: 对话框中选择要链接的框架
-
更新库路径以应对构建模式。
启动 Finder。
导航到
/path/to/MyApp/目录。右键点击
MyApp.xcodeproj并选择 Show Package Contents(显示包内容)。使用 Xcode 打开
project.pbxproj。该文件将在 Xcode 的文本编辑器中打开。这也会锁定 Project Navigator,直到您关闭文本编辑器。
在 Xcode 文本编辑器中打开的
project-pbxproj文件在
/* 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>"; };将前一步中突出显示的
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>"; };
-
更新搜索路径。
点击 Build Settings(构建设置)选项卡。
导航到 Search Paths(搜索路径)
双击 Framework Search Paths(框架搜索路径)右侧的内容。
在组合框中,点击 +(加号)。
输入
$(inherited),然后按下 Enter。点击 +(加号)。
输入
$(PROJECT_DIR)/Flutter/$(CONFIGURATION)/,然后按下 Enter。
在 Xcode 中更新 Framework Search Paths
链接框架后,它们应该会显示在目标 (target) 的 General(常规)设置的 Frameworks, Libraries, and Embedded Content(框架、库和嵌入内容)部分中。
嵌入动态框架
#要嵌入您的动态框架,请完成以下程序。
-
导航到 General > Frameworks, Libraries, and Embedded Content。
-
点击您的每个动态框架并选择 Embed & Sign(嵌入并签名)。

在 Xcode 中为您的每个框架选择 Embed & Sign
不要包含任何静态框架,包括
FlutterPluginRegistrant.xcframework。 点击 Build Phases(构建阶段)选项卡。
-
展开 Embed Frameworks(嵌入框架)。您的动态框架应显示在该部分中。

Xcode 中展开的 Embed Frameworks 构建阶段
-
构建项目。
在 Xcode 中打开
MyApp.xcworkspace。请务必打开
MyApp.xcworkspace,而不是打开MyApp.xcodeproj。.xcworkspace文件包含 CocoaPod 依赖项,而.xcodeproj则不包含。选择 Product > Build 或按下 Cmd + B。
设置 LLDB 初始化文件
#-
生成 Flutter LLDB 文件。
- 在您的 Flutter 应用程序中,如果尚未运行,请重新运行
flutter build ios-framework
flutter build ios-framework --output=/path/to/MyApp/Flutter/这将在
/path/to/MyApp/Flutter/目录中生成 LLDB 文件。 - 在您的 Flutter 应用程序中,如果尚未运行,请重新运行
-
设置 LLDB 初始化文件。
转到 Product > Scheme > Edit Scheme。
选择左侧边栏中的 Run(运行)部分。
将 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 或文本编辑器完成。以下说明假设使用默认的 Debug 和 Release。请根据应用的构建配置相应地调整名称。
-
创建一个新的属性列表。
在 Xcode 中打开您的项目。
在 Project Navigator 中,点击项目名称。
从编辑器窗格的 Targets 列表中,点击您的应用。
点击 Info 选项卡。
展开 Custom iOS Target Properties(自定义 iOS 目标属性)。
右键点击列表并选择 Add Row(添加行)。
从下拉菜单中,选择 Bonjour Services。这会在项目目录中创建一个名为
Info的新属性列表。它在 Finder 中显示为Info.plist。
-
将
Info.plist重命名为Info-Debug.plist点击左侧项目列表中的 Info 文件。
在右侧的 Identity and Type(标识和类型)面板中,将 Name(名称)从
Info.plist更改为Info-Debug.plist。
-
创建一个 Release 属性列表。
在 Project Navigator 中,点击
Info-Debug.plist。选择 File > Duplicate...(复制...)。您也可以按 Cmd + Shift + S。
在对话框中,将 Save As:(另存为:)字段设置为
Info-Release.plist并点击 Save(保存)。
-
将必要的属性添加到 Debug 属性列表中。
在 Project Navigator 中,点击
Info-Debug.plist。将字符串值
_dartVmService._tcp添加到 Bonjour Services 数组中。(可选) 若要设置您想要的自定义权限对话框文本,请添加键 Privacy - Local Network Usage Description(隐私 - 本地网络使用说明)。

添加了 Bonjour Services 和 Privacy - Local Network Usage Description 键的
Info-Debug属性列表
-
设置目标以针对不同的构建模式使用不同的属性列表。
在 Project Navigator(项目导航器)中,点击您的项目。
点击 Build Settings(构建设置)选项卡。
点击 All 和 Combined 子选项卡。
在搜索框中输入
plist。这会将设置限制为包含属性列表的设置。滚动列表,直到看到 Packaging。
点击 Info.plist File 设置。
将 Info.plist File 的值从
path/to/Info.plist更改为path/to/Info-$(CONFIGURATION).plist。
更新
Info.plist构建设置以使用构建模式特定的属性列表这在 Debug 中解析为 Info-Debug.plist,在 Release 中解析为 Info-Release.plist。

更新后的 Info.plist File 构建设置,显示配置变体
-
从 Build Phases 中移除 Release 属性列表。
在 Project Navigator(项目导航器)中,点击您的项目。
点击 Build Phases(构建阶段)选项卡。
展开 Copy Bundle Resources(复制包资源)。
如果此列表中包含
Info-Release.plist,请点击它,然后点击其下方的 -(减号)以从资源列表中删除该属性列表。
显示 Info-Release.plist 设置的 Copy Bundle 构建阶段。移除此设置。
-
您的 Debug 应用加载的第一个 Flutter 屏幕会提示本地网络权限。
点击 OK(确定)。
(可选) 若要在应用加载前授予权限,请启用 Settings > Privacy > Local Network > Your App(设置 > 隐私 > 本地网络 > 您的应用)。
缓解 Apple Silicon Mac 上的已知问题
#在 运行 Apple Silicon 的 Mac 上,宿主应用为 arm64 模拟器构建。虽然 Flutter 支持 arm64 模拟器,但某些插件可能不支持。如果您使用其中一个插件,可能会看到类似 Undefined symbols for architecture arm64 的编译错误。如果发生这种情况,请从宿主应用的模拟器架构中排除 arm64。
在 Project Navigator(项目导航器)中,点击您的项目。
点击 Build Settings(构建设置)选项卡。
点击 All 和 Combined 子选项卡。
在 Architectures(架构)下,点击 Excluded Architectures(排除的架构)。
展开以查看可用的构建配置。
点击 Debug。
点击 +(加号)。
选择 iOS Simulator。
双击 Any iOS Simulator SDK(任何 iOS 模拟器 SDK)的值列。
点击 +(加号)。
-
在 Debug > Any iOS Simulator SDK 对话框中输入
arm64。
将
arm64添加为您的应用的排除架构 按 Esc 关闭此对话框。
对 Release 构建模式重复这些步骤。
对任何 iOS 单元测试目标重复此操作。
下一步
#现在,您可以 添加 Flutter 屏幕 到您现有的 iOS 应用中。