Необязательные ссылки для 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
  1. Перейдите на вкладку " Фазы сборки " ваших целевых настроек, разверните раздел " Связать двоичные файлы с библиотеками " и щелкните правой кнопкой мыши SwiftUI.framework, затем выберите " Показать в Finder".
  2. Перетащите Combine.framework из окна Finder в список фреймворков, затем выберите " Необязательно" во всплывающем окне состояния.
  3. Выберите элемент Combine.framework в проводнике проекта (правая панель окна) и выберите " Относительно 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 или 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

Другие вопросы по тегам