制作framework并發(fā)布Cocoapods私有庫【Swift】

一耳奕、制作framework

1.創(chuàng)建APP工程稚新,用來開發(fā)framework和測試

2.創(chuàng)建framework的Target襟沮,根據(jù)項目需要來命名锥惋,此處命名為TestSDK,創(chuàng)建步驟如下:



3.工程使用pod管理依賴三方庫

使用終端cd到工程根目錄开伏,執(zhí)行命令 pod init膀跌,打開生成的Podfile文件,添加framework所需的第三方庫固灵,如pod 'SnapKit'捅伤,并執(zhí)行pod install,然后打開TestDemo.xcworkspace文件

4.配置framework

設置支持版本


取消只編譯當前架構

移除重復的架構
真機和模擬器編譯后巫玻,framework中arm64架構重復丛忆,會導致合并失敗困介,所以移除模擬器中的arm64架構

設置編譯選項優(yōu)化,給framework包瘦身

設置類型為靜態(tài)庫

Scheme切換到TestDemo蘸际,設置release

5.開發(fā)功能代碼

如果讓類和方法讓外界可調(diào)用,需要用權限修飾徒扶,使用public粮彤,如果要提供OC調(diào)用,要使用@objc修飾
swift 不像OC可以暴露接口姜骡,在swift中 要想給別的工程調(diào)用接口导坟,記得在類,方法或?qū)傩郧凹觩ublic圈澈。
swift權限控制符:
open 權限最大惫周,可以被外界模塊訪問,繼承重寫
public 可以被外界工程訪問
internal 默認文件創(chuàng)建時的權限康栈,可以在本工程的訪問
private 只可以在創(chuàng)建的文件內(nèi)訪問


5.1.framework中的資源文件的使用
1).圖片資源

extension UIImage {
    class func ex_image(named name: String) -> UIImage {
        //圖片放到 framework 的 bundle 中可使用
        let bundleName = "TestSDK.framework/ImageBundle.bundle/\(name)"
        if let image = UIImage(named: bundleName) {
            return image
        }
        return UIImage()
    }
}

2).文件資源

文件資源也可以放在bundle中递递,同樣的調(diào)用方式

var filterData: [FilterModel] = load("filters.json") 
func load<T: Decodable>(_ fileName: String, as type: T.Type = T.self) -> T {
    let data: Data
    let mainBundle = Bundle.main.path(forResource: "TestSDK.framework/ImageBundle", ofType: "bundle")
    let fileBundle = Bundle.init(path: mainBundle ?? "")
    let path = fileBundle?.path(forResource: fileName, ofType: nil) ?? ""
    let file = URL(fileURLWithPath: path) 
    do {
        data = try Data(contentsOf: file)
    } catch {
        fatalError("無法初始化\(fileName)文件")
    } 
    do {
        let decoder = JSONDecoder()
        return try decoder.decode(T.self, from: data)
    } catch {
        fatalError("無法解析\(fileName)文件")
    }
}

6.添加生成最終需要發(fā)布的framework的腳本
說明:關于framework編譯和合并的腳本,我還是比較喜歡以下的方式啥么,簡單粗暴登舞。
像新建一個shell腳本的target我也試過,framework中沒有依賴三方還行悬荣,像我這種依賴三方庫的菠秒,shell運行不通過,三方庫會報錯

# 真機和模擬器framework合并腳本
# 選中framework氯迂,分別在真機和模擬器編譯成功即可
if [ "${ACTION}" = "build" ]
then
# 定義framework名稱(替換為自己定義的名字即可)
SDK_NAME=TestSDK
# 輸出路徑
INSTALL_DIR=${SRCROOT}/Products/${SDK_NAME}.framework
# 真機路徑
DEVICE_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphoneos/${SDK_NAME}.framework
# 模擬器路徑
SIMULATOR_DIR=${BUILD_ROOT}/${CONFIGURATION}-iphonesimulator/${SDK_NAME}.framework
# 如果輸出路徑已存在践叠,則刪除
if [ -d "${INSTALL_DIR}" ]
then
rm -rf "${INSTALL_DIR}"
fi
# 創(chuàng)建輸出路徑
mkdir -p "${INSTALL_DIR}"
# 如果真機framework和模擬器framework都存在
if [ -d "${DEVICE_DIR}" ] && [ -d "${SIMULATOR_DIR}" ]
then
# 拷貝真機framework到輸出路徑
cp -r "${DEVICE_DIR}/" "${INSTALL_DIR}/"
# 拷貝模擬器framework中的modules到輸出路徑
cp -r "${SIMULATOR_DIR}/Modules/${SDK_NAME}.swiftmodule/" "${INSTALL_DIR}/Modules/${SDK_NAME}.swiftmodule"
# 合并真機framework和模擬器framework
lipo -create "${DEVICE_DIR}/${SDK_NAME}" "${SIMULATOR_DIR}/${SDK_NAME}" -output "${INSTALL_DIR}/${SDK_NAME}"
fi
fi

7.生成framework
選中TestSDK,分別在真機和模擬器編譯一次即可嚼蚀,然后在項目的根目錄中禁灼,Products文件夾里會有最終的framework


二、發(fā)布framework

cocoapods發(fā)布私有庫的大致流程為:
1轿曙、GitHub上創(chuàng)建一個私有索引庫匾二,這個索引庫存放的都是私有庫的路徑
2、GitHub拳芙、碼云或者Coding等上創(chuàng)建一個私有庫察藐,存放的是整個私有庫的所有源碼
3、把私有庫的.podspec文件push到私有索引庫中
4舟扎、把私有索引庫更新到本地repo中

1.創(chuàng)建私有索引庫分飞,并添加到本地repo中


終端執(zhí)行pod repo add TestSpec https://github.com/rayraychow/TestSpec.git
然后執(zhí)行pod repo即可查看有沒有添加成功,有TestSpec即是成功

2.創(chuàng)建framework庫


3.本地framework源碼根目錄下睹限,創(chuàng)建.podspec文件
終端執(zhí)行pod spec create TestSDK
生成文件后拖入Xcode工程中譬猫,取消copy勾選
podspec文件修改完后讯檐,把本地私有庫代碼和遠端私有庫關聯(lián),并把代碼都push上去
1).git add .
如果報錯fatal: not a git repository (or any of the parent directories): .git染服,使用git init創(chuàng)建git目錄
2).git commit -m '修改的內(nèi)容'
3).git push
4).git tag '0.0.1'
5).git push --tags
注意:每次push后都需要打tag别洪,且tag和.podspec文件中的版本號要一致
如果報錯Ld .../Build/Intermediates.noindex/App.build/Release-iphonesimulator/App.build/Objects-normal/arm64/Binary/App normal arm64
在podspec文件中加入:spec.pod_target_xcconfig = { 'VALID_ARCHS' => 'x86_64 armv7 arm64' }

Pod::Spec.new do |spec|

  spec.name         = "TestSDK"
  spec.version      = "0.0.1"
  spec.summary      = "A short description of TestSDK."
 
  spec.description  = <<-DESC
    這是描述區(qū)柳刮,這里的文字一定要比 spec.summary 中的內(nèi)容長挖垛,
  否則spec遠端驗證可能會不通過
                   DESC
  # 這里是主頁地址,可以寫github私有庫的主頁地址
  spec.homepage     = "https://github.com/rayraychow/TestSDK"

  spec.license      = "MIT"
 
  spec.author             = { "貝勒" => "beile@jravity.com" }
  # 這是可以應用的平臺及系統(tǒng)限制
  spec.platform     = :ios, "12.0"
  
  # 這是私有庫的路徑秉颗,填寫私有庫的git clone 的鏈接就行
  spec.source       = { :git => "https://github.com/rayraychow/TestSDK.git", :tag => "#{spec.version}" }
  
  # 如果是想暴露源碼痢毒,打開這行
  # spec.source_files  = "Classes", "Classes/**/*.{h,m}"
  # spec.exclude_files = "Classes/Exclude"
  
  # 此處暴露的是framework
  spec.vendored_frameworks = "Products/TestSDK.framework"
  
  # 此處聲明swift版本
  spec.swift_versions = "5.0"
  
  # 此處聲明支持的類型
  spec.pod_target_xcconfig = { 'VALID_ARCHS' => 'x86_64 armv7 arm64' }
  
  # 這是聲明framework依賴的三方庫
  spec.dependency "SnapKit"

end

4.校驗podspec文件
1).本地校驗:pod lib lint
2).從本地和遠程驗證:pod spec lint
3).依賴庫(spec.dependency)中 如果包含.a文件,驗證的時候出現(xiàn)錯誤蚕甥。加上這個來讓驗證通過:--use-libraries
4).有警告導致不通過驗證時哪替,加上這個忽略警告:--allow-warnings
5).有錯誤導致不通過驗證時,加上這個查看具體錯誤:--verbose
校驗文件可以直接執(zhí)行pod spec lint --allow-warnings
注意:進行驗證時如果報錯warning: Could not find remote branch 0.1.0 to clone. fatal: Remote branch 0.1.0 not found in upstream origin
說明沒有上傳代碼到倉庫菇怀,先進行代碼上傳凭舶,執(zhí)行 git add . git commit git push ,然后 git tag等流程的上傳爱沟。

5.把.podspec文件push到遠程Spec私有索引庫中
終端執(zhí)行pod repo push TestSpec TestSDK.podspec --allow-warnings --skip-import-validation
如果出現(xiàn)
[!] Found multiple specifications for `SnapKit (0.17.0)`: -/Users/beile/.cocoapods/repos/master/Specs/1/f/6/SnapKit/0.17.0/SnapKit.podspec.json -/Users/beile/.cocoapods/repos/trunk/Specs/1/f/6/SnapKit/0.17.0/SnapKit.podspec.json時库快,加入命令--sources='https://github.com/CocoaPods/Specs.git'

6.發(fā)布podspec文件到公有庫中
1).注冊cocoaPods
終端執(zhí)行pod trunk register 郵箱地址 '用戶名' --verbose
這里我們一般使用github郵箱和用戶名, 然后在你的郵箱中會收到確認郵件, 在瀏覽器中點擊鏈接確認即注冊成功。
2).驗證cocoaPods
確保打開了郵件中的鏈接之后(正常加載出來就行)钥顽,繼續(xù)執(zhí)行命令
pod trunk me
3).發(fā)布
pod trunk push TestSDK.podspec
該命令的執(zhí)行過程:
a.更新本地 pods庫 ~/.cocoaPods.repo/master
b.驗證*.podspec格式是否正確
c.將 *.podspec 文件轉(zhuǎn)成 JSON 格式
d.對 master 倉庫進行合并义屏、提交

7.使用(和正常的pod庫使用方式一樣)
唯一的區(qū)別是,因為是私有庫蜂大,需要在podfile文件中額外添加源地址
一個是私有的索引庫地址source 'https://github.com/rayraychow/TestSpec.git'
一個是cocoapods的cdn地址source 'https://cdn.cocoapods.org/'

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末闽铐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子奶浦,更是在濱河造成了極大的恐慌兄墅,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澳叉,死亡現(xiàn)場離奇詭異隙咸,居然都是意外死亡,警方通過查閱死者的電腦和手機成洗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門五督,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瓶殃,你說我怎么就攤上這事充包。” “怎么了遥椿?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵基矮,是天一觀的道長淆储。 經(jīng)常有香客問我,道長家浇,這世上最難降的妖魔是什么本砰? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮钢悲,結果婚禮上点额,老公的妹妹穿的比我還像新娘。我一直安慰自己譬巫,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布督笆。 她就那樣靜靜地躺著芦昔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪娃肿。 梳的紋絲不亂的頭發(fā)上咕缎,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音料扰,去河邊找鬼凭豪。 笑死,一個胖子當著我的面吹牛晒杈,可吹牛的內(nèi)容都是我干的嫂伞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼拯钻,長吁一口氣:“原來是場噩夢啊……” “哼帖努!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粪般,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤拼余,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亩歹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匙监,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年小作,在試婚紗的時候發(fā)現(xiàn)自己被綠了亭姥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡顾稀,死狀恐怖致份,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情础拨,我是刑警寧澤氮块,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布绍载,位于F島的核電站,受9級特大地震影響滔蝉,放射性物質(zhì)發(fā)生泄漏击儡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一蝠引、第九天 我趴在偏房一處隱蔽的房頂上張望阳谍。 院中可真熱鬧,春花似錦螃概、人聲如沸矫夯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽训貌。三九已至,卻和暖如春冒窍,著一層夾襖步出監(jiān)牢的瞬間递沪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工综液, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留款慨,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓谬莹,卻偏偏與公主長得像檩奠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子附帽,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容