美文网首页
Flutter&iOS混编

Flutter&iOS混编

作者: 大宝的爱情 | 来源:发表于2020-07-14 17:34 被阅读0次

    创建flutter工程,有Application,Module,Plugin,Package

    Flutter Application:标准的Flutter App工程,包含标准的Dart层与Native平台层

    Flutter Module :Flutter组件工程,仅包含Dart层实现,Native平台层子工程为通过Flutter自动生成的隐藏工程

    Flutter Plugin: Flutter平台插件工程,包含Dart层与Native平台层的实现

    Flutter Package: Flutter纯Dart插件工程,仅包含Dart层的实现,往往定义一些公共Widget

    方式一:Flutter官方已经给出的混编方案:

    参考最新链接:https://github.com/flutter/flutter/wiki/Upgrading-Flutter-added-to-existing-iOS-Xcode-project
    可以实现混编,此方案需要求开发的电脑上配置flutter环境。并且 iOS端开发与flutter端开发在代码纠缠性上会变得复杂化

    方法说明:在iOS工程的podfile文件中添加如下命令

    flutter_application_path = '../flutter_module/'
    
    load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
    
    target 'iOSProject' do
       use_frameworks!
       install_all_flutter_pods(flutter_application_path)
    end
    

    添加上述代码可以一次性将flutter的编译产物由此依赖进入iOS项目中,不用再每次去在Xcode->Build Phases中去添加设置脚本文件路径等繁琐操作,一定程度上简化了集成的繁琐性。

    2、将flutter以framework的形式通过Cocoapods引入iOS工程

    Cocoapods引入也分为两种方式:
    1,pod的本地路径化引入
    2,pod通过远程Git仓库引入(本地化打包好后传到git即可)

    pod的本地路径化引入

    1,创建外层文件夹 FlutterForIOS,并在该文件下创建iOS工程iOSProject,依次执行以下命令

    $ cd ~/Desktop/FlutterForIOS/iOSProject
    $ pod init
    $ pod install
    

    2,接下来创建名字为‘MyFlutterPod’的Pod库

    $ cd ~/Desktop/FlutterForIOS
    $ pod lib create MyFlutterPod
    

    终端依次输入所需类型:

    To get you started we need to ask a few questions, this should only take a minute.
    What platform do you want to use?? [ iOS / macOS ]
     > ios
    What language do you want to use?? [ Swift / ObjC ]
     > objc
    Would you like to include a demo application with your library? [ Yes / No ]
     > no
    Which testing frameworks will you use? [ Specta / Kiwi / None ]
     > none
    Would you like to do view based testing? [ Yes / No ]
     > no
    What is your class prefix?
     > xxxx
    Running pod install on your new library.
    
    

    创建完成之后会有一个工程自动打开,此工程为Pod工程,在Example->MyFlutterPod.xcworkspace打开后可以作为独立项目在此编码iOS代码之类的,暂时先不在此进行编写原生代码,关闭退出。

    将DFlutterModule放入MyFlutterPod路径下,终端打开,执行

    flutter packages get
    

    flutter pub run
    

    在当前文件夹执行快捷键:"command + shift + .",显示出隐藏文件夹,这时候会多出一个.ios文件夹

    注:如果新添加了flutter插件,也需要执行上述两个命令来安装刷新一下

    编译后会生成Flutter所依赖的相关的库文件。以debug版本的库文件为例进行framework打包
    当前目录终端执行:

    $ flutter build ios --debug      //编译debug产物
    

    执行完后可以看到:

    build目录下
    ios->Debug-iphoneos-> FlutterPluginRegistrant.framework

    ios->Debug-iphoneos-> 对应插件.framework

    .ios目录下
    Flutter-->App.framework Flutter-->engine-->Flutter.framework

    将这些文件移动到一个目录下(如ios_framework)

    编辑podspec文件
    打开podspec文件在end前一行添加以下命令

      s.static_framework = true
      p = Dir::open("ios_frameworks")
      arr = Array.new
      arr.push('ios_frameworks/*.framework')
      s.ios.vendored_frameworks = arr
    

    在iOSProject项目的podfile文件中执行pod引用
    在iOSProject工程下的podfile文件中添加

      platform :ios, '8.0'
    
      target 'iOSProject' do
      use_frameworks!
    
      pod 'MyFlutterPod', :path => '../MyFlutterPod'
    
      end
    

    之后执行

    $ pod install
    

    安装成功!!!

    第二种方法脚本安装:

    在dflutter下创建脚本文件

    $ cd ../flutter_module_for_ios
    $ touch move_file.sh   //1. 创建脚本文件
    $ open move_file.sh    //2. 打开脚本文件
    

    添加以下脚本代码

    if [ -z $out ]; then
        out='ios_frameworks'
    fi
    
    echo "准备输出所有文件到目录: $out"
    
    echo "清除所有已编译文件"
    find . -d -name build | xargs rm -rf
    flutter clean
    rm -rf $out
    rm -rf build
    
    flutter packages get
    
    addFlag(){
        cat .ios/Podfile > tmp1.txt
        echo "use_frameworks!" >> tmp2.txt
        cat tmp1.txt >> tmp2.txt
        cat tmp2.txt > .ios/Podfile
        rm tmp1.txt tmp2.txt
    }
    
    echo "检查 .ios/Podfile文件状态"
    a=$(cat .ios/Podfile)
    if [[ $a == use* ]]; then
        echo '已经添加use_frameworks, 不再添加'
    else
        echo '未添加use_frameworks,准备添加'
        addFlag
        echo "添加use_frameworks 完成"
    fi
    
    echo "编译flutter"
    flutter build ios --debug
    #release下放开下一行注释,注释掉上一行代码
    #flutter build ios --release --no-codesign
    echo "编译flutter完成"
    mkdir $out
    cp -r build/ios/Debug-iphoneos/*/*.framework $out
    #release下放开下一行注释,注释掉上一行代码
    #cp -r build/ios/Release-iphoneos/*/*.framework $out
    cp -r .ios/Flutter/App.framework $out
    cp -r .ios/Flutter/engine/Flutter.framework $out
    
    echo "复制framework库到临时文件夹: $out"
    
    libpath='../'
    
    rm -rf "$libpath/ios_frameworks"
    mkdir $libpath
    cp -r $out $libpath
    
    echo "复制库文件到: $libpath"
    

    注:脚本文件中的代码意思:将编译生成的debug版本的所需.framework库文件拷贝至ios_frameworks文件下并复制一份到MyFlutterPod目录下,后续若想编译生成release版本库文件时还需修改脚本文件查找对应上release标识

    执行脚本文件

    $ sh move_file.sh      //3. 执行脚本文件
    

    此时的ios_frameworks文件已经生成拷贝
    里面包含有我们前面提到所需要的.framework所有库文件
    重复上述podspec里添加脚本,添加到Podfile执行pod install即可安装成功

    这个对于新建工程很容易成功,直接可以混编,但是对于一些已有项目,涉及到库的应用,稍微复杂的就不太适用了,需要针对性的去处理,有问题欢迎加q交流:2282901666

    参考链接直达

    相关文章

      网友评论

          本文标题:Flutter&iOS混编

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