face++靜態庫轉爲動態庫

前言

蘋果商店上架應用,有規定支持iOS8.0以上的iPA可執行文件的大小不能超過60M。 face++提供過來的是靜態庫,會致使蘋果上架的ipa的包增長1.5M左右。而恰好咱們的APP包Mach-O文件大小接近60M,於是,最好的方式是經過動態庫的方式來接入。html

Face++文件: https://faceid.com/pages/documents/37661898ios

SDK須要問Face++的人拿,Demo跑起來是須要key和secret的git

靜態庫轉動態庫

靜態庫轉動態庫,有兩種轉換方式,一是直接建一個動態庫工程,將相關的framework拉進入構建打包,二是經過carthage來打包構建。這兩種方式都須要處理一下圖片資源的讀取方式。github

carthage構建動態庫

一、工程Demo

face++的SDK裏有Demo,咱們拿到demo,填入kApiKey 和 kApiSecret 是能夠直接跑起來的。實際上,SDK只有下面三個文件shell

  • MGFaceIDBaseKit.framework
  • MGFaceIDLiveDetect.framework
  • MGFaceIDLiveCustomDetect.bundle

二、建立framework

直接在face++的Demo的工程上,新建一個Target。項目-> File -> New -> Target , 選擇Framework ,命名爲 MGLiveDetectFramework。app

建立成功後以下圖,並刪除多出來的MGLiveDetectFramework.h模塊化

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

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

新的項目結構以下:spa

四、配置你的framework

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

五、修改framework的Deployment Target 

改成和項目工程同樣的支持版本,我這邊是8.0。 必定要注意這裏,要否則,編譯會報錯或者編譯不報錯時,低版本的系統會安裝不了。報錯相似:3d

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 ,改爲 MGLiveDetect

七、配置類別和支持Bitcode

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

說明:若是你使用了類別,那麼你須要在Build Settings的Linking的Other Linker Flags里加上。爲了不麻煩,直接改成 -all_load

八、分享你的工程

選擇 Manager Schemes,給 MGLiveDetectFramework 勾上shared

九、指定編譯方式

實際上,對普通的靜態庫,咱們操做完前面的步驟,已經能夠編譯成動態庫了。可是對於face++來講,在編譯的時候,會報以下的錯:

經過查看face++的demo集成work文檔,寫着靜態庫是採用Objective-C++的方式來實現

所以,咱們須要改一下以下配置,編譯成功。

本地驗證

一、生成動態庫

cd到項目文件夾,運行

$ carthage build --no-skip-current

命令運行完成後,你會發現你的項目文件夾裏面多了一個Carthage文件夾,其中【MGLiveDetect.framework】就是咱們須要的動態庫。

二、集成到工程上驗證

第一步:咱們新拷一份face++給過來的demo,將Carthage所有拷到Demo根目錄下

 

第二步:打開工程,將工程下面的framework和bundle文件都刪除掉

第三步:添加動態庫

要注意順序,先1,再2,這樣,添加的framework纔會在工程的Frameworks文件目錄下。

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

新的目錄結構以下,很清析

三、更改頭的引用

OK,能夠正常跑起來了。

上傳到GitHub管理

一、上傳github

將配置了carthage的工程Demo代碼,上傳到git上面,並打上標籤。Carthage -> Build 目錄是不須要上傳的

git tag 0.1.0 
git push --tags

二、建立Carthage

在要接入的項目根目下,建立一個Carthage,並將github的連接指向。相似pod的操做

$ touch Cartfile
 
git "http://www.github.com/xxxxMegLiveStill.git"~> 1.0.0

三、保存並關閉cartfile文件,進行安裝

carthage update --no-use-binaries --platform ios

安裝完以後根目錄會出現一個叫Carthage的文件夾,裏面包含Build和Checkouts兩個文件夾。

Build:iOS路徑下的就是framework包,須要自行引用進來。

Checkouts:是從Github上獲取來的源碼,因此理論上來講你在這個文件夾裏對源碼進行任何的修改,再次執行 carthage build 就會根據這裏的源碼打包出相應的framework出來。但須要注意的是當每次執行carthage update後這裏的源碼又被覆蓋了。因此你有特別須要修改的地方能夠加例外防止覆蓋!!!! 重要

四、項目引入framework

這個和上面的【本地驗證】是同樣的。

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

存在的問題

一、Bundle圖片資源加載不出來

使用動態庫跑起來以後,咱們發現,界面的圖片資源不見了,咱們在打動態庫的時候,明明已經加了將Bundle文件打包進來了呀。經過分析,大多數的SDK加載圖片,都寫死了是從根目錄讀取,寫法如:

但咱們打包成動態庫以後,Bundle文件已經不在根目錄了,根本就找不到。

有兩種處理方式

第一種(不推薦)

將bundle再引進工程裏,能夠解決大部分APP的資源加載。

缺點:

bundle沒有任何地方引用,容易被誤傷

項目是模塊化結構,每一個業務線是一個獨立的framework的時候,仍是加載不出來。

第二種(推薦)

經過查資料,參照一下github上的開源庫MJRefresh(https://github.com/CoderMJLee/MJRefresh)的寫法,先讀取存在類的Bundle路徑,再找到圖片的路徑。這樣,無論封裝多少層,bundle圖片資源都不會丟失。

咱們能夠寫在一個NSBundle的分類裏,寫法以下:

具體思路,別人修改的實現方式

1. main bundle 下判斷是否存在bundle,存在就直接使用

2. 若是1找不到,就會到SDK可執行文件對應的目錄下面去找WBOCRService.bundle

基本上都是建立一個UIImage的分類來統一處理。

 直接工程建立動態庫

經過直接建一個動態庫工程,將相關的靜態庫framework拉進入構建打包成動態庫,點擊連接到下一篇的分享:

face++靜態庫轉爲動態庫之二

相關文章
相關標籤/搜索