Swiftui Xcode 11中Swift Combine.framework的可选链接

Swiftui Xcode 11中Swift Combine.framework的可选链接,swiftui,xcode11,ios13,combine,Swiftui,Xcode11,Ios13,Combine,我们的应用程序支持iOS 11及更高版本。在iOS 13中,我们使用SwiftUI+Combine 我们包装SwiftUI的导入,或者将框架与相应的检查相结合,检查是否是canImportSwiftUI或canImportCombine。如果我们在iOS 12下从Xcode 11运行应用程序,则会出现错误dyld:Library not loaded:/System/Library/Frameworks/Combine.framework/Combine 我们通过选择性链接SwiftUI解决了同

我们的应用程序支持iOS 11及更高版本。在iOS 13中,我们使用SwiftUI+Combine

我们包装SwiftUI的导入,或者将框架与相应的检查相结合,检查是否是canImportSwiftUI或canImportCombine。如果我们在iOS 12下从Xcode 11运行应用程序,则会出现错误dyld:Library not loaded:/System/Library/Frameworks/Combine.framework/Combine

我们通过选择性链接SwiftUI解决了同样的问题

但我们不能为联合收割机做相同的操作,因为它甚至不能被选择用于链接


当链接器标志在生成设置中可用时,可以显式添加链接器标志,以选择链接组合。 在Xcode构建设置中,将-weak_framework添加到其他链接器标志

或者在XCConfig文件中添加以下行:

OTHER_LDFLAGS = -weak_framework Combine
或者,如果您仍然希望支持使用较旧的Xcode版本进行构建:

OTHER_LDFLAGS[sdk=iphoneos13.0] = -weak_framework Combine
OTHER_LDFLAGS[sdk=iphonesimulator13.0] = -weak_framework Combine

OTHER_LDFLAGS[sdk=watchos6.0] = -weak_framework Combine
OTHER_LDFLAGS[sdk=watchsimulator6.0] = -weak_framework Combine

OTHER_LDFLAGS[sdk=appletvos13.0] = -weak_framework Combine
OTHER_LDFLAGS[sdk=appletvsimulator13.0] = -weak_framework Combine

OTHER_LDFLAGS[sdk=macosx10.15] = -weak_framework Combine

灵感来源于@nschmidt answer,但其解决方案将同时适用于Xcode 10和Xcode 11

将此添加到xcconfig

 OTHER_LDFLAGS_XCODE_SPECIFIC_1100 = -weak_framework Combine -weak_framework SwiftUI

 OTHER_LDFLAGS = $(inherited) ${OTHER_LDFLAGS_XCODE_SPECIFIC_$(XCODE_VERSION_ACTUAL)}
或者添加其他\u LDFLAGS\u XCODE\u SPECIFIC\u 1100作为自定义生成设置

导航到目标设置的“构建阶段”选项卡,展开“使用库链接二进制文件”部分,右键单击SwiftUI.framework,然后选择“在Finder中显示”。 从Finder窗口拖动Combine.framework并将其放入框架列表,然后从状态弹出窗口中选择可选。 在project explorer右窗格中选择Combine.framework项,然后从inspector左窗格中的位置弹出窗口中选择相对SDK。 如果您得到一个奇怪的相对路径,以../iPhoneOS.sdk/开头,那么在文本编辑器中打开该项目并手动修复。
就我们今天所了解到的,如果您至少使用Xcode 11.3.1进行构建,就没有必要采用任何变通方法。即使在任何链接相关的配置/构建阶段都没有提及SwiftUI或Combine,它也是开箱即用的


事实证明,这至少是Xcode-11.1中的一个bug,导致Combine框架在默认情况下没有弱链接。看起来这个bug至少在Xcode-11.3.1中得到了修复——默认情况下它不会进行弱链接合并。苹果人的一些相关报告和回答如下:

既然我们谈论的是测试版,也许你可以简单地将它改为iOS 13?我非常肯定——不是100%——SwiftUI和Combine**不仅需要今年秋天推出的操作系统版本,还需要Swift 5.1`。检查操作系统版本现在应该可以工作了。如果没有呢?提交一个bug报告。它在IOS13上以相同的构建设置完美工作。此处出现的Combine.framework偶数且无法从列表中选择的问题不能标记为可选。我将为此准备一个小的演示项目。对我来说,最简单的方法就是在你的应用程序中制作一个iOS 13 fork。当然不是很理想,但你已经看到了走其他路的头痛。很好!步骤4意味着编辑System/Library/Frameworks/Combine.framework的路径