Flutter混编之路——iOS踩坑记录

一、运行Xcode编译或者flutter run/build 过程中报错:"x86_64" is not an allowed value for option "ios-arch".


解决方案

在Debug.xcconfig中指定 “FLUTTER_BUILD_MODE=debug”,Release.xcconfig中指定“FLUTTER_BUILD_MODE=release”

错误分析

这看起来是在模拟器编译环境下选择了真机的Framework什么的,后来查询发现是没有设置这个变量。因为工程的Build Phases里运行了<"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh" build>相关命令,而xcode_backend里为build_mode变量设置了默认值"release",这使得在查找Flutter.framework等编译所需的“原材料”时,默认选择了release的目录,导致了这个错误,所以,加上debug这个设置后,会去ios这个目录中查找相关文件,就不会有问题了。附目录截图:

注:所在目录 flutter/bin/cache/artifacts/engine/


二、Flutter plugin not installed; this adds Flutter specific functionality. Dart plugin not installed; this adds Dart specific functionality


解决方案

1.) Start the Android Studio application

2.) Open plugin preferences (Preferences>Plugins on macOS, File>Settings>Plugins on Windows & Linux).

3.) Select Browse repositories…, select the Flutter plug-in and click install .

4.) Click Yes when prompted to install the Dart plugin.

5.) Click Restart when prompted.

错误分析

如果你使用的是iOS开发环境或者没有安装Flutter插件的Android Studio,会报这个错误。Flutter是Google开发的移动开发SDK,为了方便,基于自己的IDE开发了Flutter插件,以方便集成过程。在Flutter生成双端产物的时候,需要经过插件做一些操作。

三、Android license status unknown


解决方案

执行 “flutter doctor --android-licenses” 命令

会问你'Do you want to review the licenses?',输入“y” 然后 回车,这时再执行一次flutter doctor就好了


四、MissingPluginException(No implementation found for method xxx on channel xxx)


解决方案

方案一:flutter clean一下,再次 flutter run/build

方案二:将flutter run的进程终止掉重新 flutter run/build

方案三:看看你的FlutterPluginRegistrant产物是否存在,是否更新了

错误分析

问题本质是Plugin的方法没有找到,也可能是Plugin本身就没有注册成功。老版本的Flutter SDK遇到这个问题可能是没有触发GeneratedPluginRegistrant.register(this),新版本的已经不需要手动触发了。


五、Waiting for another flutter command to release the startup lock


解决方案

rm ./flutter/bin/cache/lockfile

错误分析

原因是在flutter编译等操作运行过程中,会创建一个文件锁,但是由于一些原因锁没有释放导致的,而且一直无法释放……


六、'Flutter/Flutter.h' file not found


解决方案

方案一:如果集成方式是静态库(.a),需要在引用Flutter的工程中,修改Build settings中的Header Search Paths,将Flutter所在目录加入其中。

方案二:如果集成方式是动态库(.framework),说明在引用Flutter的工程中并没有依赖成功,需要检查Flutter.framework包内是否包含Headers文件夹,是否其中包含Flutter.h,另外就是Podspec和podfile是否正确。还有,Cocoapods必须1.5版本及以上。

方案三:如果你用的podspec.json,试试改写成podspec(这个坑曾让我浪费了几天的时间……)


七、error: cannot parse the debug map for xxx: No such file or directory


解决方案

依赖产物只针对 真机 ,但调试中使用了另一种 模拟器。或者反过来了。

错误分析

真机和模拟器的平台是不同的,符号也不同。


八、diff: /../Podfile.lock: No such file or directory


解决方案

方案一:重新pod install

方案二:删除workspace、podfile.lock、Pods/、~/Library/Developer/Xcode/DerivedData

方案三:

1、运行sudo gem install cocoapods-deintegrate安装快速解除项目cocopods依赖的库

2、安装成功后,cd到你项目的更目录运行pod deintegrate解除项目cocopods依赖

3、运行pod install,重新安装cocopods

错误分析

Cocoapods的锅……


九、Flutter Bitcode


解决方案

在podfile中禁止bitcode

错误分析

Flutter相关集成是不支持bitcode的,所以需要将相关产物的bitcode功能关闭。如果你的现有工程中仓库众多,有的仓库是必须bitcode的,这样的话就需要每次pod install之后再在工程配置中手动设置回来,以下脚本放在podfile中可以解决此问题。

post_install do |installer|

        installer.pods_project.targets.each do |target|

                if target.name =="App" || target.name =="Flutter"

                        target.build_configurations.each do |config|

                                config.build_settings['ENABLE_BITCODE'] ='NO'

                        end

                end

        end

end


十、module importing failed: ('invalid syntax', ('temp.py',xxx


解决方案

执行以下命令

brew update

brew uninstall --ignore-dependencies libimobiledevice ios-deploy cocoapods

brew uninstall --ignore-dependencies usbmuxd

brew install --HEAD usbmuxd

brew unlink usbmuxd

brew link usbmuxd

brew install --HEAD libimobiledevice

brew install ideviceinstaller ios-deploy cocoapods


十一、Flutter集成到现有工程后,性能问题


解决方案

用Release产物集成

问题分析

为了实现Hot refresh功能,Flutter在Debug下做了很多工作,影响了性能,可以通过修改

FLUTTER_BUILD_MODE的值("debug" => "release")

使用Release产物集成的方式屏蔽这部分影响。注意,flutter_assets是需要同时更新的,Debug产物中含有kernel_blob.bin文件,Release产物则没有。


十二、iOS系统中,第一次从Native跳转到Flutter页面时,会出现LaunchScreen


解决方案

采用继承、Category同名方法等方式,覆盖FlutterViewController的splashScreenView的get方法,直接返回成员变量,将中间的读取LaunchScreen页面过程覆盖掉,甚至可以自定义自己的逻辑。

问题分析

Flutter的渲染是异步的,第一次加载需要创建Application和页面,无法及时返回结果,所以Flutter自己把这部分逻辑加到了SDK内部,其实是为了解决 “纯Flutter App首屏白屏” 问题,但给我们这种混编的App带来了麻烦。


以上是我们到目前为止遇到的主要坑位,以及解决方案和原因分析,Flutter无论从性能还是人效方面来讲,都会在熟悉之后节省不少成本,希望各位能从我们的经验中节省更多宝贵的时间。同时,也希望大家把更多的埋坑记录发到评论里,帮助友队一起学习,一起成长。欢迎技术交流!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容