Flutter 和 iOS 混合开发 (framework方案)保姆级

方案优点:配置简单,开发人员不需要每个人都安装flutter环境
缺点是flutter 项目如有更新,需要重新打包framework

结合我们公司实际项目,此方案比较贴合。

一、新建flutter_module 项目

想要把flutter 集成进现有iOS 项目,必须要使用Flutter Module

通过命令 flutter create -t module flutter_module 创建模板项目

flutter create -t module flutter_module
//如下表示创建成功
All done!
Your module code is in flutter_module/lib/main.dart.

此处需注意,需要连外网操作

1副本.jpg

二、运行flutter_module项目

使用Android Studio 运行此项目


2副本.jpg

如图已经运行起来

三、将flutter打包成framework

.ios文件下,做以下处理

  1. 处理下热更新配置,否则引用后的Flutter 运行后无法拔掉USB,拔掉就报如下错误:
3副本.jpg

原因是 在 iOS 14 及以上版本中,Flutter 应用的调试模式只能通过 Flutter 工具或集成开发环境(IDE)启动。这是因为 Apple 对于应用程序的启动和调试过程进行了更严格的限制,以提高安全性和隐私保护
处理方法是
在ios 文件夹下,xcode 运行Runner 项目

4.png

修改配置,在Build Settings 下新增User-Defined 子项 FLUTTER_BUILD_MODE ,如下图

5.png

2.可以将项目的证书、bundle id 在此处处理下

使用命令制作framework

1.cd 到 Flutter_module 文件夹下

2.输入如下命令:

flutter build ios --debug
flutter build ios --release --no-codesign

//如下就表示构建完成
Building com.example.flutterModuleLU for device (ios-release)...
Running Xcode build...                                                  
 └─Compiling, linking and signing...                         5.7s
Xcode build done.                                           37.5s
 

此处需要注意的是,执行命令的时候,有可能会报错,会弹出错误弹框

6.jpg

此时,到系统偏好设置中,打开安全与隐私,授权强制打开。然后重新执行命令

这时就可以看到创建好的framework了


7.png
四、验证测试

1、将生成的两个framework拖到项目中


8.png

这里需要注意一点:
设置的 General > Frameworks, Libraries, and Embedded Content 下,然后在 Embed 下拉列表中选择 “Embed & Sign”。

9.png

试一下
在AppDelegate.h文件中

#import <UIKit/UIKit.h>
#import <Flutter/Flutter.h>

@interface AppDelegate : FlutterAppDelegate <UIApplicationDelegate>


@end

在FlutterDemoViewController.m 中

#import "ViewController.h"
#import <Flutter/Flutter.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 40)];
    [btn setTitle:@"按钮" forState:UIControlStateNormal];
    [btn setTitleColor:UIColor.orangeColor forState:UIControlStateNormal];
    [btn addTarget:self action:@selector(clickAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
    // Do any additional setup after loading the view.
}

-(void)clickAction {
    FlutterViewController * flutter = [[FlutterViewController alloc]init];
    [self presentViewController:flutter animated:YES completion:^{
        
    }];
}

@end
截圖 2024-11-14 19.44.53.png

收工!

您的打赏,是咱不懈更新的动力 😊

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容