iOS工程内嵌Flutter篇

1,050 阅读3分钟

概述

使用Flutter从零开始开发App是一件轻松惬意的事情,但对于一些成熟的产品来说,完全摒弃原有App的历史沉淀,全面转向Flutter是有难度的。

因此使用Flutter去统一Android、iOS技术栈,把它作为已有原生App的扩展能力,通过有序推进来提升移动终端的开发效率。 

目前Flutter开发形式一般是两种:

1、统一办理形式:适用于创立Flutter工程来办理多端(ios、android、web、desktop,等)

2、三端分离形式:适用于在本来的项目中引证flutter模块,让flutter模块编译后产品集成在原生(ios、android、web、desktop等)项目中。

image.png

本篇主要研究三端分离形式下的iOS项目集成Flutter页面 Flutter UI组件可以作为嵌入式框架增量添加到现有的iOS应用程序中。有下面主流2种方法可以在现有应用程序中嵌入Flutter。

1.为Flutter引擎、编译的Dart代码和所有Flutter插件创建框架。在这里,您手动嵌入框架,并在Xcode中更新现有应用程序的构建设置。

  优点:集成使用时比较简单,集成方本地不需要安装Flutter SDK。

  缺点:更新时需要手动替换SDK 比较繁琐。

2.使用CocoaPods依赖管理器并安装Flutter SDK。在这种情况下,每次构建应用程序时,都会从源代码编译flatter_module。

  优点:CocoaPods便于统一的第三方sdk管理,集成比较方便简单,不需要繁琐配置

  缺点:使用方本地有需要安装Flutter SDK的要求。

鉴于两者互有特色,本篇都做介绍,在使用时 由读者根据具体项目场景作出取舍。

开发环境:

xCode版本(Version 14.2-14C18),iOS目标版本11.0以上

flutter版本3.3.7 dart版本2.18.4

第1种手动集成方案:

一、创建Flutter模块

1.进入Terminal命令行

2.选择flutter工程文件路径 cd user/flutter/path

3.创建模版工程文件 flutter create --template module my_flutter

注意:与新建单独运行的flutter有差异,命令行需要加上--template module,不然不能输出SDK

此时生成的flutter工程结构如下:

my_flutter/
├── .ios/
│   ├── Runner.xcworkspace
│   └── Flutter/podhelper.rb
├── lib/
│   └── main.dart
├── test/
└── pubspec.yaml

我们将Dart代码加至lib/目录即可

二、将flutter模块集成至原生工程

1.进入Terminal命令行

2.执行输出SDK动作  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

3.将Debug文件夹和Release文件夹拷贝至iOS原生工程目录下

4.打开原生工程目录,将sdk加入到Link Binary With Libraries,Build Settings > Build Phases > Link Binary With Libraries,

在目标设置里,将Release文件夹放置进去

image.png

image.png

image.png

第2种CocoaPods集成方案:

脚本:

# Uncomment the next line to define a global platform for your project

# platform :ios, '16.0'

  


## Flutter 模块的路径

flutter_application_path = './my_flutter'

load File.join(flutter_application_path, '.ios''Flutter''podhelper.rb')

  


  


target 'sw_flutter' do

  # Comment the next line if you don't want to use dynamic frameworks

  use_frameworks!

  install_all_flutter_pods(flutter_application_path)


end

  


  


post_install do |installer|

  flutter_post_install(installer) **if** **defined?** (flutter_post_install)

end

打开命令行执行

pod install

成功后在工程文件的pod栏出现下图,证明导入成功

image.png