iOS组件化初探( 四 )

Pod::Spec.new do |spec|和end是固定语法 , 用来声明一个新的specification , 分别表示声明的开始和结束 , 中间部分设置specification的各项属性 。其中多数属性可以顾名知义 , 这里选几个比较重要的说明一下 。
spec.platform:指定应用的平台和系统版本 。案例中的含义是应用于 iOS 系统 11.0 及以上版本;
spec.swift_versions:指定使用的 Swift 语言版本 , 值是一个数组;
spec.source_files:指定源代码文件的路径和文件名 , 等号右边可使用通配符的方式指定 。案例中的含义是:源码文件包含当前目录下的所有文件类型为 swift、m、mm、c、cpp、h 的文件;
spec.resources:指定资源文件的路径和文件名 , 等号右边可使用通配符的方式指定 。案例中的含义是:资源文件包含当前目录下的Resources目录下的所有文件类型为 xcassets、json、plist 的文件 。后续我们提取资源文件的时候会将其放到Resources目录下;
spec.xcconfig:对 pod 库进行配置 , 配置的内容最终会反应到 pod 库的Build Settings上 。案例中的含义是:配置 pod 库的Defines Module为 YES 。除了DEFINES_MODULE外 , 还有很多内容可以配置 , 这里不一一介绍;
spec.frameworks:指定需要链接的系统动态库 。
此外还有些案例中没有提及的但也比较常用的属性有:
spec.libraries:用来指定链接的系统静态库;
spec.dependency:用来指定该组件所依赖的其他组件;
spec.vendored_frameworks:用来指定该组件依赖的第三方framework 。
上面例举的都是常用属性 , Cocoapods提供了非常多的属性供我们使用 , 读者可参照官方文档进行阅读:
https://guides.cocoapods.org/syntax/podspec.html#specification
4.集成组件到项目中修改Podfile文件 , 添加如下代码:
pod 'QRCodeReader', :path => '../QRCodeReader':path后面的路径即为组件库相对于Podfile文件的位置 , 还记得前面我们把组件库放到和主工程同级目录了吗?这里的含义是”集成QRCodeReader组件 , 组件位于Podfile文件上级目录中的QRCodeReader目录“ 。
之后我们在主工程中执行pod install命令 , 看见如下输出 , 说明集成成功了 。
 
打开项目后 , 可以看见在左侧导航区 Pods 工程下多了一个Development Pods目录 , 我们集成的QRCodeReader组件就在这里面了 。
编译项目后可能会出现“Cannot find 'xxxx' in scope”等找不到类或方法的问题 , 这是因为这些类和方法已经被我们封装成为独立 Module , 主工程若想访问其中的内容需要先引入该 Module 。
在使用了扫码组件的文件中添加代码“import QRCodeReader” , 编译通过~
需要注意的是 , 不同于在Podfile中使用pod 'xxx', "~> 1.0.0"的方式集成第三方库 , 通过指定组件库本地路径的方式集成 , 组件库中的文件不会被拷贝到主工程中 , 主工程中的组件库只是一个”引用“ , 类似于面向对象编程中的”对象指针“的概念 。

iOS组件化初探

文章插图
 
5.资源文件的管理QRCodeReader组件里包含一个扫码界面 , 会用到一些图标资源 。若把这些图标保留在主工程的Assets中 , 虽然仍然可以访问到 , 可一旦我们将QRCodeReader组件集成到其他项目中 , 这些图标资源就不能被自动集成过去 , 需要我们手动迁移 。这样做非常麻烦不说 , 也和容易发生遗漏 。
因此 , 最好的方式是将这些图标资源转移到对应的组件库中 , 并由组件库统一管理 。
?
QRCodeReader组件里用到的资源文件只有图标 , 其他可能的资源文件还有plist、json、xib等文件 , 视实际情况而定 。
还记得podspec文件中的这两个属性么:
spec.resources= "Resources/**/*.{xcassets,json,plist}"spec.resource_bundle = { "QRCodeReader" => "Resources/**/*.{xcassets,json,plist}" }首先来具体看下这两个属性分别代表什么含义 , 以下内容引用自Cocoapods官方文档:
?resources
A list of resources that should be copied into the target bundle.
For building the Pod as a static library, we strongly recommend library developers to adopt resource bundles as there can be name collisions using the resources attribute. Moreover, resources specified with this attribute are copied directly to the client target and therefore they are not optimised by Xcode.


推荐阅读