国产亚洲欧美人成在线,免费视频爱爱太爽了无码,日本免费一区二区三区高清视频 ,国产真实伦对白精彩视频

歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
電話(huà)圖標(biāo) 余先生:13699882642

網(wǎng)站百科

為您解碼網(wǎng)站建設(shè)的點(diǎn)點(diǎn)滴滴

現(xiàn)有iOS工程引入Flutter

發(fā)表日期:2018-10 文章編輯:小燈 瀏覽次數(shù):1914

前言

Flutter 是一個(gè)很有潛力的框架,但是目前使用Flutter的APP并不算很多,相關(guān)資料并不豐富,介紹現(xiàn)有工程引入Flutter的相關(guān)文章也比較少。項(xiàng)目從零開(kāi)始,引入Flutter操作比較簡(jiǎn)單,但是現(xiàn)有工程引入Flutter 需要費(fèi)很多精力和時(shí)間,這里是我在完成現(xiàn)有iOS工程引入Flutter后寫(xiě)的一次總結(jié)文章。

Flutter 環(huán)境搭建

首先是要搭建Flutter環(huán)境,之前也寫(xiě)了一篇相關(guān)文章搭建Flutter-iOS開(kāi)發(fā)環(huán)境,可以參考一下
可以去官網(wǎng)查看:https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps
比較簡(jiǎn)單,這里不做贅述。

現(xiàn)有iOS工程引入Flutter

一、建立Flutter module

首先建立flutter module,主要是用于獲取改flutter app中的Generated.xcconfig和framework

cd some/path/ $ flutter create -t module my_flutter 

也可以用

flutter create app 

建立flutter app,flutter app中也有Generated.xcconfig和framework

二、新建配置文件

根據(jù)官網(wǎng),需要在工程中建立三個(gè)配置文件:
Flutter.xcconfig 、Debug.xcconfigRelease.xcconfig
在XCode工程對(duì)應(yīng)目錄,右擊,選擇新建文件(New File),選中創(chuàng)建xcconfig文件,如圖:

Flutter.xcconfig中填寫(xiě):
 //這里填寫(xiě)前面建立的flutter module 的Generated.xcconfig的路徑 #include "../../my_flutter/.ios/Flutter/Generated.xcconfig" ENABLE_BITCODE=NO 
Debug.xcconfig中填寫(xiě):
#include "../Flutter/Flutter.xcconfig"

Release.xcconfig中填寫(xiě):

#include "../Flutter/Flutter.xcconfig" FLUTTER_BUILD_MODE=release 

如果工程中用cocoapods管理,需要在 Debug.xcconfigRelease.xcconfig添加pod的路徑:

例如 Release.xcconfig

#include "Flutter.xcconfig" #include "工程路徑/Pods/Target Support Files/******.release.xcconfig"http://pod路徑 FLUTTER_BUILD_MODE=release 

在準(zhǔn)備好這些xcconfig文件后,需要到XCode工程PROJECT(注意是PROJECT,不是Target)中的Configuration選項(xiàng)里,將對(duì)應(yīng)的target選擇成前面的xcconfig文件,Debug用Debug.xcconfig, Release用 Release.xcconfig

注意:進(jìn)行Archive打包的時(shí)候,無(wú)論是Debug包還是Release包,需要切換到Release.xcconfig,不然會(huì)報(bào)錯(cuò)。

三、為編譯Dart引入相關(guān)build phase

在工程的Build Phase中新建一個(gè)Run Script,用于編譯時(shí)運(yùn)行腳本,
建立方法如圖:

建立Run Script后,需要移動(dòng)其對(duì)應(yīng)的位置,需要在Target dependencies之后,如果用cocoapods管理工程需要在,Check Pods Manifest.lock之后:

在腳本框中,填入以下代碼,用于引進(jìn)Flutter中的xcode_backend腳本:

"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build 

如圖:


四、生成和添加Framework

完成前面的配置后,便可以在XCode對(duì)工程進(jìn)行編譯build (Command+B),在提示“ Build Success ” 后,在iOS工程文件夾中會(huì)生成一個(gè)Flutter文件夾,將其加入工程目錄中,建議和剛才xcconfig所在目錄并列,

右鍵項(xiàng)目目錄 ,選擇 Add Files to 'xxx' ,Options選Create groups,添加編譯生成的Flutter文件夾。需要注意但是:Flutter目錄下有個(gè)flutter_assets文件,不能使用Create groups的方式添加,只能用Creat folder references的Options, 否則Flutter頁(yè)面會(huì)空白渲染不出來(lái)。可以刪了flutter_assets在用Creat folder references重新添加。

在添加完Flutter 文件夾之后,去Embeded Binaries中添加App.frameworkFlutter.framework

五、AppDelegate改造

Flutter需要和APP進(jìn)行交互,需要對(duì)AppDelegate 進(jìn)行改造:

AppDelegate.h文件中:

#import <Flutter/Flutter.h>@interface AppDelegate : FlutterAppDelegate <UIApplicationDelegate, FlutterAppLifeCycleProvider>@end 

AppDelegate.m 文件中:

#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:applicationdidReceiveRemoteNotification:userInfofetchCompletionHandler: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*)sourceApplicationannotation:(id)annotation { return [_lifeCycleDelegate application:applicationopenURL:urlsourceApplication:sourceApplication annotation:annotation]; }- (void)application:(UIApplication*)application performActionForShortcutItem:(UIApplicationShortcutItem*)shortcutItem completionHandler:(void (^)(BOOL succeeded))completionHandler NS_AVAILABLE_IOS(9_0) { [_lifeCycleDelegate application:applicationperformActionForShortcutItem: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

主要配置基本上已經(jīng)完成,只要在main.dart實(shí)現(xiàn)Flutter的業(yè)務(wù)代碼即可


在原有工程中 ,建立FlutterViewController來(lái)承載main.dart實(shí)現(xiàn)的Flutter頁(yè)面,如:

self.flutterViewController = [[FlutterViewController alloc] initWithProject:nil nibName:nil bundle:nil]; [self.navigationController pushViewController:self.flutterViewController animated:YES]; 

后語(yǔ)

到這里現(xiàn)有iOS工程引入Flutter的工作就完成了,一些細(xì)節(jié)上的修改需要根據(jù)場(chǎng)景進(jìn)行修改,例如Flutter和Native的數(shù)據(jù)通信等。


本頁(yè)內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過(guò)網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶(hù)學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁(yè)中由涉嫌抄襲的內(nèi)容,請(qǐng)及時(shí)與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會(huì)在5工作日內(nèi)聯(lián)系您,一經(jīng)查實(shí),本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://www.jstctz.cn/18169.html
相關(guān)APP開(kāi)發(fā)