當(dāng)我完成 JMRoundedCornerSwift 的時(shí)候,我像往常一樣打開小基友 徐亞非的博客CocoaPods建立自己的Podspec(三)虑润,拷貝輸入教程里的命令pod trunk push JMRoundedCornerSwift.podspec --use-libraries --allow-warnings,但事情并不順利,Swift 建立自己的 CocoaPod 庫與我平時(shí)用 OC 建立 CocoaPod 庫的方式并不一致鲫懒。
首先翰意,要了解什么是靜態(tài)庫棒假,什么是什么是動(dòng)態(tài)框架蜡饵。
所謂靜態(tài)庫,或者說 .a 文件黔夭,就是一系列從源碼編譯的目標(biāo)文件的集合宏胯。它是你的源碼的實(shí)現(xiàn)所對(duì)應(yīng)的二進(jìn)制。配合上公共的 .h 文件本姥,我們可以獲取到 .a 中暴露的方法或者成員等肩袍。在最后編譯 app 的時(shí)候 .a 將被鏈接到最終的可執(zhí)行文件中,之后每次都隨著 app 的可執(zhí)行二進(jìn)制文件一同加載婚惫,你不能控制加載的方式和時(shí)機(jī)氛赐,所以稱為靜態(tài)庫。
在 iOS 8 之前先舷,iOS 只支持以靜態(tài)庫的方式來使用第三方的代碼艰管。
與靜態(tài)相對(duì)應(yīng)的當(dāng)然是動(dòng)態(tài)。我們每天使用的 iOS 系統(tǒng)的框架是以 .framework 結(jié)尾的蒋川,它們就是動(dòng)態(tài)框架牲芋。
Framework 其實(shí)是一個(gè) bundle,或者說是一個(gè)特殊的文件夾尔破。系統(tǒng)的 framework 是存在于系統(tǒng)內(nèi)部街图,而不會(huì)打包進(jìn) app 中。app 的啟動(dòng)的時(shí)候會(huì)檢查所需要的動(dòng)態(tài)框架是否已經(jīng)加載懒构。像 UIKit 之類的常用系統(tǒng)框架一般已經(jīng)在內(nèi)存中,就不需要再次加載耘擂,這可以保證 app 啟動(dòng)速度胆剧。相比靜態(tài)庫,framework 是自包含的醉冤,你不需要關(guān)心頭文件位置等秩霍,使用起來很方便。
Apple 從 iOS 8 開始允許開發(fā)者有條件地創(chuàng)建和使用動(dòng)態(tài)框架蚁阳,這種框架叫做 Cocoa Touch Framework铃绒。
雖然同樣是動(dòng)態(tài)框架,但是和系統(tǒng) framework 不同螺捐,app 中的使用的 Cocoa Touch Framework 在打包和提交 app 時(shí)會(huì)被放到 app bundle 中颠悬,運(yùn)行在沙盒里矮燎,而不是系統(tǒng)中。也就是說赔癌,不同的 app 就算使用了同樣的 framework诞外,但還是會(huì)有多份的框架被分別簽名,打包和加載灾票。
Cocoa Touch Framework 的推出主要是為了解決兩個(gè)問題:首先是應(yīng)對(duì)從 iOS 8 開始的擴(kuò)展開發(fā)峡谊。其次是因?yàn)?Swift,它是不支持編譯為靜態(tài)庫的刊苍。
所以既们,想正確建立自己的 swift cocoaPod 庫需要建立一個(gè) Cocoa Touch Framework。Xcode 為我們準(zhǔn)備了 framework target 的模板正什,直接創(chuàng)建這個(gè) target贤壁,就可以開始編寫框架了。
添加源文件埠忘,編寫代碼脾拆,編譯,完成莹妒,就是這么簡單名船。
首先是創(chuàng)建 Cocoa Touch Framework,F(xiàn)ile -> New -> project...旨怠,選擇Cocoa Touch Framework
下一步記得語言選擇 Swift渠驼,然后編寫你的庫的代碼,例如我添加了 JMRoundedCorner.Swift
點(diǎn)擊運(yùn)行鉴腻,沒有錯(cuò)誤的話迷扇,動(dòng)態(tài)庫就算完成了。
你可能還需要一個(gè) Demo 來演示自己的動(dòng)態(tài)庫爽哎,添加一個(gè) TARGETS蜓席,
這個(gè)選擇頁面是不是很熟悉
寫完 demo 就可以切換 targets 來選擇編譯動(dòng)態(tài)框架還是運(yùn)行 demo。在 demo 中使用編寫的動(dòng)態(tài)框架需要 import 框架课锌,例如 import JMRoundedCornerSwift厨内,command + 單擊JMRoundedCornerSwift 即可看到框架暴露的接口,你標(biāo)記為 public 的內(nèi)容將是框架使用者能看到的內(nèi)容渺贤。
接下來將庫上傳到 cocoapod 參考CocoaPods建立自己的Podspec(三)這篇博客就行雏胃,需要注意的是命令里不能使用--use-libraries,會(huì)報(bào)錯(cuò):
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.
去掉它就好了志鞍。
參考資料: