前言
@H_404_2@Flutter 是一个很有潜力的框架,但是目前使用Flutter的APP并不算很多,相关资料并不丰富,介绍现有工程引入Flutter的相关文章也比较少。项目从零开始,引入Flutter操作比较简单,但是现有工程引入Flutter 需要费很多精力和时间,这里是我在完成现有iOS工程引入Flutter后写的一次总结文章。Flutter 环境搭建
@H_404_2@首先是要搭建Flutter环境,之前也写了一篇相关文章搭建Flutter-iOS开发环境,可以参考一下 可以去官网查看:github.com/flutter/flu… 比较简单,这里不做赘述。现有iOS工程引入Flutter
一、建立Flutter module
@H_404_2@首先建立Flutter module,主要是用于获取改Flutter app中的Generated.xcconfig和frameworkcd some/path/
$ Flutter create -t module my_Flutter
复制代码
@H_404_2@也可以用
Flutter create app
复制代码
@H_404_2@建立Flutter app,Flutter app中也有Generated.xcconfig和framework
@H_404_26@二、新建配置文件
@H_404_2@根据官网,需要在工程中建立三个配置文件: Flutter.xcconfig
、Debug.xcconfig
、Release.xcconfig
在XCode工程对应目录,右击,选择新建文件(New File),选中创建xcconfig文件,如图:
在Flutter.xcconfig
中填写:
//这里填写前面建立的Flutter module 的Generated.xcconfig的路径
#include "../../my_Flutter/.ios/Flutter/Generated.xcconfig"
ENABLE_BITCODE=NO
复制代码
在 Debug.xcconfig
中填写:
#include "../Flutter/Flutter.xcconfig"
复制代码
@H_404_2@在 Release.xcconfig
中填写:
#include "../Flutter/Flutter.xcconfig"
FlutteR_BUILD_MODE=release
复制代码
@H_404_2@如果工程中用cocoapods管理,需要在 Debug.xcconfig
和Release.xcconfig
添加pod的路径:
@H_404_2@例如 Release.xcconfig
中
#include "Flutter.xcconfig"
#include "工程路径/Pods/Target Support Files/******.release.xcconfig"//pod路径
FlutteR_BUILD_MODE=release
复制代码
@H_404_2@在准备好这些xcconfig文件后,需要到XCode工程PROJECT(注意是PROJECT,不是Target)中的Configuration选项里,将对应的target选择成前面的xcconfig文件,Debug用Debug.xcconfig, Release用 Release.xcconfig
注意:进行Archive打包的时候,无论是Debug包还是Release包,需要切换到Release.xcconfig,不然会报错。

三、为编译Dart引入相关build phase
@H_404_2@在工程的Build Phase中新建一个Run Script
,用于编译时运行脚本, 建立方法如图:
Run Script
后,需要移动其对应的位置,需要在Target dependencies
之后,如果用cocoapods管理工程需要在,Check Pods Manifest.lock
之后:
"$FlutteR_ROOT/packages/Flutter_tools/bin/xcode_backend.sh" build
复制代码
@H_404_2@如图:
四、生成和添加Framework
@H_404_2@完成前面的配置后,便可以在XCode对工程进行编译build (Command+B),在提示“ Build Success ” 后,在iOS工程文件夹中会生成一个Flutter文件夹,将其加入工程目录中,建议和刚才xcconfig所在目录并列, @H_404_2@右键项目目录 ,选择 Add Files to 'xxx' ,Options选Create groups
,添加编译生成的Flutter文件夹。需要注意但是:Flutter目录下有个Flutter_assets
文件,不能使用Create groups
的方式添加,只能用Creat folder references
的Options, 否则Flutter页面会空白渲染不出来。可以删了Flutter_assets在用Creat folder reference
s重新添加。
@H_404_2@在添加完Flutter 文件夹之后,去Embeded Binaries
中添加App.framework
和Flutter.framework
五、AppDelegate改造
@H_404_2@Flutter需要和APP进行交互,需要对AppDelegate 进行改造: @H_404[email protected]文件中:#import <Flutter/Flutter.h>
@interface AppDelegate : FlutterAppDelegate <UIApplicationDelegate, FlutterAppLifeCycleProvider>
@end
复制代码
@H_404[email protected] 文件中:
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
{
FlutterPluginAppLifeCycleDelegate *_lifeCycleDelegate;
}
- (instancetype)init {
if (self = [super init]) {
_lifeCycleDelegate = [[FlutterPluginAppLifeCycleDelegate alloc] init];
}
return self;
}
- (BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
return [_lifeCycleDelegate application:application didFinishLaunchingWithOptions:launchOptions];
}
- (void)applicationDidEnterBackground:(UIApplication*)application {
[_lifeCycleDelegate applicationDidEnterBackground:application];
}
- (void)applicationWillEnterForeground:(UIApplication*)application {
[_lifeCycleDelegate applicationWillEnterForeground:application];
}
- (void)applicationWillResignActive:(UIApplication*)application {
[_lifeCycleDelegate applicationWillResignActive:application];
}
- (void)applicationDidBecomeActive:(UIApplication*)application {
[_lifeCycleDelegate applicationDidBecomeActive:application];
}
- (void)applicationWillTerminate:(UIApplication*)application {
[_lifeCycleDelegate applicationWillTerminate:application];
}
- (void)application:(UIApplication*)application
didRegisterUserNotificationSettings:(UIUserNotificationSettings*)notificationSettings {
[_lifeCycleDelegate application:application
didRegisterUserNotificationSettings:notificationSettings];
}
- (void)application:(UIApplication*)application
didRegisterForRemoteNotificationsWithDevicetoken:(NSData*)devicetoken {
[_lifeCycleDelegate application:application
didRegisterForRemoteNotificationsWithDevicetoken:devicetoken];
}
- (void)application:(UIApplication*)application
didReceiveRemoteNotification:(NSDictionary*)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[_lifeCycleDelegate application:application
didReceiveRemoteNotification:userInfo
fetchCompletionHandler:completionHandler];
}
- (BOOL)application:(UIApplication*)application
openURL:(NSURL*)url
options:(NSDictionary<UIApplicationopenURLOptionsKey, id>*)options {
return [_lifeCycleDelegate application:application openURL:url options:options];
}
- (BOOL)application:(UIApplication*)application handleOpenURL:(NSURL*)url {
return [_lifeCycleDelegate application:application handleOpenURL:url];
}
- (BOOL)application:(UIApplication*)application
openURL:(NSURL*)url
sourceApplication:(Nsstring*)sourceApplication
annotation:(id)annotation {
return [_lifeCycleDelegate application:application
openURL:url
sourceApplication:sourceApplication
annotation:annotation];
}
- (void)application:(UIApplication*)application
performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem
completionHandler:(void (^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0) {
[_lifeCycleDelegate application:application
performActionForShortcutItem:shortcutItem
completionHandler:completionHandler];
}
- (void)application:(UIApplication*)application
handleEventsForBackgroundURLSession:(nonnull Nsstring*)identifier
completionHandler:(nonnull void (^)(void))completionHandler {
[_lifeCycleDelegate application:application
handleEventsForBackgroundURLSession:identifier
completionHandler:completionHandler];
}
- (void)application:(UIApplication*)application
performFetchWithCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler {
[_lifeCycleDelegate application:application performFetchWithCompletionHandler:completionHandler];
}
- (void)addApplicationLifeCycleDelegate:(NSObject<FlutterPlugin>*)delegate {
[_lifeCycleDelegate addDelegate:delegate];
}
复制代码
六、新建FlutterViewController
@H_404_2@主要配置基本上已经完成,只要在main.dart
实现Flutter的业务代码即可

main.dart
实现的Flutter页面,如:
self.FlutterViewController = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil];
[self.navigationController pushViewController:self.FlutterViewController animated:YES];
复制代码
后语
@H_404_2@到这里现有iOS工程引入Flutter的工作就完成了,一些细节上的修改需要根据场景进行修改,例如Flutter和Native的数据通信等。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。