具體使用,能夠查看官網的,文檔地址 https://github.com/Carthage/Carthage。若是看不懂英文,能夠看一下官文的翻譯:https://www.jianshu.com/p/e0c0ceee8ab2 。html
爲何使用Carthage,具體對比CocoaPods有什麼優點,還有安裝過程,請都參照官網的操做。ios
在已有的工程上,新建一個Target。項目-> File -> New -> Target , 選擇Framework ,命名爲 CarthageTestgit
他會自帶一個CarthageTestSDK.h的文件,這個文件的做用是告訴其餘人咱們引用了哪些頭文件,咱們不要它自動生成的文件,刪除CarthageTestSDK.hgithub
改成和項目工程同樣的支持版本,我這邊是8.0。 必定要注意這裏,要否則,編譯會報錯,當編譯不報錯時,低版本的系統會安裝不了。報錯相似:shell
ERROR: Install failed. Got error "ApplicationVerificationFailed" with code 0xe8008019: Failed to verify code signature of /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.xY9xAg/extracted/Payload/Spec.app/Frameworks/MGLiveDetect.framework : 0xe8008019 (The application does not have a valid signature.)Build step 'Execute shell' marked build as failureFinished: FAILUREapp
不須要更改能夠直接忽略。項目Target -> Build Setting -> Product Module Name/Produce Name ,改爲 CarthageTestSDK框架
-all_load
-fembed-bitcode
以上都不須要,能夠忽略這一步,跳到第5步。測試
選擇 Manager Schemes,給CarthageTestSDK勾上sharedui
到這裏,基本上你已經成功了,那麼咱們來驗證一下,咱們cd到項目文件夾,運行spa
$ carthage build --no-skip-current
命令運行完成後,你會發現你的項目文件夾裏面多了一個Carthage文件夾
Carthage->Build->iOS->CarthageTestSDK.framework
這個就是咱們須要的framework了,那麼接下來,咱們在本地驗證一下。
target->Build Phases ->左上角+號 ->New Copy Files Phase 而後在Copy Files下 Destination選擇Frameworks ->添加你本身的動態庫
咱們首先編譯一下,沒報錯,導入頭文件,正常輸出,編譯成功。驗證成功。
將代碼上傳到git上面,Carthage -> Build 目錄是不須要上傳的。
git tag 0.1.0 git push --tags
至此你的庫以及支持 Carthage 了,可讓其餘開發者使用 Carthage 來管理你的項目依賴了。
一、先進入到項目全部的文件夾
$ cd 項目路徑
二、建立一個空的Carthage文件
$ touch Cartfile
三、編輯cartfile文件,添加要依賴的框架
github "https://github.com/AFNetworking/AFNetworking"
指定版本能夠這樣
github "https://github.com/AFNetworking/AFNetworking" ~> 1.1.9
四、保存並關閉cartfile文件,進行安裝
$ carthage update --no-use-binaries --platform ios
--platform ios :限定只有iOS平臺
安裝完以後根目錄會出現一個叫Carthage的文件夾,裏面包含Build和Checkouts兩個文件夾。
Build:iOS路徑下的就是framework包,須要自行引用進來。
Checkouts:是從Github上獲取來的源碼,因此理論上來講你在這個文件夾裏對源碼進行任何的修改,再次執行 carthage build 就會根據這裏的源碼打包出相應的framework出來。但須要注意的是當每次執行carthage update後這裏的源碼又被覆蓋了。因此你有特別須要修改的地方能夠加例外防止覆蓋!!!! 重要
五、項目Target -> Build Setting -> Search Paths -> Framework Search Paths添加。這一步,感受【carthage update】以後,默認會有了,有的話跳到第6步。
$(PROJECT_DIR)/Carthage/Build/iOS
六、項目Target -> General最底下的Linked Frameworks and Libraries裏手動添加【Add Other...】須要用的framework.
七、項目Target -> Build Phases -> '+' -> New Run Script Phase, 添加腳本 。這一步能夠不操做,直接操做第8步;第7步和第8步只須要操做其中一步就能夠了。
/usr/local/bin/Carthage copy-frameworks
同時要注意,添加【input Files】,如:$(SRCROOT)/Carthage/Build/iOS/AFNetworking.framework 。
若是不添加【input Files】,會報 dyld: Library not loaded 出錯
八、【注:第7步操做了,這一步跳過】不想經過腳本而且【input Files】的方式添加路徑的話,能夠經過【Copy File】的方式來添加,項目Target -> Build Phases -> '+' -> New Copy File Phase, 添加Copy文件
因爲動態庫不會增長ipa的包大小,於是將第三方的靜態庫轉爲動態庫也是頗有必要的。下面就騰訊的人臉識別SDK作驗證。官網文檔:https://cloud.tencent.com/document/product/655/13825。
須要SDK的話,能夠直接找騰訊的相關人員拿。我拿到sdk包(iOS_OCR_SDK_V2.2.0),是能夠直接跑起來,相關代碼結構以下:
如下的步驟,和上面【讓你的項目支持Carthage】差很少,具體配圖看上面。
在已有的工程上,新建一個Target。項目-> File -> New -> Target , 選擇Framework ,命名爲 WBOCRFramework ,並刪除建立多出來的 WBOCRFramework.h
將 WBOCRService.framework 的頭文件拉出來,放在libs文件夾裏面,注意,雖然是拉了出來,但文件的路徑是和原來同樣的。
改成和項目工程同樣的支持版本,我這邊是8.0。 必定要注意這裏,要否則,編譯會報錯,當編譯不報錯時,低版本的系統會安裝不了。報錯相似:
ERROR: Install failed. Got error "ApplicationVerificationFailed" with code 0xe8008019: Failed to verify code signature of /private/var/installd/Library/Caches/com.apple.mobile.installd.staging/temp.xY9xAg/extracted/Payload/Spec.app/Frameworks/MGLiveDetect.framework : 0xe8008019 (The application does not have a valid signature.)Build step 'Execute shell' marked build as failureFinished: FAILURE
不須要更改能夠直接忽略。項目Target -> Build Setting -> Product Module Name/Produce Name ,改爲 WBOCR
-all_load
-fembed-bitcode
選擇 Manager Schemes,給WBOCRFrame勾上shared
到這裏,基本上你已經成功了,那麼咱們來驗證一下,咱們cd到項目文件夾,運行
$ carthage build --no-skip-current
可是,咱們發現,報錯了。在終端上,會告訴咱們,報錯的日誌輸出在哪裏
接下來,咱們前往報錯的日誌,經過查看日誌,是由於librecdetect.a文件須要支持Bitcode。
最簡單的解決方法,就是開啓BitCode,以下圖:
命令運行完成後,你會發現你的項目文件夾裏面多了一個Carthage文件夾,這個就是咱們須要的framework了,那麼接下來,咱們在本地驗證一下。參照上面【讓你的項目支持Carthage】的步驟。
使用動態庫跑起來以後,咱們發現,界面的圖片資源不見了,咱們在打動態庫的時候,明明已經加了WBOCRService.bundle。經過代碼驗證分析,原來是SDK加載圖片,寫死了是從根目錄讀取,寫法如:
但咱們打包成動態庫以後,Bundle文件已經不在根目錄了,根本就找不到。
經過查資料,參照一下github上的開源庫MJRefresh(https://github.com/CoderMJLee/MJRefresh)的寫法,先讀取存在類的Bundle路徑,再找到圖片的路徑。這樣,無論封裝多少層,bundle圖片資源都不會丟失。
咱們能夠寫在一個NSBundle的分類裏,寫法以下:
目前,經過和騰訊的人溝通,資源包的問題已經解決,解決方案以下:
SDK裏面對資源bundle加了一個判斷:
1. main bundle 下是否存在WBOCRService.bundle,存在就直接使用
2. 若是1找不到,就會到SDK可執行文件對應的目錄下面去找WBOCRService.bundle
若是是動態庫集成,資源就會位於第二個位置,可是要注意的是,在作動態庫的時候,必定要把資源bundle加進去
dyld: Library not loaded: @rpath/CarthageTestSDK.framework/CarthageTestSDK
Referenced from: /Users/vipshop/Library/Developer/CoreSimulator/Devices/948C970C-2338-4BCB-A62D-E28A71C7A47B/data/Containers/Bundle/Application/AB8C53FC-9779-44EA-8E23-23E1E63C6E89/PodTest.app/PodTest
Reason: image not found
注意,Copy File 默認是Resources,須要改成framework
參考:
https://www.jianshu.com/p/7a0634e14332
https://www.jianshu.com/p/bf263c596538
https://www.jianshu.com/p/52dff4cef8a2
https://www.jianshu.com/p/6802eeb3efe7