Flutter Module官网三种接入办法

办法1:运用 CocoaPods 和 Flutter SDK 集成

  都在本地安装 Flutter SDK。你的工程在每次构建的的时候,都将会从源码里编译 Flutter 模块。只需求在 Xcode 中编译运用,就能够主动运转脚本来集成 Dart 代码和插件。这个办法答应你运用 Flutter module 中的最新代码快速迭代开发,而无需在 Xcode 以外履行额定的指令,这个办法也是Flutter官网推荐的集成办法,具体过程如下:

  1.在Podfile中增加下面代码

some/path/
├── my_flutter/
│   └── .ios/
│       └── Flutter/
│         └── podhelper.rb
└── MyApp/
    └── Podfile
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)

target 'MyApp' do
  install_all_flutter_pods(flutter_application_path)
end


  3.在Podfilepost_install部分,调用flutter_post_install(installer)

post_install do |installer|
  flutter_post_install(installer) if defined?(flutter_post_install)
end

  总结:此集成办法需求开发者本地集成了Flutter的运转环境,集成办法比较方便,便于办理,但在Podfile中集成的途径需求清晰,也便是说Flutter Module模块的代码需求和iOS项目的代码一致提交在一个库房中,但Flutter Module的模块代码肯定是期望有自己代码库房,而且供给多端的才能支持,所以此刻会以subModule或许subTree的办法进行集成,这种在多人开发中提交维护会比较耗时耗力。

办法2:在 Xcode 中集成 frameworks

  除了上面的办法,你也能够创立必备的 frameworks,手动修正既有 Xcode 项目,将他们集成进去。当你组内其它成员们不能在本地安装 Flutter SDK 和 CocoaPods,或许你不想运用 CocoaPods 作为既有运用的依靠办理时,这种办法会比较适宜。但是每当你在 Flutter module 中改动了代码,都必须运转flutter build ios-framework。具体过程如下:

  1.生成Flutter Modole产品
  下面的示例假定你想在some/path/MyApp/Flutter/目录下创立 frameworks:

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

运转指令后产生的三种类型的产品如下:

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

  2.链接到项目中
  在产生的产品中对应了三种类型,三种类型的运用区别能够自行查找查阅本文不过多赘述,直接将Release中的产品拖到TargetsGeneral下面的Frameworks, Libraries, and Embedded Content中,正常编译运转即可!
  总结:此办法接入Flutter Module的长处是不需求开发人员安装Flutter环境的,缺点也很明显,由于不是源码接入,所以在Debug开发时调试比较困难,同时打包发布需求一些必要的手动操作来替换Framework。

办法3:运用 CocoaPods 在 Xcode 和 Flutter 结构中内嵌运用和插件结构

  除了将一个很大的 Flutter.framework 分发给其他开发者、机器或许继续集成 (CI) 系统之外,你能够加入一个参数--cocoapods将 Flutter 结构作为一个 CocoaPods 的 podspec 文件分发。这将会生成一个Flutter.podspec文件而不再生成 Flutter.framework 引擎文件。就像第二种集成办法那样,它将会生成 App.framework 和插件结构。过程如下:
  1.生成Flutter Modole产品
  要生成Flutter.podspec和结构,指令行切换到 Flutter module 根目录,然后运转以下指令:

flutter build ios-framework --cocoapods --output=some/path/MyApp/Flutter/
some/path/MyApp/
└── Flutter/
    ├── Debug/
    │   ├── Flutter.podspec
    │ ├── App.xcframework
    │ ├── FlutterPluginRegistrant.xcframework
    │ └── example_plugin.xcframework (each plugin with iOS platform code is a separate framework)
    ├── Profile/
    │   ├── Flutter.podspec
    │   ├── App.xcframework
    │   ├── FlutterPluginRegistrant.xcframework
    │   └── example_plugin.xcframework
    └── Release/
        ├── Flutter.podspec
        ├── App.xcframework
        ├── FlutterPluginRegistrant.xcframework
        └── example_plugin.xcframework

  2.链接到项目中
  在过程1中生成的产品中咱们能够看到既有spec文件也有xcframework文件,其中的spec文件对应的是Flutter SDK也便是Flutter的运转环境,这个环境在每次的编译中几乎不会改动,所以官网生成了一个远方的spec依靠,能够在podfile中进行远方依靠引进。

pod 'Flutter', :podspec => 'some/path/MyApp/Flutter/[build mode]/Flutter.podspec'

  其他的xcframework文件便是在事务迭代中需求经常变化的事务代码和一些三方库,这个能够继续运用办法2的集成办法进行拖入工程中引进。
  总结:此办法接入Flutter Module和办法2有些相似,仅仅在生成的产品中由本来的~Flutter.xcframework变成了Flutter.podspec,而且引进Flutter的办法由本来的本地引进变成长途引用,也是不需求开发人员本机配置Flutter开发环境。

Flutter Module集成的最佳实践

  以上是Flutter官网供给的在iOS工程中集成Flutter Module的三种办法;在讨论Flutter Module的集成最佳实践中,需求抛出两个问题:
1、期望Flutter Module生成的产品能够不手动拖入项目,能够进行远端依靠
2、期望在Debug模块是能够直接源码调试Flutter Module模块代码,能够进行热重载

  首先看第一个问题,想让iOS集成Flutter Module能够远端依靠,这个咱们能够在办法3中得到启发,办法三中运用了spec对Flutter SDK进行了远端依靠,那么咱们可不能够也运用自建的spec来长途依靠.xcframework产品呢?
  其实是能够的,咱们能够在远端建一个库房,名称就叫做FlutterFramewok,然后咱们本地新建一个spec文件名为FlutterModuleSDK.podspec


Pod::Spec.new do |spec|
  spec.name         = "FlutterFramewok"
  spec.version      = "1.0.1"
  spec.summary      = "flutter module framework"
  spec.description  = <<-DESC
                     Flutter Module 产品
                   DESC
  spec.homepage     = "http://EXAMPLE/FlutterFramewok"
  spec.license      =  { :type => 'MIT', :file => 'LICENSE' }
  spec.platform     = :ios, "8.0"
  spec.source       = { :git => "你自己的长途库房地址"}
  spec.requires_arc          = true
  spec.vendored_frameworks   = '*.xcframework'
end

  将办法三中生成的产品中的Release下的一切.xcframework文件同步到你的长途库房FlutterFramewok中,之后在iOS工程目录下引进FlutterModuleSDK.podspecFlutter.podspec,我是在根目录下创立了一个单独的文件夹FlutterSpecs进行办理

some/path/MyApp/
          └──FlutterSpecs/
             └──Flutter.podspec
             └──FlutterModuleSDK.podspec
          └── Podfile

  在引进了spec文件后,能够在podFile中进行远端依靠了,如下:

pod 'FlutterModuleSDK', :podspec => './FlutterSpecs/FlutterModuleSDK.podspec'
pod 'Flutter', :podspec => './FlutterSpecs/Flutter.podspec'

  至此,第一个问题就解决了,iOS工程不需求本地依靠Framework了,一切的开发人员能够一致依靠远端库房的Module产品以及Flutter环境,仅仅在远端的产品更新中稍显费事,不过后续也能够通过脚本进行远端库房的更新操作。
  那么关于第二个问题,想要在Debug环境下进行源码热更新调试,该怎么实现呢?其实咱们能够运用办法1中的pod集成来进行debug环境下的热更新调试,仅仅需求一个开关来操控下即可。在podFile中运用enable_flutter来手动操控Flutter Module的集成办法,当在开发事务时,需求源码的热更新功能,此刻能够设置enable_fluttertrue,当需求打包时能够设置enable_flutterfalse


platform :ios, '12.0'
# 支持源码调试开关
$enable_flutter = false
if $enable_flutter
 flutter_application_path = 'Flutter Module在你电脑上的绝对途径(这儿的每个开发人员的途径会不一样,不要求一致,只需途径正确就能够)'
 load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
end
target 'MyApp' do
 #增加源码调试开关
 if $enable_flutter
  install_all_flutter_pods(flutter_application_path)
 else
  pod 'FlutterModuleSDK', :podspec => './FlutterSpecs/FlutterModuleSDK.podspec'
  pod 'Flutter', :podspec => './FlutterSpecs/Flutter.podspec'
 end
end

开关翻开时,能够运用VSCode翻开Flutter Module模块,运用Attach to Flutter on Device来进行断点、热更新等相关调试了。

iOS项目接入Flutter Module探索

参考资料:

  • #Flutter混合开发-iOS
  • #在iOS项目中依靠Flutter Module