我有一个最低部署目标为 iOS 12.0 的应用程序。有部分用SwiftUI
和Combine
编写。使用这两个库的所有方法和类型都标记为@available(iOS 13.0, *)
。自一月份以来,该应用程序一直在此混合设置中运行,没有任何问题。
为了利用ABI稳定性并减小应用程序大小,我想将新的最低部署目标设置为 iOS 12.2 。
当我这样做时,该应用程序将在启动时崩溃(iOS 12.4模拟器),并在控制台上显示以下内容:
dyld:惰性符号绑定失败:无法解析符号
在/Users/YYYYYYYYY/Library/Developer/CoreSimulator/Devices/UUD-UUD-UUD-UUD/data/Containers/Bundle/Application/UUD/XXXXXXX.app/XXXXXXX中的 _ $ s7Combine9PublishedVMa
因为无法加载依赖的dylib#29 dyld:无法解析
符号 _ $ s7Combine9PublishedVMa 在
/用户/ YYYYYYYYY /库/开发人员/ CoreSimulator /设备/ UUD-UUD-UUD-UUD /数据/容器/捆绑/应用程序/ UUD-UUD-UUD-UUD / XXXXXXXapp / XXXXXXX
因为无法加载依赖的dylib#29
尝试在运行iOS 12.4的iPhone上启动时,该应用程序也崩溃。
如果我从代码中删除了所有@Published
,但保留了所有其他Combine
和SwiftUI
相关位,则该应用可以在iOS 12上使用。
即使所有包含@Published
的类都标记了@available(iOS 13.0, *)
,我还是尝试将它们另外包装在#if canImport(Combine)
中或将#if canImport(Combine)
应用于每个@Published
变量。这无济于事。
我知道我可以改变
@Published var name = ""
至var name = "" {
willSet {
objectWillChange.send()
}
}
但这似乎是一个令人讨厌的解决方法。当设备运行 iOS 13.0 或更高版本时,如何将部署目标提高到 iOS 12.2 并继续使用
@Published
? 最佳答案
您需要将Combine
(如果也使用SwiftUI
)框架进行弱链接到您的项目。您可以使用OTHER_LDFLAGS
构建设置来实现。
OTHER_LDFLAGS = -weak_framework Combine -weak_framework SwiftUI
您实际上不需要canImport
语句,只需要框架进行弱链接。当然,您仍然需要在所有使用@available
的类型上添加Combine
批注。关于ios - 当最低部署目标设置为iOS 12.2时,如何有条件地使用Combine @Published?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63190381/