Carthage 讓項目支持及使用,第三方靜態庫轉爲動態庫

Carthage介紹

具體使用,能夠查看官網的,文檔地址 https://github.com/Carthage/Carthage。若是看不懂英文,能夠看一下官文的翻譯:https://www.jianshu.com/p/e0c0ceee8ab2 。html

爲何使用Carthage,具體對比CocoaPods有什麼優點,還有安裝過程,請都參照官網的操做。ios

讓你的項目支持Carthage

配置項目

一、建立framework

在已有的工程上,新建一個Target。項目-> File -> New -> Target , 選擇Framework ,命名爲 CarthageTestgit

 

他會自帶一個CarthageTestSDK.h的文件,這個文件的做用是告訴其餘人咱們引用了哪些頭文件,咱們不要它自動生成的文件,刪除CarthageTestSDK.hgithub

二、配置你的framework

  1. 選擇你的工程
  2. 選擇framework所在的Target
  3. 選擇Build Phases
  4. 點擊Header左下角的+號把你要暴露的頭文件添加到Public裏面(默認添加到Project裏面,用鼠標把它拽過去)
  5. 在Compile source裏面添加實現的.m文件

三、修改framework的Deployment Target 

改成和項目工程同樣的支持版本,我這邊是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

 

四、更改framework的名字

不須要更改能夠直接忽略。項目Target -> Build Setting -> Product Module Name/Produce Name ,改爲 CarthageTestSDK框架

五、配置類別和支持Bitcode

  • 若是你使用了類別,那麼你須要在Build Settings的Linking的Other Linker Flags里加上 -all_load
  • 若是你想你的工程支持bitcode,須要在Other C Flags 里加上 -fembed-bitcode

  以上都不須要,能夠忽略這一步,跳到第5步。測試

六、分享你的工程

選擇 Manager Schemes,給CarthageTestSDK勾上sharedui

 

本地驗證

 到這裏,基本上你已經成功了,那麼咱們來驗證一下,咱們cd到項目文件夾,運行spa

$ carthage build --no-skip-current

命令運行完成後,你會發現你的項目文件夾裏面多了一個Carthage文件夾

Carthage->Build->iOS->CarthageTestSDK.framework

 這個就是咱們須要的framework了,那麼接下來,咱們在本地驗證一下。

一、把framework拖進工程中,點擊copy

二、添加動態庫

target->Build Phases ->左上角+號 ->New Copy Files Phase 而後在Copy Files下 Destination選擇Frameworks ->添加你本身的動態庫

三、測試驗證成功

咱們首先編譯一下,沒報錯,導入頭文件,正常輸出,編譯成功。驗證成功。

四、發佈並打上Tag

將代碼上傳到git上面,Carthage -> Build 目錄是不須要上傳的。

git tag 0.1.0
git push --tags

至此你的庫以及支持 Carthage 了,可讓其餘開發者使用 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】差很少,具體配圖看上面。

一、建立Framework

在已有的工程上,新建一個Target。項目-> File -> New -> Target , 選擇Framework ,命名爲 WBOCRFramework ,並刪除建立多出來的 WBOCRFramework.h

二、將SDK的頭文件公佈出來

將 WBOCRService.framework 的頭文件拉出來,放在libs文件夾裏面,注意,雖然是拉了出來,但文件的路徑是和原來同樣的。

      

三、配置你的framework

  1. 選擇你的工程
  2. 選擇framework所在的Target
  3. 選擇Build Phases
  4. 點擊Header左下角的+號把你要暴露的頭文件添加到Public裏面(默認添加到Project裏面,用鼠標把它拽過去)
  5. 在Compile source裏面添加實現的.m文件。因爲沒有.m文件,能夠直接忽略掉
  6. 在Link Binary With Libraries 中,將libs的文件所有增長進去,同時,還須要將全部依賴的系統framework也增長進去。

 

四、修改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

五、更改framework的名字

不須要更改能夠直接忽略。項目Target -> Build Setting -> Product Module Name/Produce Name ,改爲 WBOCR

六、配置類別和支持Bitcode

  • 在Build Settings的Linking的Other Linker Flags里加上 -all_load
  • 工程須要支持bitcode,須要在Other C Flags 里加上 -fembed-bitcode

七、分享你的工程

選擇 Manager Schemes,給WBOCRFrame勾上shared

八、生成framework並驗證 

到這裏,基本上你已經成功了,那麼咱們來驗證一下,咱們cd到項目文件夾,運行

$ carthage build --no-skip-current

可是,咱們發現,報錯了。在終端上,會告訴咱們,報錯的日誌輸出在哪裏

接下來,咱們前往報錯的日誌,經過查看日誌,是由於librecdetect.a文件須要支持Bitcode。

最簡單的解決方法,就是開啓BitCode,以下圖:

 

命令運行完成後,你會發現你的項目文件夾裏面多了一個Carthage文件夾,這個就是咱們須要的framework了,那麼接下來,咱們在本地驗證一下。參照上面【讓你的項目支持Carthage】的步驟。

存在的問題

一、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加進去

 

碰到的問題

一、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

相關文章
相關標籤/搜索