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

19
我们的应用程序支持iOS 11及以上版本。在iOS 13中,我们使用{{SwiftUI}}和{{Combine}}。
我们使用相应的检查{{#if canImport(SwiftUI)}}或{{#if canImport(Combine)}}包装导入{{SwiftUI}}或{{Combine}}框架。如果我们在iOS 12下从Xcode 11运行应用程序,就会出现错误{{dyld: Library not loaded: /System/Library/Frameworks/Combine.framework/Combine}}。
我们通过可选链接修复了SwiftUI的同样问题。

enter image description here

但是我们无法为Combine做同样的事情,因为它甚至不能被选择用于链接

enter image description here


既然我们正在谈论极其beta版本,也许你可以简单地将其更改为寻找“iOS 13”?我非常确定 - 不是100% - SwiftUICombine都需要不仅在今年秋天发布的操作系统版本,还需要Swift 5.1。目前检查操作系统版本应该可以工作。如果不能?请提交错误报告。 - user7014451
它在使用相同的构建设置下,在iOS 13上运行得非常完美。问题在于,即使Combine.framework存在,也无法从列表中选择,也无法标记为可选项。我将为此准备一个小型演示项目。 - Igor Palaguta
我明白了。对我来说,最简单的方法似乎是在您的应用程序中制作一个iOS 13的衍生版本。当然不是理想的,但您已经看到了其他任何方式的头痛。 - user7014451
4个回答

17
在构建设置中,您可以明确添加链接器标志以选择性地链接Combine。 在Xcode Build Settings中,将-weak_framework Combine添加到Other Linker Flags

build settings Ohter Linker Flags "-weak_framework Combine"

或者在您的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

2
  1. 进入目标设置的Build Phases选项卡,展开Link binaries with libraries部分,右键单击SwiftUI.framework,然后选择Show in Finder
    Reveal SwiftUI.framework in Finder
  2. 从Finder窗口中拖动Combine.framework并将其放入框架列表中,然后从状态弹出窗口中选择Optional
    Drag&Drop Combine.framework from Finder
  3. 在项目资源管理器(右侧窗格)中选择Combine.framework项目,并在检查器中(左侧窗格)的Location弹出窗口中选择Relative to SDK
    Specify location relative to SDK
  4. 如果您得到一个奇怪的相对路径(以../iPhoneOS.sdk/开头),则需要在文本编辑器中手动修复。
    Fix relative path in project file

1
不错!第四步意味着编辑路径到“System/Library/Frameworks/Combine.framework”。 - hstdt

1
截至今天我们所了解的情况是,如果您使用至少Xcode 11.3.1进行构建,则无需使用任何解决方法。即使在任何链接相关的配置/构建阶段中没有提到SwiftUI或Combine,它也可以直接使用。
事实证明,这至少是Xcode-11.1中的一个错误,导致默认情况下未弱链接Combine框架。看起来这个错误至少在Xcode-11.3.1中得到了修复-它默认情况下会弱链接Combine。一些相关的报告和来自苹果公司人员的回答在这里:https://forums.swift.org/t/why-swift-package-manager-does-not-support-weak-linking-weak-framework-swiftui/31418/2

1

受@nschmidt答案启发,但是这个解决方案适用于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)}

或者将OTHER_LDFLAGS_XCODE_SPECIFIC_1100添加为自定义构建设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接