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

weixin_34208283發表於2017-01-09

兩個以上的工程同時開發時,如果需要引用相同的網路層、第三方庫、工具類等程式碼,可以考慮將其放到一個workspace;將共同程式碼抽取出來,放在該工程的一個framework中。考慮到編譯步驟的複雜性,通常一個workspace建立一個 framework就可以了。
這樣,在不同工程中只要引用該framework,即可呼叫它裡面的方法。不用同一份程式碼拷貝兩個以上的地方,避免不同工程中的實現程式碼不一致,提高了開發效率和可維護性。

本文以極光推送(JPushSDK為例,一步步將極光推送的.a庫以framework的形式打包進自己專案的workspace。專案釋出在我的GitHub主頁
整個步驟走完即可避免專案實施過程中的坑。下面一起來看看吧。

一、建立工程

首先建立一個workspace、包含一個Cocoa Touch Framework和一個Swift工程。這個比較簡單。目錄結構如下:

3076482-1d897cef240e4d51.png
工程目錄

二、修改UtilLib工程配置

2.1、修改UtilLib工程的Build Phases如下:
3076482-e2bffce47ecc5167.png
UtilLib.xcodeproj
2.2、修改UtilLib -> Build Settings配置如下:
3076482-6d8f2cdfe68be399.png
UtilLib.xcodeproj

三、修改WorkProj配置,執行工程

3.1、WorkProj工程中,在Build Phases -> Link Binary With Libraries中新增新建的庫.framework。引用新建的framework
3076482-6816620c22ffe238.png
WorkProj.xcodeproj
3.2、新建橋接檔案WorkProj-Bridging-Header.h。因為中Swift中混編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設定OC橋接檔名稱(在工程根路徑下可直接寫檔名,否則要寫它的相對路徑)
3076482-3e8d877d360dad30.png
WorkProj.xcodeproj

四、準備就續,首先執行UtilLib工程,再執行WorkProj工程:

3076482-2cca455fc0ce8472.png
AppDelegate.swift

可以正常執行了。
檢視編譯後的檔案,雖然UtilLib.framework只有844Kb,但是在外部工程中可以連結並呼叫UtilLib.framework的方法。

五、錯誤收集:

這期間有不少的坑,有些是能非常簡單的解決的,有些在網上並沒有直接的解決辦法。現在列出來記錄一下:

5.1、如果路徑不對,會報如下的錯誤。此時在Objective-C Bridging Header中設定它的路徑即可。
3076482-efe83452d66bef5f.png
screenshot7.png
5.2、執行WorkProj工程,會報錯誤:
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)
3076482-5b206512ce7c3840.png
implementation not found

大意是JPUSHService沒有實現檔案。原因是UtilLib.framework檔案中並不包含JPUSHService類的實現。
解決辦法是在framework -> Build Settings -> Other Linker Flags加入-all_load-ObjC。即文中2.2步驟

相關文章