如何部署 Framework 到 CocoaPods
iOS 中常见的第三方库都可以通过 CocoaPods 集成到项目中,它们基本是开源的,但不妨有些商业项目,不希望源代码公开,只以 Framework 的形式发布,这时就需要考虑如何发布 Framework 包到 pod。
本文内容主要介绍如何部署 Framework 到 CocoaPods。
准备 Framework
关于如何创建 Framework 网上的教程已经很多了,这里就不再赘述了。值得注意的是即使在 Release 模式下,运行 Xcode 都只能编译出只支持真机或者模拟器的版本。
可通过以下两种方式集成全平台(Universal)版本。
手动合成
先编译出模拟器和真机的 Framework,用以下命令合成全平台包
lipo -create xxx/sdk-device xxx/sdk-simulator -output sdk-universal
lipo -info sdk-universal
可查看支持的构架,如果为 i386, x86_64, armv7, arm64
即代表全平台支持。
注:
armv7s
是 iPhone 5 的 CPU 构架,因为设备具有向下兼容的特性,所以只需包含armv7
即可,还能减小 fat 包的大小 :)
自动合成
Xcode 新建 Target 选择 Cross-platform
分类中的 Aggregate
, 添加依赖和脚本后能够编译全平台的 Framework。
具体可以参考这里
部署 Framework
Framework 制作完成后,将其压缩成 zip 包,并部署到能够公开访问的服务器上。可以放到自己的服务器,或者第三方服务器上,比如 GitHub release、又拍云等。只要最终能通过部署的 URL 下载该 zip 包即可。
制作 podsepc 文件
为了方便介绍将 Framework 名称取为: MyLib
在 framework 的工程目录下,执行 pod spec create MyLib
创建 spec 文件。该目录下会生成一个 MyLib.podspec
文件。vi MyLib.podspec
查看,每一行都对应有具体的解释。对每个条目有大致了解之后,填写好信息,删除所有 #
注释的内容,类似于这样:
Pod::Spec.new do |s|
s.authors = "Tencent"
s.name = "Bugly"
s.version = "2.4.0"
s.summary = "Bugly iOS SDK"
s.description = "iOS library for Bugly Crash Report Service"
s.homepage = "http://bugly.qq.com/"
s.license = { :type => "Commercial", :text => "©2016 Tencent.com"}
s.author = { "Tencent" => "bugly@tencent.com" }
s.source = { :http => "http://softfile.3g.qq.com/myapp/buglysdk/Bugly-2.4.0.zip" }
s.requires_arc = true
s.ios.deployment_target = '8.0'
s.vendored_frameworks ='Bugly.framework'
s.dependency 'Alamofire', '~> 1.0.0'
end
详细的介绍可以参考这里,需要注意几点:
-
s.version
代表发布的 Framework 版本号,每次更新递增修改。 -
s.source
字段替换成前面的 zip 地址。 -
s.vendored_frameworks
改为自己 Framework 的名称。 -
s.dependency
代表依赖其它的库。
至此 spec 文件制作完毕,使用 pod lib lint
命令验证文件格式的正确性。
Framework 必须同时支持模拟器和真机否则会验证不通过。
提交 podspec 文件
提交 podspec,需要先注册一个 trunk 账户(如果提示网络失败,请使用梯子)
pod trunk register youremail@gmail.com 'Xiaofei Jiang' --description='macbook pro' --verbose
上面的命令邮箱和用户名需要替换成你自己的。
注册后 CocoaPods 会给你的邮箱发送验证链接,点击后就注册成功了,可以用 pod trunk me
命令查看自己的注册信息。
在提交 spec 文件前,如果发布的是 Swift 框架,需要指定 Swift 的版本,否则会报错,执行 echo "4.0" > .swift-version
即可指定版本为 4.0
。
最后,执行 pod trunk push MyLib.podspec
提交 spec 文件到 Cocoapods。在后面附加 --verbose
可查看详细的进度。如果运气好没有报错的话就代表部署成功啦。
用 pod search MyLib
搜索是否有刚刚提交的版本,如果没有,执行 rm ~/Library/Caches/CocoaPods/search_index.json
删除缓存索引再尝试。
现在可以跟其他的第三方库一样,在 Podfile 文件中加入 「pod MyLib
」,终端执行 pod update
集成。
原理
整个过程看起来非常的简单,仅围绕着一个 spec 文件。那这个文件是干嘛用的呢?push trunk 又做了什么事情?
在安装 Cocoapods 的时候,会从 GitHub clone 一个仓库到本地目录 ~/.cocoapods/repos/master
,该仓库维护这所有提交到 CocoaPods 的 spec 文件。
在执行 pod install
时,就是从这个目录下找到 Podflie 中指定版本的第三方库的 spec 文件,并根据该文件中 s.source
字段为索引,找到真正的第三方库地址。
如果该地址存的是源代码,pod 会将代码下载下来添加到 Pods.xcodeproj 编译成 Framework,生成一个 target,并将这个 target 作为 Pod-xxx.framework 的依赖包。如果是 zip 包,则下载完成后直接解压,加入 Pods 工程。下载的源代码或者 zip 包会缓存在 ~/Library/Caches/CocoaPods
目录下,如果版本没有更新的,下次 install 会直接从缓存获取。
对于安装 pods 的用户来说,spec 文件是安装第三方库的索引,它对使用者来说是透明的,只需关注 Podfile 文件即可。
对于 pod 的提供者,就需要提交 spec 文件给 CocoaPods,执行pod trunk push
时,会先进行 pod lib lint
验证。该验证过程会创建一个临时的工程文件,并使用这个 spec 文件,为其安装 pod 依赖,其实就是 pod install
的过程,如果能够编译链接成功,代表 spec 文件验证通过。详细的过程都可以在命令后面附加 --verbose
查看。
验证通过后的 spec 文件会 post 到 Trunk 服务器,Trunk 服务是 Cocoapods 团队开发的,每个人都可以在自己的账户下发布 pod,其他人没有权限修改。spec 以前以 ruby 的格式存储,现在以 json 的格式保存在 trunk 服务器上,并同步更新到 GitHub。
pod_trunk.png全文完。
参考链接:
WWDC2014之iOS使用动态库
How to Create a Framework for iOS
Publish Your Pods on CocoaPods with Trunk
Getting setup with Trunk
CocoaPods Trunk
Cocoapods