繁体   English   中英

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

[英]Optional linking for Swift Combine.framework in Xcode 11

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

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

我们通过选择性链接 SwiftUI 修复了相同的问题。

在此处输入图片说明

但是我们不能为Combine 做同样的事情,因为它甚至不能被选中进行链接

在此处输入图片说明

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

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

灵感来自@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作为自定义构建设置

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

结果证明是(至少)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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM