19

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

我们用相应的检查或包装导入SwiftUI或框架。如果我们在 iOS 12 下从 Xcode 11 运行我们的应用程序,则会出现错误Combine#if canImport(SwiftUI)#if canImport(Combine)dyld: Library not loaded: /System/Library/Frameworks/Combine.framework/Combine

我们通过可选链接解决了 SwiftUI 的相同问题。

在此处输入图像描述

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

在此处输入图像描述

4

4 回答 4

16

当构建设置中可用时,您可以显式添加链接器标志以选择性地链接组合。在 Xcode Build Settings 添加-weak_framework Combine to Other Linker Flags

构建设置 Ohter Linker Flags

或者在您的 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
于 2019-08-21T16:12:43.490 回答
2
  1. 导航到目标设置的Build Phases选项卡,展开Link binaries with libraries部分并右键单击SwiftUI.framework,然后选择Show in Finder
    在 Finder 中显示 SwiftUI.framework
  2. Combine.framework从 Finder 窗口拖放到框架列表中,然后从状态弹出窗口中选择Optional 。
    从 Finder 拖放 Combine.framework
  3. 在项目浏览器(右窗格)中选择Combine.framework项,然后从检查器(左窗格)的Location弹出窗口中选择Relative to SDK 。
    指定相对于 SDK 的位置
  4. 如果你得到一个奇怪的相对路径(以 开头../iPhoneOS.sdk/),然后在文本编辑器中打开项目并手动修复它。
    修复项目文件中的相对路径
于 2019-12-12T16:31:18.203 回答
1

就我们今天所知,如果您至少使用 Xcode 11.3.1 进行构建,则无需采用任何解决方法。即使在任何链接相关的配置/构建阶段等中没有提及 SwiftUI 或组合,它也可以开箱即用。

结果证明是(至少)Xcode-11.1 中的一个错误,导致默认情况下组合框架没有弱链接。看起来该错误至少在 Xcode-11.3.1 中已修复 - 默认情况下它确实弱链接了 Combine。苹果人的一些相关报告和答案在这里:https ://forums.swift.org/t/why-swift-package-manager-does-not-support-weak-linking-weak-framework-swiftui/31418/2

于 2020-02-12T23:19:09.007 回答
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为自定义构建设置

于 2019-08-22T11:07:54.587 回答