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.
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
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