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


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

  1. 選擇你的工程
  2. 選擇framework所在的Target
  3. 選擇Build Phases
  4. 點擊Header左下角的+號把你要暴露的頭文件添加到Public里面(默認添加到Project里面,用鼠標把它拽過去)
  5. 在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

  1. 選擇你的工程
  2. 選擇framework所在的Target
  3. 選擇Build Phases
  4. 點擊Header左下角的+號把你要暴露的頭文件添加到Public里面(默認添加到Project里面,用鼠標把它拽過去)
  5. 在Compile source里面添加實現的.m文件。由於沒有.m文件,可以直接忽略掉
  6. 在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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM