1.XCFramework
XCFramework:是蘋(píng)果官方推薦的,支持的,可以更方便的表示一個(gè)多個(gè)平臺(tái)結(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相比:
- 可以用單個(gè).xcframework文件提供多個(gè)平臺(tái)的分發(fā)二進(jìn)制文件;
- 與Fat Header相比,可以按照平臺(tái)劃分,可以包含相同架構(gòu)的不同平 臺(tái)的文件;
- 在使用時(shí),不需要再通過(guò)腳本去剝離不需要的架構(gòu)體系。
2.編譯自己的sdk,生成XCFramework
2.1.分別構(gòu)建模擬器和真機(jī)的打包文件
我們創(chuàng)建的static library形式框架不能使用XCFramework,只針對(duì)Framework形式。
//模擬器平臺(tái)打包
xcodebuild archive -project 'LearnXCFramework.xcodeproj' \
-scheme 'LearnXCFramework' \
-configuration Release \
-destination 'generic/platform=iOS Simulator' \
-archivePath './archives/LearnXCFramework.framework-iphonesimulator.xcarchive' SKIP_INSTALL=NO
//真機(jī)下打包
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,才會(huì)把我們的編譯產(chǎn)物放到produce下。
2.2.合并框架
我們使用lipo,缺點(diǎn)是如果兩個(gè)架構(gòu)含有同一個(gè)結(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

我們看到xcodebuild根據(jù)平臺(tái)和架構(gòu)生成不同的framework,但是我們的dsym和BCSymbolMaps文件卻不見(jiàn)了。
我們調(diào)整命令
xcodebuild -create-xcframework \
-framework '../archives/LearnXCFramework.framework-iphones.xcarchive/Products/Library/Frameworks/LearnXCFramework.framework' \
-debug-symbols '/Users/MacW/Desktop/loginlearn/強(qiáng)化版/強(qiáng)化班-5-動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)實(shí) 戰(zhàn)/自己/XCFramework/LearnXCFramework/archives/LearnXCFramework.framework-iphones.xcarchive/BCSymbolMaps/91D99F1A-2783-34D6-BFE3-AAE0DF0F8E04.bcsymbolmap' \
-debug-symbols '/Users/MacW/Desktop/loginlearn/強(qiáng)化版/強(qiáng)化班-5-動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)實(shí) 戰(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/強(qiáng)化版/強(qiáng)化班-5-動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)實(shí) 戰(zhàn)/自己/XCFramework/LearnXCFramework/archives/LearnXCFramework.framework-iphonesimulator.xcarchive/dSYMs/LearnXCFramework.framework.dSYM' \
-output LearnXCFramework.xcframework

我們看到我們的dsym和BCSymbolMaps都存在。使用的時(shí)候它會(huì)動(dòng)態(tài)的只加載當(dāng)前需要的架構(gòu)。
2.庫(kù)與庫(kù)之間的混合運(yùn)用
2.1動(dòng)動(dòng)庫(kù)之間
經(jīng)常出現(xiàn)的問(wèn)題,無(wú)法加載被動(dòng)態(tài)庫(kù)引用的動(dòng)態(tài)庫(kù),我們要設(shè)置rpath,或者像cocoapods那樣,把動(dòng)態(tài)庫(kù)直接copy到執(zhí)行文件目錄下。
2.2動(dòng)靜庫(kù)之間
如果app內(nèi)想使用靜態(tài)庫(kù)類,直接指定header search path就可以在app內(nèi)使用。
如果我們不想讓外界使用靜態(tài)庫(kù),我們可以在動(dòng)態(tài)庫(kù)的配置文件中設(shè)置隱藏
-Xlinker -hidden-l"AFNetworking"
2.3靜靜庫(kù)之間
需要指定后者靜態(tài)庫(kù)的路徑。
2.4靜動(dòng)
需要特別指明動(dòng)態(tài)庫(kù)的路徑。