当最低部署目标设置为iOS 12.2时,如何有条件地使用Combine@Published?
我有一个最低部署目标为iOS 12.0的应用程序。有一些部分是用当最低部署目标设置为iOS 12.2时,如何有条件地使用Combine@Published?,ios,swift,combine,Ios,Swift,Combine,我有一个最低部署目标为iOS 12.0的应用程序。有一些部分是用SwiftUI和Combine编写的。使用这两个库的所有方法和类型都标记为@available(iOS 13.0,*)。自1月份以来,该应用程序一直在这种混合设置中运行,没有出现任何问题 为了利用ABI稳定性并减少应用程序大小,我想将新的最小部署目标设置为iOS 12.2 当我这样做时,应用程序在启动时崩溃(iOS 12.4模拟器),并在控制台上打印以下内容: dyld:惰性符号绑定失败:无法解析符号 在/Users/yyyyyyy
SwiftUI
和Combine
编写的。使用这两个库的所有方法和类型都标记为@available(iOS 13.0,*)
。自1月份以来,该应用程序一直在这种混合设置中运行,没有出现任何问题
为了利用ABI稳定性并减少应用程序大小,我想将新的最小部署目标设置为iOS 12.2
当我这样做时,应用程序在启动时崩溃(iOS 12.4模拟器),并在控制台上打印以下内容:
dyld:惰性符号绑定失败:无法解析符号
在/Users/yyyyyyyy/Library/Developer/CoreSimulator/Devices/UUD-UUD-UUD-UUD/data/Containers/Bundle/Application/UUD/XXXXXXX.app/XXXXXXX中发布DVMA
因为无法加载依赖的dylib#29,dyld:无法解析
symbol\u$s7Combine9PublishedVMa中
/用户/yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
因为无法加载依赖的动态库#29
该应用程序在试图在运行iOS 12.4的iPhone上启动时也会崩溃
如果我从代码中删除所有@已发布的
,但保留所有其他组合
和SwiftUI
相关位,则该应用程序可以在iOS 12上使用
即使所有包含@Published
的类都用@available(iOS 13.0,*)
标记,我还是尝试将它们另外包装在#if-canImport(Combine)
中,或者将if-canImport(Combine)
应用于每个@Published
变量。这没有帮助
我知道我可以改变
@Published var name = ""
到
但这似乎是一个令人讨厌的解决办法
当设备运行iOS 13.0或更高版本时,如何将部署目标增加到iOS 12.2,并继续使用发布的iOS 13.0或更高版本?您需要将
组合(和SwiftUI
,如果您也在使用该)框架与您的项目弱链接。您可以使用其他\u LDFLAGS
生成设置来实现这一点
OTHER_LDFLAGS = -weak_framework Combine -weak_framework SwiftUI
实际上不需要canImport
语句,只需要弱链接框架。当然,对于使用组合的所有类型,您仍然需要@可用的注释。您不能在低于iOS 13的部署目标中使用属性包装器@Published
。做到这一点的唯一方法是如上所述
在您的类中(应符合ObservableObject
协议),而不是:
@Published var name=“”
你必须有:
var name=“”{
意志{
如果可用(iOS 13.0、OSX 10.15、tvOS 13.0、watchOS 6.0、*){
self.objectWillChange.send()
}
}
}
您可能还需要在类中显式添加objectWillChange
声明:
@可用(iOS 13.0、OSX 10.15、tvOS 13.0、watchOS 6.0、*)
public lazy var objectWillChange=observeObjectPublisher()
我已经做到了。对不起,我忘了在我的问题中提到它。如果没有弱链接,则在iOS 13下使用Combine/SwiftUI和target根本不起作用。我的问题似乎与@Published specifically有关。你能解决这个问题吗?不幸的是,可选组合和“@Published”也有同样的问题,我不得不删除@Published并使用willSet,然后从那里发送objectWillChange。这是一个小问题!谢谢
OTHER_LDFLAGS = -weak_framework Combine -weak_framework SwiftUI