我有一个最低部署目标为 iOS 12.0 的应用程序。有部分用SwiftUICombine编写。使用这两个库的所有方法和类型都标记为@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,但保留了所有其他CombineSwiftUI相关位,则该应用可以在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/

10-10 20:36