Flutter与iOS原生混合开发

简介: Flutter与iOS原生混合开发

一、Flutter工程创建

Flutter有四种工程类型:

  • Flutter Application:Flutter应用
  • Flutter Module :Flutter与原生混合开发
  • Flutter Plugin:Flutter插件
  • Flutter Package:纯Dart组件

原生与混合开发需要创建Flutter Module工程;

1. Android Studio创建方式,Project type选择Module:

2. 命令行创建方式:

flutter create -t module --org com.example 工程名称

二、Xcode工程创建

直接创建Xcode App项目即可(文件夹最好和fluuter module项目文件夹路径保持一致,否则需要修改相对路径)

三、混合开发工程配置

主要是在已有原生iOS工程项目中,集成Flutter功能模块

方式一

利用Cocoapods导入Flutter项目功能模块(开发者必须配置Flutter开发环境

1. 初始化Pods

pod init

2. Podfile中新增如下(注意路径问题)

# Uncomment the next line to define a global platform for your project
platform :ios, '11.0'
flutter_application_path = '../fluttermodule'
load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
target 'NativeOCTest' do
  install_all_flutter_pods(flutter_application_path)
  use_frameworks!
end
post_install do |installer|
  flutter_post_install(installer) if defined?(flutter_post_install)
end

3.开Xcode工程,使用如下代码调起Flutter页面,运行即可;

#import "ViewController.h"
#import <Flutter/Flutter.h>
@interface ViewController ()
@property(strong, nonatomic) FlutterViewController *flutterVC;
@property(strong, nonatomic) FlutterEngine *flutterEngine;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    [self test];
}
- (void)test {
    self.flutterVC.modalPresentationStyle = UIModalPresentationFullScreen;
    [self presentViewController:self.flutterVC animated:YES completion:nil];
}
- (FlutterEngine *)flutterEngine {
    if (!_flutterEngine) {
        FlutterEngine *engine = [[FlutterEngine alloc] init];
        if (engine.run) {
            _flutterEngine = engine;
        }
    }
    return _flutterEngine;
}
- (FlutterViewController *)flutterVC {
    if (!_flutterVC) {
        _flutterVC = [[FlutterViewController alloc] initWithEngine:self.flutterEngine nibName:nil bundle:nil];
    }
    return _flutterVC;
}
@end

方式二:

利用framework集成到原生工程里面(原生开发工程师无需配置Flutter环境1. 进入到Flutter module项目工程所在文件夹、执行以下命令:

flutter build ios-framework --output=../flutter_export

2. 在Flutter工程目录下会生成如下文件夹以及framework

3. 打开Xcode工程,选中Targets -> General -> Frameworks,Libraries,and Embedded Content,点击+号,然后点击Add Other -> Add Files,选中添加App.xcframework和Flutter.xcframework4. 添加上述调起Flutter的代码即可正常运行;

方式三:

利用Cocoapods集成到原生工程里面(原生开发工程师无需配置Flutter环境

1. 进入到Flutter module项目工程所在文件夹、执行以下命令:

flutter build ios-framework --cocoapods --output=../flutter_export

2. 在Flutter工程目录下会生成如下文件夹以及framework(与方式二的区别是没有了Flutter.xcframework)3. 原生工程中集成Pods环境

platform :ios, '11.0'
target 'NativeOC' do
  use_frameworks!
  pod 'Flutter', :podspec => '../flutter_export/Debug/Flutter.podspec'
end

4. 打开Xcode工程,选中Targets -> General -> Frameworks,Libraries,and Embedded Content,点击+号,然后点击Add Other -> Add Files,选中添加App.xcframework

5. 添加上述调起Flutter代码即可正常运行;

方式四:

利用git自动化构建CI原生开发工程师无需配置Flutter环境

1. 新建git远程代码仓库并把原生代码和Flutter代码上传上去当前文件夹结构:2. 点击Actions

3. 创建Action

自动化脚本相关代码

name: FlutterAction
on: [push]
jobs:
  check:
    name: Test on ${{ matrix.os }}
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v3
      - uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.7.6'  
          channel: 'stable'
      - run: cd fluttermodule && flutter build ios-framework --cocoapods --output=../NativeOC/Flutter
      - run: |
         git add .
         git commit -m 'build flutter action framework' 
      - name: Push changes
        uses: ad-m/github-push-action@master
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

注意仓库的设置,否则会提示没有权限

执行状态

运行成功Actions状态改变git仓库中出现了一个Flutter文件夹

4. 拉取代码,并配置Pod内容,同方式三,注意路径问题

platform :ios, '11.0'
target 'NativeOC' do
  use_frameworks!
  pod 'Flutter', :podspec => 'Flutter/Debug/Flutter.podspec'
end

目录结构

5. 添加上述调起Flutter的代码即可正常运行,后续只需push代码即可同步更新Flutter内容;

相关文章
|
8月前
|
iOS开发
Flutter与iOS原生通信方式
Flutter与iOS原生通信方式
318 2
|
2天前
|
开发框架 前端开发 Android开发
【Flutter 前端技术开发专栏】Flutter 与原生模块通信机制
【4月更文挑战第30天】本文探讨了Flutter作为跨平台开发框架与原生Android和iOS交互的必要性,主要通过方法调用和事件传递实现。文中详细介绍了Flutter与Android/iOS的通信方式,数据传输(包括基本和复杂类型),性能优化,错误处理以及实际应用案例。理解并掌握这一通信机制对开发高质量移动应用至关重要,未来有望随着技术发展得到进一步优化。
【Flutter 前端技术开发专栏】Flutter 与原生模块通信机制
|
2天前
|
Dart 前端开发 Android开发
【Flutter前端技术开发专栏】Flutter与原生代码的集成与交互
【4月更文挑战第30天】本文探讨了如何在Flutter中集成和交互原生代码,以利用特定平台的API和库。当需要访问如蓝牙、特定支付SDK或复杂动画时,集成原生代码能提升效率和性能。集成方法包括:使用Platform Channel进行通信,借助现有Flutter插件,以及Android和iOS的Embedding。文中通过一个电池信息获取的例子展示了如何使用`MethodChannel`在Dart和原生代码间传递调用。这些技术使开发者能充分利用原生功能,加速开发进程。
【Flutter前端技术开发专栏】Flutter与原生代码的集成与交互
|
2月前
|
运维 监控 安全
应用研发平台EMAS常见问题之sophix ios flutter热更新如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
79 0
|
4月前
|
移动开发 前端开发 JavaScript
探究移动端混合开发技术:React Native、Weex、Flutter的比较与选择
移动端混合开发技术在移动应用开发领域日益流行,为开发者提供了更高效的跨平台开发方案。本文将比较三种主流混合开发技术:React Native、Weex和Flutter,从性能、生态系统和开发体验等方面进行评估,以帮助开发者在选择适合自己项目的技术时做出明智的决策。
|
4月前
|
移动开发 前端开发 weex
React Native、Weex、Flutter 混合开发技术的比较与选择
移动应用已经成为人们日常生活中不可或缺的一部分,而混合开发技术也随之崛起并逐渐成为主流。本文将比较 React Native、Weex 和 Flutter 三种混合开发技术,并探讨它们各自的优缺点,以及如何根据项目需求做出选择。
58 1
|
4月前
|
移动开发 前端开发 weex
移动端混合开发技术:React Native、Weex、Flutter 之争
在移动应用开发领域,React Native、Weex 和 Flutter 是备受关注的混合开发技术。本文将对它们进行全面比较与评估,以帮助开发者做出明智的选择。我们将从开发生态、性能、跨平台能力和易用性等方面进行比较,为读者提供全面的参考和指导。
|
4月前
|
移动开发 Dart 前端开发
移动端混合开发技术:React Native、Weex、Flutter的比较与选择
移动应用的开发已经成为现代社会中的重要一环。本文将比较并评估三种主流的移动端混合开发技术:React Native、Weex和Flutter。通过对它们的特点、优势和劣势的分析,帮助开发者在选择适合自己项目的技术方案时做出明智的决策。
|
4月前
|
移动开发 开发框架 前端开发
移动端混合开发技术探析:React Native、Weex、Flutter的比较与选择
随着移动应用开发的高速发展,混合开发技术成为了一种备受关注的选择。本文将对移动端混合开发技术中的React Native、Weex和Flutter进行比较与探讨,分析它们在性能、开发体验、生态系统和跨平台支持等方面的差异,以及如何根据项目需求进行选择。
67 1
|
5月前
|
存储 移动开发 JavaScript
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
【原生】sd.js帮助您简化繁重的获取数据、存储数据(CRUD)骚操作(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)