iOS .a庫打包成.framework(將極光推送的.a庫打包進(jìn)framework)

兩個(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ù)性。

本文以極光推送(JPushSDK為例,一步步將極光推送的.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如下:
UtilLib.xcodeproj
2.2、修改UtilLib -> Build Settings配置如下:
UtilLib.xcodeproj

三、修改WorkProj配置,運(yùn)行工程

3.1、WorkProj工程中,在Build Phases -> Link Binary With Libraries中添加新建的庫.framework。引用新建的framework。
WorkProj.xcodeproj
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橋接文件名稱(在工程根路徑下可直接寫文件名,否則要寫它的相對路徑)
WorkProj.xcodeproj

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

AppDelegate.swift

可以正常運(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è)置它的路徑即可。
screenshot7.png
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)
implementation not found

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容