Необязательные ссылки для Swift Combine.framework в Xcode 11
Наше приложение поддерживает iOS 11 и выше. В iOS 13 мы используем SwiftUI
+ Combine
мы оборачиваем импорт SwiftUI
или же Combine
рамки с соответствующей проверкой #if canImport(SwiftUI)
или же #if canImport(Combine)
, Если мы запустим наше приложение из Xcode 11 под iOS 12, у нас будет ошибка dyld: Library not loaded: /System/Library/Frameworks/Combine.framework/Combine
Мы исправили ту же проблему для SwiftUI, связав ее по желанию.
Но мы не можем сделать то же самое для Combine, так как его нельзя даже выбрать для ссылки
2 ответа
Вы можете явно добавить флаги компоновщика, чтобы опционально связать Combine, если он доступен в настройках сборки. В настройках сборки Xcode добавьте -weak_framework Combine к другим флагам компоновщика.
Или добавьте следующую строку в ваш файл XCConfig:
OTHER_LDFLAGS = -weak_framework Combine
или если вы все еще хотите поддерживать сборку с более старыми версиями Xcode:
OTHER_LDFLAGS[sdk=iphoneos13.0] = -weak_framework Combine
- Перейдите на вкладку " Фазы сборки " ваших целевых настроек, разверните раздел " Связать двоичные файлы с библиотеками " и щелкните правой кнопкой мыши SwiftUI.framework, затем выберите " Показать в Finder".
- Перетащите Combine.framework из окна Finder в список фреймворков, затем выберите " Необязательно" во всплывающем окне состояния.
- Выберите элемент Combine.framework в проводнике проекта (правая панель окна) и выберите " Относительно SDK" во всплывающем окне " Местоположение" в инспекторе (левая панель окна).
- Если вы получите странный относительный путь (начиная с
../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 или Combine на любом этапе настройки / сборки и т. Д.
Оказывается, это ошибка (по крайней мере) Xcode-11.1, из-за которой фреймворк Combine по умолчанию не связан слабо. Похоже, что ошибка была исправлена, по крайней мере, в Xcode-11.3.1 - по умолчанию он слабо связывает Combine. Некоторые связанные отчеты и ответы от Apple находятся здесь: https://forums.swift.org/t/why-swift-package-manager-does-not-support-weak-linking-weak-framework-swiftui/31418/2