简体   繁体   中英

Optional linking for Swift Combine.framework in Xcode 11

Our application supports iOS 11 and higher. In iOS 13 we use SwiftUI + Combine

we wrap import of SwiftUI or Combine framework with correspondent check #if canImport(SwiftUI) or #if canImport(Combine) . If we run our app from Xcode 11 under iOS 12 we have error dyld: Library not loaded: /System/Library/Frameworks/Combine.framework/Combine

We fixed same issue for SwiftUI by linking it optionally.

在此处输入图片说明

But we can't make same for Combine as it can not be even selected for linking

在此处输入图片说明

You can add the linker flags explicitly to optionally link Combine when it is available in the build settings. In the Xcode Build Settings add -weak_framework Combine to Other Linker Flags .

构建设置 Ohter Linker Flags "-weak_framework Combine"

Or add the following line in your XCConfig file:

OTHER_LDFLAGS = -weak_framework Combine

or if you still want to support building with older Xcode versions:

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. Navigate to Build Phases tab of your target settings, expand Link binaries with libraries section and right click on SwiftUI.framework , then select Show in Finder .
    在 Finder 中显示 SwiftUI.framework
  2. Drag Combine.framework from the Finder window and drop it into the frameworks list, then choose Optional from the status popup.
    从 Finder 拖放 Combine.framework
  3. Select the Combine.framework item in the project explorer (right window pane) and choose Relative to SDK from the Location popup in the inspector (left window pane).
    指定相对于 SDK 的位置
  4. If you get a weird relative path (starting with ../iPhoneOS.sdk/ ), then open the project in a text editor and fix that manually.
    修复项目文件中的相对路径

Inspired by @nschmidt answer, but with solution that will work both for Xcode 10 and Xcode 11

Add this to xcconfig

 OTHER_LDFLAGS_XCODE_SPECIFIC_1100 = -weak_framework Combine -weak_framework SwiftUI

 OTHER_LDFLAGS = $(inherited) ${OTHER_LDFLAGS_XCODE_SPECIFIC_$(XCODE_VERSION_ACTUAL)}

Or add OTHER_LDFLAGS_XCODE_SPECIFIC_1100 as custom build setting

As far as we figured it out today, there's no need to employ any workaround if you use at least Xcode 11.3.1 for building. It works out of box even without mentioning SwiftUI or Combine in any linking related configuration/build phase and etc.

It turns out to be a bug in (at least) Xcode-11.1, that resulted in Combine framework not weakly linked by default. It looks like the bug was fixed at least in Xcode-11.3.1 - it does weakly link Combine by default. Some related report and answer from Apple folks are here: https://forums.swift.org/t/why-swift-package-manager-does-not-support-weak-linking-weak-framework-swiftui/31418/2

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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