前段时间根据官方不是很新的混编 wiki 写了一篇混编相关的 demo 文章, 现在回看官方 wiki. 不知道优化了好几个版本. 针对网友的回复也有回复. 但现在看来部分回复可能失效, 也可能不是最优解, 所以亲自按照官方混编 wiki 优化了自己项目的混编, 看看和之前有什么不同(前提是不需要修改官方 flutter 的混编源文件)
一, 材料准备(不明白的可以先参考前一篇文章)
flutter 环境
flutter module (注意文件路径最好不要出现中文, 否则 flutter build 可能会出现 UTF8 等报错)
Xcode Debug/Release 配置文件
Pods (wiki 教程最新, 主要讲这种方式)
对比之前 Flutter.framework 是通过 pod 本地引入
1, 项目目录命令行执行 pod init,Podfile 文件编写以下代码, 后执行 pod install
- # 下面是复制官方 demo 的 podfile 内容修改:
- # 这里写你的 flutter module 相对路径
- flutter_application_path = '../flutter_module/'
- # NewHybridDemo 是你的项目名, 用你自己的, 只要 copy 下一行代码就行
- target 'NewHybridDemo' do
- eval(File.read(File.join(flutter_application_path, '.ios', 'Flutter', 'podhelper.rb')),binding)
- end
如果按官方的形式 pod install 总是报错, 请命令行指定到你 flutter module 目录执行 flutter packages get 完成后, 在指回 Xcode 工程目录执行 pod install
2, 配置文件编写 (可以不用写了, 因为 pod 的时候已经引入了 pod 的配置文件中了)
使用 pod 的配置即可
pod 的配置文件
- 3,Run Script
- "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
写完执行 Xcode build(cmd+B)操作, 你会发现项目中并没有生成 framework 等 Flutter 资源文件. 因为默认情况下 xcode_backend.sh 将 framework 打包到了 flutter module 中路径(flutter module)/.iOS/Flutter 中.
4, 胶水文件导入方式(项目同级创建混编资源存放文件夹)
创建混编资源存放文件夹
方式一: 手动到
(flutter module)/.iOS/Flutter
下将资源拖到刚创建好的 Flutter 文件夹下;
方式二: 修改 xcode_backend.sh 文件;
- // 搜索 local derived_dir="${SOURCE_ROOT}/Flutter"
- // 将它下面三行注释
- local derived_dir="${SOURCE_ROOT}/Flutter"
- # if [[ -e "${project_path}/.ios" ]]; then
- # derived_dir="${project_path}/.ios/Flutter"
- # fi
- RunCommand mkdir -p -- "$derived_dir"
- AssertExists "$derived_dir"
修改 `xcode_backend.sh` 文件
方式三: RunScript 写 cp 代码, 将
(flutter module)/.iOS/Flutter
下将资源使用命令行代码 copy 到 Flutter 文件夹中;(建议使用, 不用人工操作也不用担心官方后续修改 xcode_backend.sh 文件更新 flutter 冲突. 美滋滋~)
- # 删除本地 Flutter 文件夹
- rm -rf -- "$SOURCE_ROOT/Flutter"
- # 再生成 Flutter 文件夹
- mkdir -p "$SOURCE_ROOT/Flutter"
- # 编译生成
- "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build
- # 将胶水文件 copy 到本地文件夹
- cp -r -- "$FLUTTER_APPLICATION_PATH/.ios/Flutter/flutter_assets" "$SOURCE_ROOT/Flutter"
- cp -r -- "$FLUTTER_APPLICATION_PATH/.ios/Flutter/App.framework" "$SOURCE_ROOT/Flutter"
RunScript 写法
注意: 如果使用 pod 方式做胶水文件的话, Flutter.framework 就没必要导入了, pod 已经处理!
framework 资源使用 Create groups 方式导入(导入完后记得到项目配置 General - Embedded Binaries 中将导入好的 framework 添加);
其他资源文件夹 flutter_assets 使用 Creat folder references 方式导入
General - Embedded Binaries
二, 优化相关
1,framework 包瘦身
xcode_backend.sh 瘦身代码
官方在 xcode_backend.sh 文件中已经有了瘦身的操作, 只要在 RunScript 再添加一行代码 (build 下面, 有 framework 才能瘦身) 即可解决.
- # 瘦身
- "$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" thin
2, 上架提交商店报错解决
Flutter.framework 报错
使用 lipo 命令查看 Flutter.framework 信息, 确实又存在 x86_64
lipo 命令查看 Flutter.framework 信息
所以解决办法就是将 x86_64 从 framework 中去除, 使用 lipo -remove 命令即可; 方式也很多随个人喜欢. 这里我只说一种, 如果用 pod 导入的话 Flutter.framework 文件路径在(flutter module)/.iOS/Flutter/engine / 下. 所以可以找到它, 命令行剔除; 我比较喜欢交给机器去帮我实现一些人为操作, 所以我选择放到 RunScript 去进行操作
- if [[ "$CONFIGURATION" =~ "Release" ]];then
- # Release 环境删除 Flutter.framework "x86_64" 框架
- lipo -remove "x86_64" "$FLUTTER_APPLICATION_PATH/.ios/Flutter/engine/Flutter.framework/Flutter" -output "$FLUTTER_APPLICATION_PATH/.ios/Flutter/engine/Flutter.framework/Flutter"
- fi
但值得注意的是: Flutter.framwork 剔除了 x86_64, 虚拟机就跑不了了. 所以我会放到 Xcode Release 环境再进行删除.
三, 本文参考
0,Demo-NewHybridDemo
1, 官方混编 wiki
2, 官方混编 demo
3,Flutter iOS 减包方案
- ,Need to explain how to build App for submission to App store #7888
- ,Submit to App Store issues: Unsupported Architecture x86
如果写不对的地方请指出, 或者有更好的方式望不吝赐教!
来源: http://www.jianshu.com/p/0ec95723909c