兩個(gè)以上的工程同時(shí)開發(fā)時(shí),如果需要引用相同的網(wǎng)絡(luò)層、第三方庫、工具類等代碼,可以考慮將其放到一個(gè)workspace;將共同代碼抽取出來,放在該工程的一個(gè)framework中??紤]到編譯步驟的復(fù)雜性,通常一個(gè)workspace建立一個(gè) framework就可以了。
這樣,在不同工程中只要引用該framework,即可調(diào)用它里面的方法。不用同一份代碼拷貝兩個(gè)以上的地方,避免不同工程中的實(shí)現(xiàn)代碼不一致,提高了開發(fā)效率和可維護(hù)性。
本文以極光推送(JPush)SDK為例,一步步將極光推送的.a庫以framework的形式打包進(jìn)自己項(xiàng)目的workspace。項(xiàng)目發(fā)布在我的GitHub主頁。
整個(gè)步驟走完即可避免項(xiàng)目實(shí)施過程中的坑。下面一起來看看吧。
一、創(chuàng)建工程
首先創(chuàng)建一個(gè)workspace、包含一個(gè)Cocoa Touch Framework和一個(gè)Swift工程。這個(gè)比較簡單。目錄結(jié)構(gòu)如下:

二、修改UtilLib工程配置
2.1、修改UtilLib工程的Build Phases如下:

2.2、修改UtilLib -> Build Settings配置如下:

三、修改WorkProj配置,運(yùn)行工程
3.1、WorkProj工程中,在Build Phases -> Link Binary With Libraries中添加新建的庫.framework。引用新建的framework。

3.2、新建橋接文件WorkProj-Bridging-Header.h。因?yàn)橹蠸wift中混編OC,需要橋接。
#WorkProj-Bridging-Header.h
#ifndef WorkProj_Bridging_Header_h
#define WorkProj_Bridging_Header_h
#import <UtilLib/JPUSHService.h>
#endif /* WorkProj_Bridging_Header_h */
3.3、在工程的Build Settings設(shè)置OC橋接文件名稱(在工程根路徑下可直接寫文件名,否則要寫它的相對路徑)

四、準(zhǔn)備就續(xù),首先運(yùn)行UtilLib工程,再運(yùn)行WorkProj工程:

可以正常運(yùn)行了。
查看編譯后的文件,雖然
UtilLib.framework只有844Kb,但是在外部工程中可以鏈接并調(diào)用UtilLib.framework的方法。
五、錯(cuò)誤收集:
這期間有不少的坑,有些是能非常簡單的解決的,有些在網(wǎng)上并沒有直接的解決辦法?,F(xiàn)在列出來記錄一下:
5.1、如果路徑不對,會(huì)報(bào)如下的錯(cuò)誤。此時(shí)在Objective-C Bridging Header中設(shè)置它的路徑即可。

5.2、運(yùn)行WorkProj工程,會(huì)報(bào)錯(cuò)誤:
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_JPUSHService", referenced from: objc-class-ref in AppDelegate.old: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

大意是JPUSHService沒有實(shí)現(xiàn)文件。原因是UtilLib.framework文件中并不包含JPUSHService類的實(shí)現(xiàn)。
解決辦法是在framework -> Build Settings -> Other Linker Flags加入-all_load、-ObjC。即文中2.2步驟。