1.XCFramework
XCFramework:是苹果官方推荐的,支持的,可以更方便的表示一个多个平台结构的分发二进制的格式。
需要Xcode 11以上支持,
是为更好的支持Mac Catalyst和ARM芯片的macOS。 专⻔在2019年提出的framework的另一种先进格式。
iOS/iPad:arm64
iOS/iPad Simulator:x86_64 arm64
Mac Catalyst: x86_64 arm64 Mac: x86_64 arm64
和传统的framework相比:
- 可以用单个.xcframework文件提供多个平台的分发二进制文件;
- 与Fat Header相比,可以按照平台划分,可以包含相同架构的不同平 台的文件;
- 在使用时,不需要再通过脚本去剥离不需要的架构体系。
2.编译自己的sdk,生成XCFramework
2.1.分别构建模拟器和真机的打包文件
我们创建的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只有设置成NO,才会把我们的编译产物放到produce下。
2.2.合并框架
我们使用lipo,缺点是如果两个架构含有同一个结构,合并失败,还要分别处理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根据平台和架构生成不同的framework,但是我们的dsym和BCSymbolMaps文件却不见了。
我们调整命令
xcodebuild -create-xcframework \
-framework '../archives/LearnXCFramework.framework-iphones.xcarchive/Products/Library/Frameworks/LearnXCFramework.framework' \
-debug-symbols '/Users/MacW/Desktop/loginlearn/强化版/强化班-5-动态库与静态库实 战/自己/XCFramework/LearnXCFramework/archives/LearnXCFramework.framework-iphones.xcarchive/BCSymbolMaps/91D99F1A-2783-34D6-BFE3-AAE0DF0F8E04.bcsymbolmap' \
-debug-symbols '/Users/MacW/Desktop/loginlearn/强化版/强化班-5-动态库与静态库实 战/自己/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-动态库与静态库实 战/自己/XCFramework/LearnXCFramework/archives/LearnXCFramework.framework-iphonesimulator.xcarchive/dSYMs/LearnXCFramework.framework.dSYM' \
-output LearnXCFramework.xcframework
我们看到我们的dsym和BCSymbolMaps都存在。使用的时候它会动态的只加载当前需要的架构。
2.库与库之间的混合运用
2.1动动库之间
经常出现的问题,无法加载被动态库引用的动态库,我们要设置rpath,或者像cocoapods那样,把动态库直接copy到执行文件目录下。
2.2动静库之间
如果app内想使用静态库类,直接指定header search path就可以在app内使用。
如果我们不想让外界使用静态库,我们可以在动态库的配置文件中设置隐藏
-Xlinker -hidden-l"AFNetworking"
2.3静静库之间
需要指定后者静态库的路径。
2.4静动
需要特别指明动态库的路径。