当我完成 JMRoundedCornerSwift 的时候,我像往常一样打开小基友 徐亚非的博客CocoaPods建立自己的Podspec(三),拷贝输入教程里的命令pod trunk push JMRoundedCornerSwift.podspec --use-libraries --allow-warnings,但事情并不顺利,Swift 建立自己的 CocoaPod 库与我平时用 OC 建立 CocoaPod 库的方式并不一致。
首先,要了解什么是静态库,什么是什么是动态框架。
所谓静态库,或者说 .a 文件,就是一系列从源码编译的目标文件的集合。它是你的源码的实现所对应的二进制。配合上公共的 .h 文件,我们可以获取到 .a 中暴露的方法或者成员等。在最后编译 app 的时候 .a 将被链接到最终的可执行文件中,之后每次都随着 app 的可执行二进制文件一同加载,你不能控制加载的方式和时机,所以称为静态库。
在 iOS 8 之前,iOS 只支持以静态库的方式来使用第三方的代码。
与静态相对应的当然是动态。我们每天使用的 iOS 系统的框架是以 .framework 结尾的,它们就是动态框架。
Framework 其实是一个 bundle,或者说是一个特殊的文件夹。系统的 framework 是存在于系统内部,而不会打包进 app 中。app 的启动的时候会检查所需要的动态框架是否已经加载。像 UIKit 之类的常用系统框架一般已经在内存中,就不需要再次加载,这可以保证 app 启动速度。相比静态库,framework 是自包含的,你不需要关心头文件位置等,使用起来很方便。
Apple 从 iOS 8 开始允许开发者有条件地创建和使用动态框架,这种框架叫做 Cocoa Touch Framework。
虽然同样是动态框架,但是和系统 framework 不同,app 中的使用的 Cocoa Touch Framework 在打包和提交 app 时会被放到 app bundle 中,运行在沙盒里,而不是系统中。也就是说,不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。
Cocoa Touch Framework 的推出主要是为了解决两个问题:首先是应对从 iOS 8 开始的扩展开发。其次是因为 Swift,它是不支持编译为静态库的。
所以,想正确建立自己的 swift cocoaPod 库需要建立一个 Cocoa Touch Framework。Xcode 为我们准备了 framework target 的模板,直接创建这个 target,就可以开始编写框架了。
添加源文件,编写代码,编译,完成,就是这么简单。
首先是创建 Cocoa Touch Framework,File -> New -> project...,选择Cocoa Touch Framework
下一步记得语言选择 Swift,然后编写你的库的代码,例如我添加了 JMRoundedCorner.Swift
点击运行,没有错误的话,动态库就算完成了。
你可能还需要一个 Demo 来演示自己的动态库,添加一个 TARGETS,
这个选择页面是不是很熟悉
写完 demo 就可以切换 targets 来选择编译动态框架还是运行 demo。在 demo 中使用编写的动态框架需要 import 框架,例如 import JMRoundedCornerSwift,command + 单击JMRoundedCornerSwift 即可看到框架暴露的接口,你标记为 public 的内容将是框架使用者能看到的内容。
接下来将库上传到 cocoapod 参考CocoaPods建立自己的Podspec(三)这篇博客就行,需要注意的是命令里不能使用--use-libraries,会报错:
ERROR | [iOS] unknown: Encountered an unknown error (Pods written in Swift can only be integrated as frameworks; add use_frameworks! to your Podfile or target to opt into using it. The Swift Pod being used is: Socialite) during validation.
去掉它就好了。
参考资料: