Flutter Modul集成到IOS项目

news2025/7/10 19:40:04

Flutter Modul集成到IOS项目中

  • 1. 创建一个Flutter Modul
  • 2.在既有应用中集成Flutter Modul
    • 2.1 Flutter的构建模式选择
      • 2.1.1 debug模式
      • 2.1.2 Release模式
      • 2.1.3 Podfile 模式
    • 2.2 Cocoapods管理依赖库集成方式
    • 2.3 直接在Xcode中集成framework
    • 2.4 Local Network Privacy Permissions(本地网络权限)

官方网站资料:Flutter modul集成到现有IOS项目
中文官网资料:Flutter modul集成到现有IOS项目

Flutter UI组件可以逐渐地内嵌到你现有的IOS中,官方提供一下三种方法:

  1. Use the CocoaPods dependency manager and installed Flutter SDK. In this case, the flutter_module is compiled from the source each time the app is built. (Recommended.) (使用Cocoapods依赖管理器安装Flutter SDK,每次构建应用都会从源码中编译flutter_modul 官方推荐)
  1. Create frameworks for the Flutter engine, your compiled Dart code, and all Flutter plugins. Here, you manually embed the frameworks, and update your existing application’s build settings in Xcode. This can be useful for teams that don’t want to require every developer to have the Flutter SDK and Cocoapods installed locally.(创建一个框架,把 Flutter 引擎、已编译的 Dart 代码和所有 Flutter 插件都放进去 这种方式你可以手动嵌入这个框架,并在 Xcode 中更改现有的应用的构建设置。如果不想要求开发团队的每一位成员都在本地安装 Flutter SDK 和 Cocoapods,这种方式比较适用。)
  1. Create frameworks for your compiled Dart code, and all Flutter plugins. Use CocoaPods for the Flutter engine. With this option, embed the frameworks for your application and the plugins in Xcode, but distribute the Flutter engine as a CocoaPods podspec. This is similar to the second option, but it provides an alternative to distributing the large Flutter.xcframework.(为已编译的 Dart 代码和所有 Flutter 插件创建一个框架,对 Flutter 引擎使用 CocoaPods 来管理 这种方式是将应用内容和插件作为内嵌的框架,但将 Flutter 引擎作为 CocoaPods podspec 分发。这有点类似第二种方式,但是它为分发大型的 Flutter.xcframework 文件提供了替代方案。)

开发环境必须要满足Flutter对Mac OS系统的版本要求,并且已经安装Xcode, Flutter支持IOS11及以上。此外还需要1.10版本以上的Cocoapods

1. 创建一个Flutter Modul

为了将Flutter集成到引用内,参考上面的任意方法创建一个Flutter Modul.执行命令行:flutter create --template module cocaopods_test(名称), 如果你是使用上面的第一种方法,来集成Flutter Modul,那么你应在与现有IOS应用工程父目录中创建这个Flutter Modul

在这个目录中,你可以像在其它 Flutter 项目中一样,执行 flutter 命令。比如 flutter run --debug 或者 flutter build ios。同样,你也可以通过 Android Studio/IntelliJ 或者 VS Code 中的 Flutter 和 Dart 插件运行这个 module,在集成到现有应用前,这个项目在 Flutter module 中包含了一个单视图的示例代码,对 Flutter 侧代码的测试会有帮助。

Flutter Modul工程结构目录和Flutter项目基本类似:
在这里插入图片描述

添加你的 Dart 代码到 lib/ 目录。

添加 Flutter 依赖到 my_flutter/pubspec.yaml,包括 Flutter packages 和 plugins。

.ios/ 隐藏文件夹包含了一个 Xcode workspace,用于单独运行你的 Flutter module。它是一个独立启动 Flutter 代码的壳工程,并且包含了一个帮助脚本,用于编译 framewroks 或者使用 CocoaPods 将 Flutter module 集成到你的既有应用。

提示:IOS的代码要添加到你既又的应用或者Flutter Plugin中, 而不是Flutter Modul的.ios/ 目录下。.ios/ 下的改变不会集成到你的既有应用,并且这有可能被 Flutter 重写
由于 .ios/ 目录是自动生成的,因此请勿对其进行版本控制。在新机器上构建 module 时,请在使用 Flutter module 构建 iOS 项目之前,先于 cocaopods_test 目录运行 flutter pub get 以生成 .ios/ 目录。

2.在既有应用中集成Flutter Modul

在你的Modul开发完成后,你能使用上面秒速的三种方式来集成Flutter Modul

提示: 你可以模拟器上和真机上运行Debug模式,在真机上运行Release模式。 文档资料-Flutter 的构建模式
使用Flutter会增加应用体积

2.1 Flutter的构建模式选择

  • 首先这里有三种模式供我们选择, 简单介绍下三种构建模式:
    • 开发过程中需要使用热重载功能,请选择debug模式。
    • 当你需要分析性能的时候, 选择使用podfile构建模式。
    • 发布应用的时候,需要使用release构建模式。

2.1.1 debug模式

在Debug模式下,app可以被安装在物理设备上,仿真器或则模拟器上运行测试。Debug模式,也意味着断点是开启的服务扩展是开启的针对快速开发和周期进行编译优化(但不是针对执行速度、二进制文件大小或者部署)调试开启,类似 开发者工具 等调试工具可以连接到进程里

默认情况下,使用指令flutter run 会使用Debug模式。

注意:热重载仅能在调试模式下运行; 仿真器和模拟器仅能在模拟器下运行;在调试模型下,应用的性能可能会掉帧或者卡顿, profile 模式下会更接近真机性能

2.1.2 Release模式

当你想要最大的优化以及最小的占用空间时,就使用Release模式来部署APP吧。release模式是不支持模拟器或则仿真器的,使用Release意味着:

  • 断点不可用
  • 调试信息不可见
  • 调试是禁用的
  • 编译针对快速启动、快速执行和小的package的大小进行了优化
  • 服务扩展是禁用的

命令flutter run --release会使用Release模式来进行编译, 你也可以 使用flutter build <target>针对特定目标编译release模式 ,请使用flutetr help build查看支持的列表, 也可以通过flutter build --release命令 使用release模式

2.1.3 Podfile 模式

profile 模式下,一些调试能力是被保留的—足够分析你的 app 性能。在仿真器和模拟器上,Profile 模式是不可用的,因为他们的行为不能代表真实的性能。 profile 模式和 release 类似,但有以下不同:

  • 一些服务扩展是启用的。例如,支持 performance overlay。
  • Tracing 是启用的,一些调试工具,比如 开发者工具 可以连接到进程里。

flutter run --profile 命令是使用 Profile 模式来编译的

注意:上述这些相关编译模式除了使用命令行, 相关的开发工具也提供了对应的编译模式,直接编译

2.2 Cocoapods管理依赖库集成方式

这个方法需要你的项目的所有开发者,都在本地安装 Flutter SDK。你的工程在每次构建的的时候,都将会从源码里编译 Flutter 模块。只需要在 Xcode 中编译应用,就可以自动运行脚本来集成 Dart 代码和插件。这个方法允许你使用 Flutter module 中的最新代码快速迭代开发,而无需在 Xcode 以外执行额外的命令。

如果你的既又应用还没有Podfile,那么需要你使用pod init 来创建一个。具体的Cocoapods管理依赖库的内容,这里就不多介绍了。这里默认大家都已经会使用Cocoapods管理工具。

首先我们需要再IOS项目中的Podflie文件中进行如下设置:
在这里插入图片描述

flutter_application_path = ‘…/…/…/cocoapods_test’ (把Flutter Modul项目的路径赋值给变量flutter_application_path)
load File.join(flutter_application_path, ‘.ios’, ‘Flutter’, ‘podhelper.rb’) (这个ruby的语法,简单的意思是返回一个字符串,由指定的项连接在一起,并使用文件分割符进行分隔。

  • File.join(flutter_application_path, ‘.ios’, ‘Flutter’, ‘podhelper.rb’) 等价于 “flutter_application_path/.iOS/Flutter/podhelper.rb”
  • load则是引入该文件,可以理解为将podhelper.rb文件导入进来。 )

当我们在IOS的项目Podfile文件中配置上述代码之后, 我们就可以执行pod install命令, 可能会发生如下错误:
在这里插入图片描述

原因是IOS项目中Podfile文件中配置的platform :ios, '9.0', IOS最低支持的版本低于Flutter Modul生成的IOS的库最低支持版本,导致的版本兼容错误。有两种解决方法:

  • 直接把IOS项目中的Podfile文件中的最低支持版本修改成不低于Flutter Modul中的最低支持版本
  • 修改Flutter Modul生成IOS库的版本(目前还没有找到怎么修改)

修改之后,执行pod install命令成功后如下:

在这里插入图片描述

flutter_post_install 方法(Flutter 3.1.0 中新增的)增加了原生 Apple Silicon arm64 iOS 模拟器的支持。它包括 if defined?(flutter_post_install) 的检查以确保你的 Podfile 在旧版本的没有该方法的 Flutter 上也能正常运行。

项目中的结构如下:
在这里插入图片描述

在这里插入图片描述

当你在 cocoapods_test/pubspec.yaml 改变了 Flutter plugin 依赖,需要在 Flutter module 目录运行 flutter pub get,来更新会被podhelper.rb 脚本用到的 plugin 列表,然后再次在你的应用目录下 运行 pod install.
podhelper.rb 脚本会把你的 plugins, Flutter.framework,和 App.framework 集成到你的项目中。
你应用的 Debug 和 Release 编译配置,将会集成相对应的 Debug 或 Release 的 编译产物。可以增加一个 Profile 编译配置用于在 profile 模式下测试应用。

注意:Flutter.frameworkFlutter engine 的框架, App.framework 是你的 Dart 代码的编译产物

在集成完成之后,可以打开你的IOS项目运行了。

2.3 直接在Xcode中集成framework

除了上面使用Cocoapods管理, 你还可以直接把Flutter Modul 打包成对应的framework,然后直接继承到你的IOS项目中,但是每当你修改了Flutter Modul中的代码,你都需要重新打包flutter build ios-framework,然后替换到你的IOS项目中。
例如:flutter build ios-framework --output=./MyApp/ Flutter/ (把打好的包输出到MyApp/ Flutter/路径下)

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

在这里插入图片描述

注意:始终使用相同目录下的 Flutter.xcframeworkApp.xcframework。如果你混合使用不同的目录下的(例如 Profile/Flutter.xcframework 以及 Debug/App.xcframework)将会导致运行失败

Tip: Xcode11以上会打包回自动生成对应的xcframework, 但是Xcode11及以下是不会自动生成的,需要你添加--xcframework --no-universal参数生成对应的XCFrawework, 而不是直接使用通用的framework

把framework集成到项目中后,在target 编译设置的 General > Frameworks, Libraries, and Embedded Content 下,然后在 Embed 下拉列表中选择 “Embed & Sign”。 示例如下:
在这里插入图片描述

官方还提供这种方式:(本人没有试过,经过上面的配置,项目已经可以正常运行起来)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

注意:生成的动态框架必须嵌入你的应用并且在运行时被加载。重点提示:插件会帮助你生成 静态或动态框架。静态框架应该直接链接而不是嵌入。如果你在应用中嵌入了静态框架,你的应用将不能发布到 App Store 并且会得到一个 Found an unexpected Mach-O header code 的 archive error

2.4 Local Network Privacy Permissions(本地网络权限)

在IOS14及以上固件版本中, 在应用版本的调试过程中启用Dart的DNS服务, 在Debug模式下需要再Xcode项目中配置本地网络访问权限, 然后才能使用热重载、DevTools等调试功能以及flutter attach指令调试功能

  1. 配置本地网络权限指令:
    NSBonjourServices :_dartobservatory._tcp
    NSLocalNetworkUsageDescription : 本地网络权限描述
    在这里插入图片描述

注意: 这里配置,必须只能配置再debug模式下,如果你配置到release模式下, 你的app可能遭遇AppStore的拒绝
在这里插入图片描述

当你配置完运行项目, 会弹出如下提示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/344545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

采用 spring 配置文件管理Bean

文章目录采用 spring 配置文件管理Bean一、安装配置Maven二、Spring 框架1、Spring 官网三、Spring 容器演示-采用Spring配置文件管理Bean1、创建Manev项目2、添加Spring依赖3、创建杀龙骑士类4、创建勇敢骑士类5、采用传统方式让勇敢骑士完成杀龙任务6、采用Spring 容器让勇敢…

创建Ubuntu虚拟机与Windows共享的文件夹

目录 1、Windows创建一个共享文件夹 2、在虚拟机的设置中选择Windows下的共享文件夹 3、在Ubuntu中查看共享文件夹 1、Windows创建一个共享文件夹 该共享文件夹可以被Windows和Ubuntu访问&#xff0c;需要注意的是&#xff0c;Ubuntu在共享目录下的一些操作会受到限制&…

图解经典电路之OCL差分功放-三极管分立器件电路分析

下面从简到繁,从框架到细节的顺序讲解电路。即先讲框架,然后逐渐添加电路细节,所以大家跟上思路。 1、第一步,尽可能的抽象这个电路,等效如下: 图二 OCL等效电路 整个OCL电路,可以等效为一个大功率的运放,加上几个电阻电容构成了一个同向放大器,就是这么简单。 为了便…

Linux常用命令---系统常用命令

Linux系统常用命令场景一&#xff1a; 查看当前系统内核版本相关信息场景二&#xff1a; sosreport 命令场景三&#xff1a; 如何定位并确定命令&#xff1f;场景四&#xff1a;查看当前系统运行负载怎场景五&#xff1a; 查看当前系统的内存可用情况场景六&#xff1a;查看网卡…

【DOTA】目标检测数据集介绍与使用

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 DOTA 数据集简单介绍 1. 正文 1.1 简介 数据集包含来自不同的传感器和平台的航拍图。每张图像的像素尺寸在 800 800 到 20,000 20,000 之间&#xf…

如何编写接口测试用例?

接口测试用例如何编写&#xff1f;下面简单给大家讲解一下。 接口测试用例是目前软件开发中不可或缺的一个重要部分&#xff0c;因此编写接口测试用例同样重要。 接口测试用例的作用非常明显&#xff0c;它能够帮助我们了解产品正在考验、调整它如何表现在特定情境之下、产品是…

2023金三银四,测试人还能找到好工作吗?

按照往年的惯例&#xff0c;春节后复工的 3 月、4 月是人员跳槽最频繁的时候&#xff0c;俗称“金三银四”。然而&#xff0c;市场大环境的影响&#xff0c;很多行业感受到了一丝寒冷的气息。我们以为受影响比较轻的互联网行业&#xff0c;头上也充满乌云&#xff0c;所谓互联网…

2023年浙江交安安全员考试题库及答案

百分百题库提供交安安全员考试试题、交安安全员考试真题、交安安全员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 50.根据《建设工程安全生产管理条例》第65条规定&#xff0c;施工单位有下列&#xff08;&#xff09;行…

JavaScript高级程序设计读书分享之3章——3.5操作符

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 目录 操作符 一元操作符 递增/递减操作符 一元加和减 布尔操作符 逻辑非 逻辑与 逻辑或 乘性操作符 乘法操作符 除法操作符 取模操作符 加性操作符 加法操作符 减法操作符 关系操作符 相等操…

使用python将EXCEL表格中数据转存到数据库

使用Python将excel表格中数据转存到数据库 1. 思路&#xff1a; 1&#xff09; 使用python读取excel表格中数据 2&#xff09;根据数据生成sql语句 3&#xff09;批量运行sql语句 2. 代码&#xff1a; import pandas as pddef readExcel(path, excel_file):return pd.read_e…

低代码开发平台|制造管理-质检管理搭建指南

1、简介1.1、案例简介本文将介绍&#xff0c;如何搭建制造管理-质检管理。1.2、应用场景质检分别包括来料质检、过程质检、成品质检&#xff0c;来料质检在采购物料入库后会自动发起来料质检的流程&#xff0c;质检合格才可提交结束流程&#xff1b;过程检是在生产过程中的质检…

小程序-滑块+iconfont下载本地使用

效果 <view style"padding: 5px;"><movable-area style"width: 100%;height: 100%;"><movable-view direction"all" style"width: 50px;height: 50px;background-color: green"> </movable-view></movable…

推荐一些不常见的搜索引擎

5.雅虎网来自 Yahoo.com 的屏幕截图&#xff0c;2023 年 2 月截至 2022 年 1 月&#xff0c;Yahoo.com&#xff08;Verizon Media&#xff09;的搜索市场份额为 11.2%。雅虎的优势在于多元化&#xff0c;除搜索外还提供电子邮件、新闻、金融等服务。二十多年来&#xff0c;雅虎…

MyBatis 之一(概念、创建项目、操作模式、交互流程)

1. MyBatis 是什么MyBatis 是一款优秀的持久层框架MyBatis 也是一个 ORM &#xff08;Object Relational Mapping&#xff09;框架&#xff0c;即对象关系映射它支持自定义 SQL、存储过程以及高级映射MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作MyBatis…

SpringAOP笔记【JavaEE】

SpringAOP 一、AOP理解 AOP是一种思想&#xff0c;SpringAOP是一个框架&#xff0c;提供了一种对AOP思想的实现&#xff0c;他们的关系就像MVC和SpringMVC、IOC与DI类似。 AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预…

CHAPTER 1 Zabbix介绍及安装

Zabbix介绍及安装1.1 Zabbix监控1 为什么要监控1.1 网站可用性2 监控什么东西2.1 监控范畴3 怎么来监控3.1 远程管理服务器3.2 监控硬件3.3 查看cpu相关3.4 内存3.5 磁盘3.6 监控网络4 监控工具总览5 zabbix介绍5.1 zabbix的组成5.2 zabbix监控范畴1.2 安装zabbix1 环境检查2 安…

磁疗为什么“没效果”?原来真相是这样!

很多人磁疗之后&#xff0c; 总爱迫不及待问一个问题&#xff1a; “这个多长时间见效啊&#xff1f;” …… 还有些人几天没有效果&#xff0c; 就果断下结论&#xff1a; “这东西没用&#xff01;” …… 有不少人错误地把磁疗等同于“药品”一样看待&#xff0c;总觉得…

RPA+保险后台部门擦出不一样“火花” | RPA案例

在保险行业中&#xff0c;后台业务线主要是为前台和中台等提供支持&#xff0c;提供公司整体运营服务&#xff0c;包括财务、信息、人力、综合办等。相对于中前台部门&#xff0c;后台部门离核心价值链更远一些&#xff0c;更偏支持部门&#xff0c;其中某些岗位与业务相关度强…

金三银四面试必看,复盘字节测试开发面试:一次测试负责人岗位面试总结

最近面试了某企业的测试负责人岗位&#xff0c;历经四面&#xff0c;收获蛮多的。 这篇文章&#xff0c;我想聊聊这次面试过程中的一些经历&#xff0c;以及些许经验和教训。 岗位要求 岗位名称&#xff1a;测试负责人 岗位要求&#xff1a;1、扎实的技术以及丰富的技术项目…

【半监督医学图像分割 2021 CVPR】CVRL 论文翻译

文章目录【半监督医学图像分割 2021 CVPR】CVRL 论文翻译摘要1. 介绍1.1 总览1.2 无监督对比学习2. 实验3. 总结【半监督医学图像分割 2021 CVPR】CVRL 论文翻译 论文题目&#xff1a;Momentum Contrastive Voxel-wise Representation Learning for Semi-supervised Volumetric…