动/静态库和XCFramework

654 阅读2分钟

创建动/静态库只需创建一个Framework项目,修改Mach-O Type就可以了。以下内容是记录使用动/静态库时常见的问题及解决方案。

注:可以通过配置Build Settings来定位和解决Framework项目的问题:developer.apple.com/documentati…

Swift库中包含OC代码

如果该项目是Swift项目,其中还要包含Objective-C文件,就需要将OC文件导入到该项目(库)的头文件中,如下图所示:

Pasted Graphic.png

静态库导入问题

如果是静态库,就不能选择Embed Without SigningEmbed & Sign。否则真机安装不了,因为静态库不能选择嵌入(Embed),不然会有签名问题:

  • 选择Embed & Sign,报错:The code signature version is no longer supported
  • 选择Embed Without Signing,报错:A valid provisioning profile for this executable was not found.

资源访问问题

如果是动态库,我们只需使用库中的某个类名,例如AdministrativeDivisions这个类。再通过Bundle(for: AdministrativeDivisions.self)方法就可以获取到动态库所在的路径。然后就可以访问该库中的资源文件了。

但是静态库是直接链接到主项目的可执行文件中的,不存在单独的路径。使用上面方法得到的是主项目的路径。这种情况下需要我们手动将资源文件拷贝到主项目中,即在Copy Bundle Resources中加入资源文件:

image.png

或者使用脚本自动拷贝到主项目中,比如cocoapods就会自动拷贝静态库的资源文件到主项目中。只需配置好podspec就行。

XCFramework

XCFramework是由Xcode创建的二进制包,其中包括为多个平台(iOS,macOS,tvOS和watchOS)构建所需的框架和库,包括模拟器构建。框架可以是静态的或动态的,还包括头文件。文档地址:developer.apple.com/documentati… 。创建步骤如下:

1. 新增一个Scheme或者Framework项目

2. 配置该Scheme或者Framework项目

  • Build Libraries for Distribution 设置为 YES
  • Skip Install 设置为 NO
  • Architectures 设置为默认值

3. 执行归档指令

将MyFramework替换成对应项目名:

xcodebuild archive \
-project MyFramework.xcodeproj \
-scheme MyFramework \
-destination "generic/platform=iOS" \
-archivePath "archives/MyFramework-iOS"

注:

  1. 如果报 tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance 错误。执行sudo xcode-select -s /Applications/Xcode.app/Contents/Developer可解决
  2. 这只是归档iOS平台,如果还要支持模拟器平台或者Mac平台,需再执行该命令,并替换-destination的参数分别为"generic/platform=iOS Simulator""generic/platform=macOS"-archivePath也需要改下名字,分别为archives/MyFramework-iOS_Simulatorarchives/MyFramework-macOS

最终结果如下图:

image.png

4. 生成XCFramework包

执行以下命令,将各个归档包合并为XCFramework包:

xcodebuild -create-xcframework \
-archive archives/XCFrameworkTest-iOS.xcarchive -framework XCFrameworkTest.framework \
-archive archives/XCFrameworkTest-iOS_Simulator.xcarchive -framework XCFrameworkTest.framework \
-archive archives/XCFrameworkTest-macOS.xcarchive -framework XCFrameworkTest.framework \
-output xcframeworks/XCFrameworkTest.xcframework

结果如下图:

image.png

file指令查看二进制文件

image.png

如上图所示,使用file指令查看XCFrameworkTest可执行文件的结果如下:

XCFrameworkTest: Mach-O 64-bit dynamically linked shared library arm64