Flutter插件包开发中趟过的坑
首先说一下这个坑在iOS版的插件包中遇见的。从发现问题到截止到刚才找到解决方案我们两个同事已经研究了两三天,昨天下午我也投入到这个问题中一直到刚才才算解脱。废话不说,看下坑:
- 我们在项目中用到了网络电话功能,基于sip协议,之前实现过原生版功能,所以现在我们用Flutter做项目时就把它做成Flutter的插件包进行使用:
- 首先我们创建插件包工程,这个过程上篇文章已经总结过不再赘述,看下工程结构:
iOS版本的功能需要卸载ios目录下面。现在我们要实现的功能需要借助第三方pod 'pjsip','~> 2.8.0' ,如何在插件包里的iOS目录里引用第三方的pod,需要在 pjdemo/Pod 下的podspec配置文件中进行依赖编写:
然后我们cd到 插件包目录/example/ios下进行pod install操作安装 pjsip这个第三方。成功后的目录是这样:
现在我们安装了pjsip的文件,那么我们在iOS的文件里引用这个第三方:比如在PjdemoPlugin.m中 导入 #include <pjsua-lib/pjsua.h> 。。。。。。。
- 重点来了,不用编译,链接时报错!!! 'pjsua-lib/pjsua.h' file not found !!!!!
然后慢慢发现在主工程中调用是一点问题没有的,但是现在是在做插件包,插件代码必须写在pod工程下固定的iOS目录下才行。
就是这个问题困扰了我们小伙伴将近三天时间,都是没学几天Flutter,所以边做边解决问题,而且这个问题也很怪异,其实我现在即使找到了解决方案但仍然感觉很庆幸,也还有一些不解。测试了别的第三方库,在引用别的三方库时是没有问题的,比如 Afnetworking Masonry等......
- 这样的问题知道是链接有问题,那么就反复地检查xcode中 build setting 里各种路径配置,像 Header Search Path 等等这种:
我们反复确认了很多遍xocde build setting 里的配置是一点问题没有的。最后怪圈里转了很久有点懵,只有一个问题其实,为什么pjdemo依赖了pjsip,主工程能调用pjdemo却不能。最后想放弃的时候看了一眼主工程的pod相关文件和Pod工程里的pod相关文件,看到了两者的xcconfig文件:
上面第一张图是主工程的xcconfig,第二张图是Pod工程里 pjdemo的xcconfig 。很幸运我注意到了他们的HEADER_SEARCH_PATHS 后面的值,主工程里的字段包含了pjsip目录下所有的子目录,而pjdemo里确实只有一个pjsip根目录。那么根据链接原理头文件搜索路径 pjdemo里是搜索不全的。于是从主工程里把pjdemo里没有的sip子目录复制到pjdemo下,编译通过!!!在快要放弃的时候发现了细节,真的很幸运。
- 那么 xcconfig 和 xcode 的build setting里的配置到底是什么关系呢?为什么两者有差异,起作用的到底是哪个优先级是怎样?
xcconfig文件其实就是xcode里的config文件,本质是一个用来保存Build Settings键值对的纯文本文件。这些键值对覆盖Build Settings中的值,所以当在xcconfig文件中配置了的选项,在Build Settings中设置将失效。
很强大..........