今天接入flutter的第三方插件app_settings时,由于自己的粗心导致了一个bug,特此记录一下。以前app中也接入过app_settings,没有遇到任何问题,但是这次接入一直报错如下:
/Applications/flutter/.pub-cache/hosted/pub.flutter-io.cn/app_settings-4.1.1/ios/Classes/AppSettingsPlugin.m:2:9: fatal error: 'app_settings/app_settings-Swift.h' file not found
#import <app_settings/app_settings-Swift.h>
百思不解姐,如是又开始去看接入的文档最后发现是因为在xxx/iOS/Podfile文件里面少写了一行代码,因为以前接入过就大意了,加入的代码是:use_frameworks!
问题算是解决了,但是为什么会这样呢,我们习以为常的use_frameworks!有什么作用呢,知其然也要知其所以然,带着疑问我进行了下一步的探索 。
首先我们要了解下静态库和动态库还有Framework。
静态库:(.a)在编译时会将库copy一份到目标程序中,编译完成之后,目标程序不依赖外部的库,也可以运行。缺点: 会使应用程序变大。
动态库:(.dylib)编译时只存储了指向动态库的引用。可以多个程序指向这个库,在运行时才加载,不会使应用体积变大,但是运行时加载会损耗部分性能,并且依赖外部的环境,如果库不存在或者版本不正确则无法运行(我的项目无法运行就是这一步出问题了)。
Framework:实际上是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。
CocoaPods 通过use_frameworks来控制是否是用Framework。
如果不使用use_frameworks!则会使用static libraries 方式生成.a文件。
如果使用use_frameworks!则会使用dynamic frameworks 方式生成.framework文件。
在纯oc的项目中,一般不使用frameworks,但是在pod导入的swift项目,必须要使用use_frameworks!,我这个flutter项目也是用pod导入的第三方库,所以必须加入use_frameworks!,特此记录下,免得以后踩同样的坑!