美文网首页
原有iOS项目集成Flutter及遇到的问题

原有iOS项目集成Flutter及遇到的问题

作者: 张_何 | 来源:发表于2020-04-29 19:43 被阅读0次

    集成

    • 首先我们需要新建一个文件夹比如Prometheum、然后将我们原有的iOS项目也叫Prometheum拖动到Prometheum文件夹下,然后cd到Prometheum文件夹下执行flutter create -t module flutter_prometheum执行完命令会帮我们创建一个flutter_prometheum文件夹,这个文件夹下就存放着flutter相关的东西。创建好之后Prometheumflutter_prometheum文件中的内容如下:注意.git.gitignore文件是后来添加的
      Prometheum.png
    • 然后我们需要修改podfile文件,在podfile中添配置路径flutter_application_path = '../flutter_prometheum/' load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')install_all_flutter_pods(flutter_application_path)
      完全的podfile文件如下:
    source 'https://github.com/CocoaPods/Specs.git'
    
    flutter_application_path = '../flutter_prometheum/'
    load File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')
    
    platform :ios, '9.0'
    use_frameworks!
    target 'Prometheum' do
      use_frameworks!
    
      install_all_flutter_pods(flutter_application_path)
    
      pod 'Masonry', '1.1.0'
      ...
      pod 'KVOController', '1.2.0'
    end
    
    • 配置好pod文件之后,就可以cd到podfile所在目录下执行pod install了,执行完pod install 之后会在Prometheum/flutter_prometheum/.ios/Flutter/下帮我们生成一个podhelper.rb文件,这是一个ruby文件,主要作用是确保 pluginsFlutter.frameworkApp.framework嵌入到项目中。

    • 然后我们需要在xcode中设置bitcodeNo,因为flutter还不支持bitCode

      image.png
    • 接下来我们还需要添加两行脚本代码,在我们执行完pod install 后,会在我们的build Phases中帮我们新加一个脚本叫Run Flutter Build Script,我们需要将这个脚本挪动到Dependencies下,也就是第二的位置,然后脚本中增加。9月3日我重新创建的工程不加"$FLUTTER_ROOT"/packages/flutter_tools/bin/xcode_backend.sh embed这行脚本也可以,不把脚本放到第二的位置也行,flutter越来越省事了,

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

    以上做完,我们原有的iOS项目的flutter环境就配置好了。

    遇到的问题

    • 按照以上步骤集成后,我们自己本地是可以运行项目了,但是在上传到远程仓库之后,其他同事拉下来之后运行就报错了。这里是因为我们在使用flutter create -t module集成flutter环境的时候该命令帮我们创建.gitignore文件,但是这个.gitigonre文件当中的内容是不对的,按着这个ignore文件的配置,同事拉下来后很多文件都会找不到,所以需要我们自己去官网获取最新的ignore文件,然后针对ios和android编译产生的.ios目录和.android目录分别添加**/.ios/ 和 **/.android/
    # Miscellaneous
    *.class
    *.lock
    *.log
    *.pyc
    *.swp
    .DS_Store
    .atom/
    .buildlog/
    .history
    .svn/
    
    # IntelliJ related
    *.iml
    *.ipr
    *.iws
    .idea/
    
    # Visual Studio Code related
    .classpath
    .project
    .settings/
    .vscode/
    
    # Flutter repo-specific
    /bin/cache/
    /bin/mingit/
    /dev/benchmarks/mega_gallery/
    /dev/bots/.recipe_deps
    /dev/bots/android_tools/
    /dev/devicelab/ABresults*.json
    /dev/docs/doc/
    /dev/docs/flutter.docs.zip
    /dev/docs/lib/
    /dev/docs/pubspec.yaml
    /dev/integration_tests/**/xcuserdata
    /dev/integration_tests/**/Pods
    /packages/flutter/coverage/
    version
    analysis_benchmark.json
    
    # packages file containing multi-root paths
    .packages.generated
    
    # Flutter/Dart/Pub related
    **/doc/api/
    .dart_tool/
    .flutter-plugins
    .flutter-plugins-dependencies
    **/generated_plugin_registrant.dart
    .packages
    .pub-cache/
    .pub/
    build/
    flutter_*.png
    linked_*.ds
    unlinked.ds
    unlinked_spec.ds
    
    # Android related
    # 下面这句是我添加的
    **/.android/
    **/android/**/gradle-wrapper.jar
    **/android/.gradle
    **/android/captures/
    **/android/gradlew
    **/android/gradlew.bat
    **/android/local.properties
    **/android/**/GeneratedPluginRegistrant.java
    **/android/key.properties
    *.jks
    
    # iOS/XCode related
    # 下面这句是我添加的
    **/.ios/ 
    **/ios/**/*.mode1v3
    **/ios/**/*.mode2v3
    **/ios/**/*.moved-aside
    **/ios/**/*.pbxuser
    **/ios/**/*.perspectivev3
    **/ios/**/*sync/
    **/ios/**/.sconsign.dblite
    **/ios/**/.tags*
    **/ios/**/.vagrant/
    **/ios/**/DerivedData/
    **/ios/**/Icon?
    **/ios/**/Pods/
    **/ios/**/.symlinks/
    **/ios/**/profile
    **/ios/**/xcuserdata
    **/ios/.generated/
    **/ios/Flutter/.last_build_id
    **/ios/Flutter/App.framework
    **/ios/Flutter/Flutter.framework
    **/ios/Flutter/Flutter.podspec
    **/ios/Flutter/Generated.xcconfig
    **/ios/Flutter/app.flx
    **/ios/Flutter/app.zip
    **/ios/Flutter/flutter_assets/
    **/ios/Flutter/flutter_export_environment.sh
    **/ios/ServiceDefinitions.json
    **/ios/Runner/GeneratedPluginRegistrant.*
    
    # macOS
    **/macos/Flutter/GeneratedPluginRegistrant.swift
    **/macos/Flutter/Flutter-Debug.xcconfig
    **/macos/Flutter/Flutter-Release.xcconfig
    **/macos/Flutter/Flutter-Profile.xcconfig
    
    # Coverage
    coverage/
    
    # Symbols
    app.*.symbols
    
    # Exceptions to above rules.
    !**/ios/**/default.mode1v3
    !**/ios/**/default.mode2v3
    !**/ios/**/default.pbxuser
    !**/ios/**/default.perspectivev3
    !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
    !/dev/ci/**/Gemfile.lock
    

    修改好gitignore文件后,我们再更新代码到远程,同事拉下来就可以了。

    • 本以为解决完上面的问题后,同事更新下来就可以用了,结果还是报错,这里我首先让同事执行了一下pod install 然后关闭了bitcode,再在build Phases中添加了脚本,然后还是报错。这里我就奇怪了,报错说是/Users/***/flutter/packages/flutter_tools/bin/xcode_backend.sh: No such file or directory 这里我搞不懂为什么同事报的错为什么是我的绝对路径,我猜想应该是哪里的配置写死了我这边的路径,然后我就在xcode中搜索,但是没有结果。然后我让同事把xcode_backend.sh这个脚本的路径写成他自己本地的路径,结果可以了。但遗憾的是又报了另外一个错误,报错内容显示如下:
      image.png
      这里有显示在执行Run Flutter Build Script时,有个路径还是我的路径,这里我就奇怪了,脚本就三行代码,两行都已经写成同事自己的绝对路径了,难道是source "${SRCROOT}/../flutter_prometheum/.ios/Flutter/flutter_export_environment.sh" 这句脚本也有问题,带着疑惑我,找到了这个文件,打开了它,果然,这个文件里写死了我的路径
      image.png
      然后我让同事把这里的路径写成他自己的,问题得到解决。
      但是我又有个疑问,这个文件配置的每个人的路径都不一样,那以后每个人拉下来代码之后都需要修改一下这里的配置吗?我不知道怎么解决,目前想法是,人员固定后,我就把这个文件配置到ignore文件中去,每个人在自己本地的这个文件中配置自己的路径

    这里也把官网的集成注意点记录下来

    • 官方文档
    • 最低支持版本ios 8.0
    • flutter module 和 native 工程可以不在同一个目录下,但是这样多人开发就不方便,因为podfile指定的路径是固定的,不能每个人都分别指定
    • 可以不适用pod方式集成,如果不适用pod集成,每次改动都需要将flutter.framework、 app.framework等手动导入
    • flutter 依赖的第三方库有修改时,native工程需要重新pod install
    • .ios是个隐藏文件有可以能被覆盖

    相关文章

      网友评论

          本文标题:原有iOS项目集成Flutter及遇到的问题

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