iOS:XCFramework

1.XCFramework

XCFramework:是蘋果官方推薦的,支持的,可以更方便的表示一個多個平臺結(jié)構(gòu)的分發(fā)二進(jìn)制的格式。
需要Xcode 11以上支持,
是為更好的支持Mac Catalyst和ARM芯片的macOS。 專?在2019年提出的framework的另一種先進(jìn)格式。
iOS/iPad:arm64
iOS/iPad Simulator:x86_64 arm64
Mac Catalyst: x86_64 arm64 Mac: x86_64 arm64
和傳統(tǒng)的framework相比:

  1. 可以用單個.xcframework文件提供多個平臺的分發(fā)二進(jìn)制文件;
  2. 與Fat Header相比,可以按照平臺劃分,可以包含相同架構(gòu)的不同平 臺的文件;
  3. 在使用時,不需要再通過腳本去剝離不需要的架構(gòu)體系。

2.編譯自己的sdk,生成XCFramework

2.1.分別構(gòu)建模擬器和真機的打包文件

我們創(chuàng)建的static library形式框架不能使用XCFramework,只針對Framework形式。

//模擬器平臺打包
xcodebuild archive -project 'LearnXCFramework.xcodeproj' \
-scheme 'LearnXCFramework' \
-configuration Release \
-destination 'generic/platform=iOS Simulator' \
-archivePath './archives/LearnXCFramework.framework-iphonesimulator.xcarchive' SKIP_INSTALL=NO
//真機下打包
xcodebuild archive -project 'LearnXCFramework.xcodeproj' \
-scheme 'LearnXCFramework' \
-configuration Release \
-destination 'generic/platform=iOS' \
-archivePath './archives/LearnXCFramework.framework-iphones.xcarchive' SKIP_INSTALL=NO

SKIP_INSTALL只有設(shè)置成NO,才會把我們的編譯產(chǎn)物放到produce下。

2.2.合并框架

我們使用lipo,缺點是如果兩個架構(gòu)含有同一個結(jié)構(gòu),合并失敗,還要分別處理dsym文件,這里我們使用xcodebuild -create-xcframework命令

xcodebuild -create-xcframework \
-framework '../archives/LearnXCFramework.framework-iphones.xcarchive/Products/Library/Frameworks/LearnXCFramework.framework' \
-framework '../archives/LearnXCFramework.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/LearnXCFramework.framework' \
-output LearnXCFramework.xcframework
image.png

我們看到xcodebuild根據(jù)平臺和架構(gòu)生成不同的framework,但是我們的dsym和BCSymbolMaps文件卻不見了。
我們調(diào)整命令

 xcodebuild -create-xcframework \
-framework '../archives/LearnXCFramework.framework-iphones.xcarchive/Products/Library/Frameworks/LearnXCFramework.framework' \
-debug-symbols '/Users/MacW/Desktop/loginlearn/強化版/強化班-5-動態(tài)庫與靜態(tài)庫實 戰(zhàn)/自己/XCFramework/LearnXCFramework/archives/LearnXCFramework.framework-iphones.xcarchive/BCSymbolMaps/91D99F1A-2783-34D6-BFE3-AAE0DF0F8E04.bcsymbolmap' \
-debug-symbols '/Users/MacW/Desktop/loginlearn/強化版/強化班-5-動態(tài)庫與靜態(tài)庫實 戰(zhàn)/自己/XCFramework/LearnXCFramework/archives/LearnXCFramework.framework-iphones.xcarchive/dSYMs/LearnXCFramework.framework.dSYM' \
-framework '../archives/LearnXCFramework.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/LearnXCFramework.framework' \
-debug-symbols '/Users/MacW/Desktop/loginlearn/強化版/強化班-5-動態(tài)庫與靜態(tài)庫實 戰(zhàn)/自己/XCFramework/LearnXCFramework/archives/LearnXCFramework.framework-iphonesimulator.xcarchive/dSYMs/LearnXCFramework.framework.dSYM' \
-output LearnXCFramework.xcframework
image.png

我們看到我們的dsym和BCSymbolMaps都存在。使用的時候它會動態(tài)的只加載當(dāng)前需要的架構(gòu)。

2.庫與庫之間的混合運用

2.1動動庫之間

經(jīng)常出現(xiàn)的問題,無法加載被動態(tài)庫引用的動態(tài)庫,我們要設(shè)置rpath,或者像cocoapods那樣,把動態(tài)庫直接copy到執(zhí)行文件目錄下。

2.2動靜庫之間

如果app內(nèi)想使用靜態(tài)庫類,直接指定header search path就可以在app內(nèi)使用。
如果我們不想讓外界使用靜態(tài)庫,我們可以在動態(tài)庫的配置文件中設(shè)置隱藏
-Xlinker -hidden-l"AFNetworking"

2.3靜靜庫之間

需要指定后者靜態(tài)庫的路徑。

2.4靜動

需要特別指明動態(tài)庫的路徑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容