最近的一个项目中用到了阿里的weex开发框架,着手写这系列的文章,我会把项目工程中碰到的各种问题以及解决方案一一呈现出来。记录一下那段不分昼夜的9107工作历程,同时也给后来准备入坑的weex开发者,尤其是对于iOS端原生开发者提供一系列参考和帮助。首先要吐槽下,同为混合开发框架,React Native的技术社区完善不知道甩了weex几条街,但还是希望自己的经验能为weex开发者带来一些帮助
weex 集成过程在官网已经有比较详细的介绍(官网链接)
项目在立项初,决定使用 weex 混合开发框架运行在 iPad 端上。按照官网的流程,很顺利的创建了一个新 weex 空白项目
接下来,碰到了第一个坑。在项目工程路径下执行 weex run ios
命令后,发现没有 iPad 相关的模拟器,只有 iPhone 相关机型的。总不能和领导说,weex 不支持 iPad 端模拟器调试?
想了想,既然 weex 调用的是 Xcode 中的模拟器,那么肯定会获取到 Xcode 中模拟器列表。如果强行给 weex 调用一个不存在的模拟器会发生什么?带着疑问,去尝试调了下,weex 果然报了错,而且给出了下面的 weex 内部文件报错路径
~/.xtoolkit/node_modules/weexpack/lib/utils/index.js
猜测这个可能就是控制调试Xcode模拟器的文件,打开该文件后尝试在源码中搜索一些模拟器相关的关键词,比如:Simulator
、iPad
。
也许是自己运气好,一下子就发现了问题根源,如下图
weex源码问题根源
原来是 weex 执行文件中,将从 Xcode 获取到的模拟器列表中,包含 Watch、TV、iPad 模拟器全部过滤掉。 果断删除掉源文件中的下列代码,然后保存退出。
|| line.indexOf('iPad') >= 0
再次执行 weex run ios
命令,等待一阵后。得偿所愿,看到了 iPad 端相关的模拟器列表,选中指定的 iPad 模拟器,成功运行了起来。
(PS:自己的Xcode中只保留了部分机型模拟器)
成功找到iPad模拟器
虽然问题成功解决,但细细回想,为什么 weex 中默认是要屏蔽 iPad 端的模拟器调试呢?后来和前端开发的同事交流了下,因为牵扯到屏幕适配问题,而这又是另外一个坑。。
在后续的开发过程中,碰到了一次 Xcode 自动升级,从9.4.1升至10.0版本。关于 Xcode 这次升级,对于开发者影响最大的就是官方iOS12.0中全部采用 libc++ 代替 lstdc++ 的动态库,在 Xcode 中无法找到 lstdc++.6.0.9.tbd 动态库。而项目使用的 SuperMap SDK 又要必须 lstdc++.6.0.9.tbd 支持,我在superMap论坛上提问并得到官方的回复后(问题链接),无奈的决定将 Xcode 回滚至9.4.1版本。 因为 Xcode 版本回滚缘故,导致 weex 运行时找不到 device的错误,因为模拟器路径缓存问题(安装回旧版本,模拟器虽然显示11.4老版本)
weex提示找不到Device
这时,需要重启Mac,然后在 Xcode 中手动添加模拟器。添加完成后,再次运行 weex 命令,即可正常调用模拟器
Xcode手动添加模拟器