Carthage介紹
具體使用,可以查看官網的,文檔地址 https://github.com/Carthage/Carthage。如果看不懂英文,可以看一下官文的翻譯:https://www.jianshu.com/p/e0c0ceee8ab2 。
為什么使用Carthage,具體對比CocoaPods有什么優勢,還有安裝過程,請都參照官網的操作。
讓你的項目支持Carthage
配置項目
1、創建framework
在已有的工程上,新建一個Target。項目-> File -> New -> Target , 選擇Framework ,命名為 CarthageTest
他會自帶一個CarthageTestSDK.h的文件,這個文件的作用是告訴其他人我們引用了哪些頭文件,我們不要它自動生成的文件,刪除CarthageTestSDK.h
2、配置你的framework
- 選擇你的工程
- 選擇framework所在的Target
- 選擇Build Phases
- 點擊Header左下角的+號把你要暴露的頭文件添加到Public里面(默認添加到Project里面,用鼠標把它拽過去)
- 在Compile source里面添加實現的.m文件
3、修改framework的Deployment Target
改為和項目工程一樣的支持版本,我這邊是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
4、更改framework的名字
不需要更改可以直接忽略。項目Target -> Build Setting -> Product Module Name/Produce Name ,改成 CarthageTestSDK
5、配置類別和支持Bitcode
- 如果你使用了類別,那么你需要在Build Settings的Linking的Other Linker Flags里加上
-all_load
- 如果你想你的工程支持bitcode,需要在Other C Flags 里加上
-fembed-bitcode
以上都不需要,可以忽略這一步,跳到第5步。
6、分享你的工程
選擇 Manager Schemes,給CarthageTestSDK勾上shared
本地驗證
到這里,基本上你已經成功了,那么我們來驗證一下,我們cd到項目文件夾,運行
$ carthage build --no-skip-current
命令運行完成后,你會發現你的項目文件夾里面多了一個Carthage文件夾
Carthage->Build->iOS->CarthageTestSDK.framework
這個就是我們需要的framework了,那么接下來,我們在本地驗證一下。
1、把framework拖進工程中,點擊copy
2、添加動態庫
target->Build Phases ->左上角+號 ->New Copy Files Phase 然后在Copy Files下 Destination選擇Frameworks ->添加你自己的動態庫
3、測試驗證成功
我們首先編譯一下,沒報錯,導入頭文件,正常輸出,編譯成功。驗證成功。
4、發布並打上Tag
將代碼上傳到git上面,Carthage -> Build 目錄是不需要上傳的。
git tag 0.1.0 git push --tags
至此你的庫以及支持 Carthage 了,可以讓其他開發者使用 Carthage 來管理你的項目依賴了。
使用Carthage
1、先進入到項目所有的文件夾
$ cd 項目路徑
2、創建一個空的Carthage文件
$ touch Cartfile
3、編輯cartfile文件,添加要依賴的框架
github "https://github.com/AFNetworking/AFNetworking"
指定版本可以這樣
github "https://github.com/AFNetworking/AFNetworking" ~> 1.1.9
4、保存並關閉cartfile文件,進行安裝
$ carthage update --no-use-binaries --platform ios
--platform ios :限定只有iOS平台
安裝完之后根目錄會出現一個叫Carthage的文件夾,里面包含Build和Checkouts兩個文件夾。
Build:iOS路徑下的就是framework包,需要自行引用進來。
Checkouts:是從Github上獲取來的源碼,所以理論上來說你在這個文件夾里對源碼進行任何的修改,再次執行 carthage build 就會根據這里的源碼打包出相應的framework出來。但需要注意的是當每次執行carthage update后這里的源碼又被覆蓋了。所以你有特別需要修改的地方可以加例外防止覆蓋!!!! 重要
5、項目Target -> Build Setting -> Search Paths -> Framework Search Paths添加。這一步,感覺【carthage update】之后,默認會有了,有的話跳到第6步。
$(PROJECT_DIR)/Carthage/Build/iOS
6、項目Target -> General最底下的Linked Frameworks and Libraries里手動添加【Add Other...】需要用的framework.
7、項目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 出錯
8、【注:第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】差不多,具體配圖看上面。
1、創建Framework
在已有的工程上,新建一個Target。項目-> File -> New -> Target , 選擇Framework ,命名為 WBOCRFramework ,並刪除創建多出來的 WBOCRFramework.h
2、將SDK的頭文件公布出來
將 WBOCRService.framework 的頭文件拉出來,放在libs文件夾里面,注意,雖然是拉了出來,但文件的路徑是和原來一樣的。
3、配置你的framework
- 選擇你的工程
- 選擇framework所在的Target
- 選擇Build Phases
- 點擊Header左下角的+號把你要暴露的頭文件添加到Public里面(默認添加到Project里面,用鼠標把它拽過去)
- 在Compile source里面添加實現的.m文件。由於沒有.m文件,可以直接忽略掉
- 在Link Binary With Libraries 中,將libs的文件全部增加進去,同時,還需要將所有依賴的系統framework也增加進去。
4、修改framework的Deployment Target
改為和項目工程一樣的支持版本,我這邊是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
5、更改framework的名字
不需要更改可以直接忽略。項目Target -> Build Setting -> Product Module Name/Produce Name ,改成 WBOCR
6、配置類別和支持Bitcode
- 在Build Settings的Linking的Other Linker Flags里加上
-all_load
- 工程需要支持bitcode,需要在Other C Flags 里加上
-fembed-bitcode
7、分享你的工程
選擇 Manager Schemes,給WBOCRFrame勾上shared
8、生成framework並驗證
到這里,基本上你已經成功了,那么我們來驗證一下,我們cd到項目文件夾,運行
$ carthage build --no-skip-current
但是,我們發現,報錯了。在終端上,會告訴我們,報錯的日志輸出在哪里
接下來,我們前往報錯的日志,通過查看日志,是因為librecdetect.a文件需要支持Bitcode。
最簡單的解決方法,就是開啟BitCode,如下圖:
命令運行完成后,你會發現你的項目文件夾里面多了一個Carthage文件夾,這個就是我們需要的framework了,那么接下來,我們在本地驗證一下。參照上面【讓你的項目支持Carthage】的步驟。
存在的問題
1、Bundle圖片資源不見了
使用動態庫跑起來之后,我們發現,界面的圖片資源不見了,我們在打動態庫的時候,明明已經加了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加進去
碰到的問題
1、dyld: Library not loaded 出錯
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