集成
- 首先我们需要新建一个文件夹比如
Prometheum
、然后将我们原有的iOS项目也叫Prometheum
拖动到Prometheum
文件夹下,然后cd到Prometheum
文件夹下执行flutter create -t module flutter_prometheum
执行完命令会帮我们创建一个flutter_prometheum
文件夹,这个文件夹下就存放着flutter相关的东西。创建好之后Prometheum
和flutter_prometheum
文件中的内容如下:注意.git
和.gitignore
文件是后来添加的
- 然后我们需要修改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文件,主要作用是确保plugins
、Flutter.framework
、App.framework
嵌入到项目中。-
然后我们需要在
xcode
中设置bitcode
为No
,因为flutter
还不支持bitCode
接下来我们还需要添加两行脚本代码,在我们执行完
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
以上做完,我们原有的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
这个脚本的路径写成他自己本地的路径,结果可以了。但遗憾的是又报了另外一个错误,报错内容显示如下:
这里有显示在执行Run Flutter Build Script
时,有个路径还是我的路径,这里我就奇怪了,脚本就三行代码,两行都已经写成同事自己的绝对路径了,难道是source "${SRCROOT}/../flutter_prometheum/.ios/Flutter/flutter_export_environment.sh"
这句脚本也有问题,带着疑惑我,找到了这个文件,打开了它,果然,这个文件里写死了我的路径
然后我让同事把这里的路径写成他自己的,问题得到解决。
但是我又有个疑问,这个文件配置的每个人的路径都不一样,那以后每个人拉下来代码之后都需要修改一下这里的配置吗?我不知道怎么解决,目前想法是,人员固定后,我就把这个文件配置到ignore
文件中去,每个人在自己本地的这个文件中配置自己的路径
这里也把官网的集成注意点记录下来
- 官方文档
- 最低支持版本ios 8.0
- flutter module 和 native 工程可以不在同一个目录下,但是这样多人开发就不方便,因为podfile指定的路径是固定的,不能每个人都分别指定
- 可以不适用pod方式集成,如果不适用pod集成,每次改动都需要将flutter.framework、 app.framework等手动导入
- flutter 依赖的第三方库有修改时,native工程需要重新pod install
- .ios是个隐藏文件有可以能被覆盖