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相比:
- 可以用單個.xcframework文件提供多個平臺的分發(fā)二進(jìn)制文件;
- 與Fat Header相比,可以按照平臺劃分,可以包含相同架構(gòu)的不同平 臺的文件;
- 在使用時,不需要再通過腳本去剝離不需要的架構(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
我們看到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
我們看到我們的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)庫的路徑。