将 Flutter module 集成到 iOS 组件项目
相关文档:将 Flutter module 集成到 iOS 项目 - Flutter 中文文档 - Flutter 中文开发者网站 - Flutter
Flutter UI 组件可以渐进式地内嵌到你现有的 iOS 应用中,下面是几种方法:
-
使用 CocoaPods 依赖管理器安装 Flutter SDK 使用这种方法,每次构建应用的时候都会从源代码中编译
flutter_module。(推荐) -
创建一个框架,把 Flutter 引擎、已编译的 Dart 代码和所有 Flutter 插件都放进去 这种方式你可以手动嵌入这个框架,并在 Xcode 中更改现有的应用的构建设置。如果不想要求开发团队的每一位成员都在本地安装 Flutter SDK 和 Cocoapods,这种方式比较适用。
-
为已编译的 Dart 代码和所有 Flutter 插件创建一个框架,对 Flutter 引擎使用 CocoaPods 来管理 这种方式是将应用内容和插件作为内嵌的框架,但将 Flutter 引擎作为 CocoaPods podspec 分发。这有点类似第二种方式,但是它为分发大型的 Flutter.xcframework 文件提供了替代方案。
** 注意 由于iOS项目为组件架构,所以使用第2种方式。生成framework形式进行在组件target导入使用。
创建 Flutter module
为了将 Flutter 集成到你的既有应用里,参考上面的任意方法先创建一个 Flutter module。
在命令行中执行:
content_copy
cd some/path/
flutter create --template module my_flutter
Flutter module 会创建在 some/path/my_flutter/ 目录。如果你使用上述第一种方法,则应在与现有 iOS 应用工程的父目录中创建这个 Flutter module。
在这个目录中,你可以像在其它 Flutter 项目中一样,执行 flutter 命令。比如 flutter run --debug 或者 flutter build ios。同样,你也可以通过 Android Studio/IntelliJ 或者 VS Code 中的 Flutter 和 Dart 插件运行这个 module,在集成到现有应用前,这个项目在 Flutter module 中包含了一个单视图的示例代码,对 Flutter 侧代码的测试会有帮助。
Module 的目录结构
在 my_flutter module 里,目录结构和普通 Flutter 应用类似:
content_copy
my_flutter/
├── .ios/
│ ├── Runner.xcworkspace
│ └── Flutter/podhelper.rb
├── lib/
│ └── main.dart
├── test/
└── pubspec.yaml
添加你的 Dart 代码到 lib/ 目录。
添加 Flutter 依赖到 my_flutter/pubspec.yaml,包括 Flutter packages 和 plugins。
.ios/ 隐藏文件夹包含了一个 Xcode workspace,用于单独运行你的 Flutter module。它是一个独立启动 Flutter 代码的壳工程,并且包含了一个帮助脚本,用于编译 framewroks 或者使用 CocoaPods 将 Flutter module 集成到你的既有应用。
在你的既有应用中集成 Flutter module
在你的 module 开发完成后,你就能使用页面顶部描述的方法将其嵌入到应用中去了。
** 提示
你可以在模拟机和真机上运行 Debug 模式,在真机上运行 Release 模式。
在 Xcode 中集成 frameworks
你可以创建必备的 frameworks,手动修改既有 Xcode 项目,将他们集成进去。当你组内其它成员们不能在本地安装 Flutter SDK 和 CocoaPods,或者你不想使用 CocoaPods 作为既有应用的依赖管理时,这种方法会比较合适。但是每当你在 Flutter module 中改变了代码,都必须运行 flutter build ios-framework。
下面的示例假设你想在 some/path/MyApp/Flutter/ 目录下创建 frameworks:
content_copy
flutter build ios-framework --output=some/path/MyApp/Flutter/
content_copy
some/path/MyApp/
└── Flutter/
├── Debug/
│ ├── Flutter.xcframework
│ ├── App.xcframework
│ ├── FlutterPluginRegistrant.xcframework (only if you have plugins with iOS platform code)
│ └── example_plugin.xcframework (each plugin is a separate framework)
├── Profile/
│ ├── Flutter.xcframework
│ ├── App.xcframework
│ ├── FlutterPluginRegistrant.xcframework
│ └── example_plugin.xcframework
└── Release/
├── Flutter.xcframework
├── App.xcframework
├── FlutterPluginRegistrant.xcframework
└── example_plugin.xcframework
组件Target中链接到框架
你可以在组件的podspec文件中链接生成的framework。
s.vendored_frameworks = 'Flutter/*.xcframework'
终端执行下 podinstall ,组件中会自动生成所链接的Flutter module的framework。
** 注意 由于Flutter支持的编译flag和Xcode有不同,所以需要在podspec文件中支持一些架构编译。
s.pod_target_xcconfig = { 'VALID_ARCHS' => 'x86_64 arm64' }
同时iOS主项目由于版本问题,和加载静态库也需要排除一些架构,防止打包和模拟器运行失败。