Flutter、iOS 混合开发

作者: 漂泊的掳人 | 来源:发表于2019-06-03 11:03 被阅读0次

    现有iOS工程添加Futter模块

    首先要安装flutter环境,参考:Flutter 环境搭建(Mac)
    虽然能混合但还不支持用Xcode直接开发,可以用VSCode。

    1. 创建flutter模块
      cd到项目根目录
      执行命令 flutter create -t module my_flutter

    2. podfile添加依赖
      添加:

    flutter_application_path = '../my_flutter'
    eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')), binding)
    '../my_flutter' 
    

    flutter_application_path 路径是 1 生成的文件夹
    保存
    安装 pod install 将Flutter模块作为依赖添加到主项目

    3.配置build phase,为编译Dart 代码添加编译选项
    xcode->build phase->如果没有点➕号->New Run Script Phase
    添加脚本

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

    编译如果报bitcode错误,关闭bitcode,目前flutter不支持。

    1. AppDelegate设置
      方法一:
      添加头文件
    #import <Flutter/Flutter.h>
    #import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h> 
    

    flutter协议 FlutterAppLifeCycleProvider

    @interface AppDelegate : UIResponder <UIApplicationDelegate, FlutterAppLifeCycleProvider>
    

    添加FlutterPluginAppLifeCycleDelegate的生命周期

    @implementation AppDelegate
    {
        FlutterPluginAppLifeCycleDelegate *_lifeCycleDelegate;
    }
    
    - (instancetype)init {
        if (self = [super init]) {
            _lifeCycleDelegate = [[FlutterPluginAppLifeCycleDelegate alloc] init];
        }
        return self;
    }
    
    - (BOOL)application:(UIApplication*)application
    didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
        [GeneratedPluginRegistrant registerWithRegistry:self]; // Only if you are using Flutter plugins.
        return [_lifeCycleDelegate application:application didFinishLaunchingWithOptions:launchOptions];
    }
    
    // Returns the key window's rootViewController, if it's a FlutterViewController.
    // Otherwise, returns nil.
    - (FlutterViewController*)rootFlutterViewController {
        UIViewController* viewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        if ([viewController isKindOfClass:[FlutterViewController class]]) {
            return (FlutterViewController*)viewController;
        }
        return nil;
    }
    
    - (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
        [super touchesBegan:touches withEvent:event];
    
        // Pass status bar taps to key window Flutter rootViewController.
        if (self.rootFlutterViewController != nil) {
            [self.rootFlutterViewController handleStatusBarTouches:event];
        }
    }
    
    - (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];
    }
    @end
    

    方法二:
    也可以修改 AppDelegate 继承自 FlutterAppDelegate

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

    修改AppDelegate.m文件:

    #import <FlutterPluginRegistrant/GeneratedPluginRegistrant.h> 
    
    #include "AppDelegate.h"
    
    @implementation AppDelegate
    
    - (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
      [GeneratedPluginRegistrant registerWithRegistry:self];
      return [super application:application didFinishLaunchingWithOptions:launchOptions];
    }
    
    @end
    

    5.简单使用 FlutterViewController

    跳转到一个flutter的VC:

    #import <Flutter/Flutter.h>
    #import "ViewController.h"
    
    @implementation ViewController
    - (void)viewDidLoad {
        [super viewDidLoad];
         FlutterViewController* flutterVC = [[FlutterViewController alloc] init];
        [self presentViewController:flutterVC animated:YES completion:nil];
    }
    

    设置路由跳转的别的组件上:

    [flutterVC setInitialRoute:@"xxxx"];
    

    Flutter的程序入口:你的flutter模块目录/lib/main.dart,Flutter开发使用的语言是dart,百度百科:

    Dart是面向对象的、类定义的、单继承的语言。它的语法类似C语言,可以转译为JavaScript,支持接口(interfaces)、混入(mixins)、抽象类(abstract classes)、具体化泛型(reified generics)、可选类型(optional typing)和sound type system [3]

    相关文章

      网友评论

        本文标题:Flutter、iOS 混合开发

        本文链接:https://www.haomeiwen.com/subject/bpogtctx.html