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。
全文完。
參考鏈接:
WWDC2014之iOS使用動態庫
How to Create a Framework for iOS
Publish Your Pods on CocoaPods with Trunk
Getting setup with Trunk
CocoaPods Trunk
Cocoapods