什么是XCFramework
XCFramework是伴随着Xcode 11,苹果推出的新的二进制框架分发格式。
-
支持将模拟器和设备的二进制库捆绑在一起;
-
支持将多个平台的的二进制库捆绑在一起,它支持苹果所有的平台:iOS, macOS, tvOS, watchOS, iPadOS, carPlayOS;
-
支持将framework捆绑在一起,也支持将静态库.a及其公共头文件.h捆绑在一起。
-
支持Swift、C、OC;
-
二进制接口的稳定性: Xcode 11为Swift模块引入了一种新的格式,称为Swift模块接口。就像已编译模块格式一样,它们列出了模块的所有公共API,但使用的是更像源代码的文本形式。由于它们的行为类似于源代码,那么Swift编译器的未来版本将能够导入使用旧版本创建的模块接口。当启用Build Libraries for Distribution时,是在告诉编译器在构建框架时去生成一个稳定的接口。
之前Swift也可以编译成framework,但是对于不同版本的Xcode,因为Swift版本的不同,编译器版本的不同,从而生成的framework无法在不同Xcode版本运行;
-
更多内容请查看文尾的参考资料 WWDC 2019: Binary Frameworks in Swift
创建XCFramework
-
前序知识
- 掌握Shell脚本的基本语法
- 掌握framework、Static Library(.a)的创建、分发、引用。
-
创建
以静态framework工程为例:创建一个framework工程
-
设置
在framework工程的Targets下选中要构建的target,在Build Settings中
- 设置:Mach-O type 为 Static Library
- 设置:Build Libraries for Distribution 为 YES (也可在构建脚本中设置)
- 设置:skip install 为 YES (也可在构建脚本中设置)
WWDC原文:
And when you enable Build Libraries for Distribution, you're telling the compiler to generate one of these stable interfaces whenever it builds your framework.
You will also need to pass the Skip Install build setting, and set it to No.This tells xcodebuild archive to install your framework in the resulting archive.
-
构建工具
xcodebuild archive
xcodebuild -create-xcframework -
构建脚本
framework->XCFramework :
# 参数
scheme="<your scheme>"
framework_name=${scheme}
archive_path="archives"
archive_iphoneos_path="${archive_path}/iphoneos.xcarchive"
archive_iphone_simulator_path="${archive_path}/iphonesimulator.xcarchive"
out_dir="out"
# 清理
function build_clean() {
echo "======build_clean======"
rm -rf ./archives
rm -rf ./${out_dir}
}
# 编译
function build_framework {
echo "======build_framework======"
xcodebuild archive -scheme ${scheme} -sdk iphoneos -archivePath ${archive_iphoneos_path} BUILD_LIBRARY_FOR_DISTRIBUTION=YES SKIP_INSTALL=NO || exit 1
xcodebuild archive -scheme ${scheme} -sdk iphonesimulator -archivePath ${archive_iphone_simulator_path} BUILD_LIBRARY_FOR_DISTRIBUTION=YES SKIP_INSTALL=NO || exit 1
}
# 合并
function build_xcframework() {
echo "======build_xcframework======"
xcodebuild -create-xcframework -framework "${archive_iphoneos_path}/Products/Library/Frameworks/${scheme}.framework" -framework "${archive_iphone_simulator_path}/Products/Library/Frameworks/${scheme}.framework" -output ${out_dir}/${framework_name}.xcframework || exit 1
}
# 压缩
function build_zip {
echo "======build_zip======"
cd ${out_dir}
time=`date +%y%m%d%H%M%S`
name=${framework_name}_${time}.zip
zip -r -m -o ${framework_name}.xcframework.zip ${framework_name}.xcframework || exit 1
}
# 调用
build_clean
build_framework
build_xcframework
build_zip
.a->XCFramework
# 参数
scheme="<your scheme>"
library_name=${scheme}
archive_path="archives"
archive_iphoneos_path="${archive_path}/iphoneos.xcarchive"
archive_iphone_simulator_path="${archive_path}/iphonesimulator.xcarchive"
# 静态库公共头文件目录
library_public_header_path="<your library public header path>" # 如:${scheme}/public_headers
out_dir="out"
# 清理
function build_clean() {
echo "======build_clean======"
rm -rf ./archives
rm -rf ./${out_dir}
}
# 编译
function build_library {
echo "======build_library======"
xcodebuild archive -scheme ${scheme} -sdk iphoneos -archivePath ${archive_iphoneos_path} BUILD_LIBRARY_FOR_DISTRIBUTION=YES SKIP_INSTALL=NO || exit 1
xcodebuild archive -scheme ${scheme} -sdk iphonesimulator -archivePath ${archive_iphone_simulator_path} BUILD_LIBRARY_FOR_DISTRIBUTION=YES SKIP_INSTALL=NO || exit 1
}
# 合并
function build_xcframework() {
echo "======build_xcframework======"
xcodebuild -create-xcframework -library "${archive_iphoneos_path}/Products/usr/local/lib/lib${scheme}.a" -headers "${library_public_header_path}/" -library "${archive_iphone_simulator_path}/Products/usr/local/lib/lib${scheme}.a" -headers "${library_public_header_path}" -output ${out_dir}/${library_name}.xcframework || exit 1
}
# 压缩
function build_zip {
echo "======build_zip======"
cd ${out_dir}
time=`date +%y%m%d%H%M%S`
name=${library_name}_${time}.zip
zip -r -m -o ${library_name}.xcframework.zip ${library_name}.xcframework || exit 1
}
# 调用
build_clean
build_library
build_xcframework
build_zip
引用
XCFramework与framework的引用方式相同,将XCFramework文件拖入工程配置General下的Framewroks、Libraries、and Embedded Content后,按framework的类型设置选项即可。Xcode将自动设置搜索路径。
Xcode在构建时将使用所包含框架或库的正确平台版本。
总结
XCFramework是伴随着Xcode11推出的新的二进制框架分发格式,相比于lipo -create方式合并framework:
-
XCFramework不仅支持模拟器、设备二进制框架合并,还支持不同平台二进制框架合并,并且它支持苹果所有的平台。
-
对framework和.a都提供了良好的支持。引用XCFramework,Xcode将自动设置搜索路径。
-
初步测试XCFramework合并的静态二进制框架体积更小。
-
更多内容请查看文尾参考资料。
参考资料
WWDC 2019: Binary Frameworks in Swift
developer.apple.com/videos/play…