ios - 为 Swift 二进制框架启用模块稳定性时 dyld 崩溃
问题描述
我正在尝试为我的二进制 Swift 框架启用模块稳定性。
我的设置如下:
- Xcode 11.1
- 启用“为分发构建库”选项
我已经验证了输出的 .framework 确实在框架中包含了必要的 .swiftinterface 文件,所以理论上我认为它应该可以工作。
但是,当我尝试从任何应用程序使用此框架时,dyld
使用__abort_with_payload
.
我在以下情况下尝试过:
- Xcode 编译的原始框架(.framework 格式)
lipo
d 胖框架(.framework 格式)- 新的 XCFramework (.xcframework) 格式
在我测试过的所有情况下,启用此选项似乎会导致应用程序在启动时崩溃。
唯一想到的是我的框架是我的框架本身依赖于其他第 3 方(非二进制)框架,这些框架是通过 Cocoapods 编译的。
在WWDC '19 关于二进制框架的演讲中,我们被告知“您的所有依赖项都必须使用 Build Libraries for Distribution 构建设置来构建,才能获得我们谈到的二进制兼容性保证”——但这并不明确是否可以仅构建具有模块稳定性的二进制框架本身,并从源代码构建依赖项。
我还尝试在 Pods 子项目构建设置中启用“构建库以进行分发”,但这仍然不能解决问题。
有什么建议么?
解决方案
我已经弄清楚如何解决这个问题。
正如 WWDC 演讲中所建议的(但不是很清楚),似乎所有库依赖项都必须启用“构建库以进行分发”构建设置。
可可足类
Cocoapods目前没有对此(或 XCFrameworks,就此而言)的内置支持,但是,可以通过将以下内容添加到应用程序的 Podfile 来暂时解决此问题:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
end
end
end
这将确保为分发而构建所有依赖项。
迦太基
Carthage也不支持模块稳定性。您需要传递自定义 Xcode 构建设置以确保当您运行时carthage build
,您的框架是在启用“构建库以进行分发”的情况下构建的:
echo 'BUILD_LIBRARY_FOR_DISTRIBUTION=YES'>/tmp/config.xcconfig; XCODE_XCCONFIG_FILE=/tmp/config.xcconfig carthage build; rm /tmp/config.xcconfig
推荐阅读
- google-cloud-platform - 删除版本后更新时持续 GCLOUD APP DEPLOY?
- javascript - 在 Javascript 中,如何从项目文件中动态加载图像
- sql - 在连接表中使用计数和分组依据?
- android - 调试构建在构建期间无法访问 out.jar,因为它正在被另一个进程使用
- ipad - ipad 无法正确识别镜像到 mac
- ios - 无法将图像上传到 Firebase 存储 - swift 5
- ruby-on-rails - Rails 6 表单中缺少参数
- sql - 通过连接表在原始 sql 中查找
- python - Python,如何将现有的父类对象转换为子类对象
- javascript - 谷歌地图移动多个标记Javascript