1. 程式人生 > >Xcode8.1 生成靜態Framework(包含介面、圖片、第三方庫、第三方framework)

Xcode8.1 生成靜態Framework(包含介面、圖片、第三方庫、第三方framework)

因為專案需求要求,需要把專案整體打包,這裡就涉及到圖片、介面、第三方的庫。折騰了很久,走過很多坑。特此簡單記錄一下用Xcode8.1 生成靜態Framework的步驟,避免下次再掉坑。

1.建立專案
這裡寫圖片描述

2、配置framework引數,設定frameWork為靜態庫
注意圖中左側選擇的是黃色小箱子,然後在build-setting中搜索mach,將設定項更改為static library。預設是Dynamic library
這裡寫圖片描述

3、關閉bitconde。包括Project以及tagets
這裡寫圖片描述
這裡寫圖片描述

4、新建bundle用來存放Xib和png等資原始檔(注意名字不能和靜態庫重複),選擇空白處,點選“+”
這裡寫圖片描述

5、因為iOS沒有這一項,所以需要選擇macOS,然後搜尋bundle。
這裡寫圖片描述

6、新建的bundle是針對macOS的,所以需要我們手動修改BaseSDK,如圖,預設是macOS
這裡寫圖片描述

7、設定Bundle的COMBINE_HIDPQ_IMAGES為NO
否則bundle中的png圖片經過編譯打包會變成tiff的檔案,進而導致對應圖片找不到
這裡寫圖片描述

至此,我們就已經完成簡單的sdk配置。現在就需要把要打包的檔案加進來

8、首先匯入.m以及.h檔案
這裡寫圖片描述

匯入.m檔案
這裡寫圖片描述

匯入.h檔案
這裡寫圖片描述

其中,.h檔案有三個檔案。一個是public 一個private 一個是project。預設匯入都是在project下,我們需要把需要暴露的標頭檔案,移動到public下。只要右鍵移動選擇後確定即可
這裡寫圖片描述

注意:
(1)針對用到第三方用到的庫,也需要匯入。如果不匯入會報錯,但是,我們只是進行引入。按照上述方法匯入.m以及.h檔案之後,選擇工程中的檔案,在右側欄就關聯專案的選擇去掉。這樣我們就聲明瞭第三庫,然後在整合的專案中再去新增第三庫
這裡寫圖片描述
(2)針對用到的第三方framework檔案,也是一樣的方法。需要將第三方的framework檔案拷貝到專案中,手動匯入。記得去掉關聯專案選項,然後在整合的專案中再去新增
這裡寫圖片描述

9、現在設定bundle,主要是存放Xib和png。
這裡寫圖片描述

至此需要配置以及匯入的檔案已經完成。現在就是打包。網上很多關於模擬器以及真機的打包。兩者分別打包後再合併。其實只要設定一步即可實現只打一次。

10、打包framwork以及bundle,設定不區別機型。
這裡寫圖片描述
bundle也是一樣的設定
這裡寫圖片描述

11、生成靜態庫framework和bundle檔案
分別選中選擇靜態庫和bundle檔案,然後run,然後open in finder,就會得到兩個檔案,就是我們打包後的檔案
這裡寫圖片描述

12、新建專案,將打包好的靜態庫framework和bundle檔案拷貝到專案中,並且手動匯入。新增一下依賴庫。剛才我們對第三方framework只是引入,這個時候也要加進來
這裡寫圖片描述

13、剛才我們對第三方庫只是引入,這個時候也要加進來
這裡寫圖片描述

14、因為我們對影象以及頁面進行打包。這樣,存放頁面以及圖片的路徑改變了。所以我們在使用時,要使用絕對路徑

頁面跳轉:
TCLimitsViewController *home = [[TCLimitsViewController alloc] initWithNibName:@”TestBundle.bundle/TCLimitsViewController” bundle:nil];

圖片引用:
UIImage *imge=[UIImage imageNamed:@”TestBundle.bundle/test”];
如果在頁面設定的圖片,只要在Assets儲存,就不要修改路徑,還是儲存在需要整合的Assets檔案中

標頭檔案的引用
這裡寫圖片描述

以上是打包framework的過程。

可能出現的問題:
1、如果在引入static library之後,出現報錯的情況:
unrecognized selector sent to instance
Terminating app due to uncaught exception ‘NSInvalidArgumentException’
出現上述情況可能是因為需要調整如下設定:
這裡寫圖片描述

2、出現下面的錯誤
Undefined symbols for architecture arm64:”OBJC_CLASS$_XX”,referencedfrom:someFile
ld:symbol(s) not found for architecture arm64
缺少了XX.m檔案,導致的錯誤

3、如果新增打包好的靜態庫後,執行報一些莫名其妙的錯誤。
可以檢查一下引用的第三方靜態庫是否需要C++編譯環境,如果需要,就隨意修改一個.m檔案為.mm

4、如果報
Terminating app due to uncaught exception ‘NSInternalInconsistencyException’, reason: ‘Could not load NIB in bundle:
說明頁面載入的路徑有誤。請參考14解決

5、如果報
Unknown class xxCell in Interface Builder file.
Terminating app due to uncaught exception ‘NSUnknownKeyException’, reason: ‘[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key namLabel.’
這個情況比較常見在cell檔案的載入。可以在載入之前新增宣告
[xxCell class];

例如:
static NSString *cellIdentifier = @”xxCell”;
[xxCell class];
//自定義cell類
xxCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) {
cell = [[[NSBundle mainBundle] loadNibNamed:@”TestBundle.bundle/xxCell” owner:self options:nil] firstObject];
}

以上是我的一些簡單見解,如果有任何不足之處,歡迎指正。