Дано: CardIO не поддерживается уже долгое время, сам репозиторий заархивирован. В последнем релизе 5.4.1 присутсвует проблема что при установке через cocoapods не генерируется modulemap файл и библиотеку приходится дополнительно подключать через Bridging header. Это приводит к проблеме с которой мы столкнулись в Xcode 13 в наших проектах на Swift. На некоторых машинах начала появлятся ошибка:
error: using bridging headers with module interfaces is unsupported Command CompileSwiftSources failed with a nonzero exit code
Ошибка возникает независимо от настроек в подфайле или в конкретных подах. На некоторых машинах был ограниченный успех при выставлении настройки BUILD_LIBRARY_FOR_DISTRIBUTION=NO в Podfile, в post_install фазе.
Для решения проблемы есть несколько вариантов относительно архивного состояния исходного репозитория.
- Собрать CardIO.framework из исходников вручную и подключить в проект.
Это решение может быть довольно накладным, так как сами архивные исходники требуют некоторой, пусть и минимальной, настройки для того чтобы успешно собираться. Также требуется внести ручную линковку относительно некоторого набора библиотек из IOS SDK в фазе Link Binary With Libraries.
- Подключение CardIO как development pod.
Позволяет локально решить проблему генерации modulemap реализацией изменений из card-io/card.io-iOS-SDK#284 Преимущество также состоит в минимальном количестве усилий для достижения результата. Нетривиальные особенности решения:
- Добавление в исходники .m файлов активирует генерацию modulemap файла
spec.source_files = 'CardIO/*.{h,m}'
- Переименование libCardIO.a в libCardIOCore.a из-за конфликта линковки. card-io/card.io-iOS-SDK#284 (comment)
Альтернативный вариант: сделать свой форк https://github.com/card-io/ внести эти изменения и подключить его в Podfile.
Это конечно не решает ошибку using bridging headers with module interfaces
в общем случае, так как всегда есть
вероятность наличия другого Objective-C кода подключенного напрямую в проект. Для этих случаев мы предлагаем
упаковать необходимый код в локальную зависимость любым удобным способом.
В YooKassaPaymentsDemoApp мы приводим простой пример упаковки Objective-C кода в Swift Package.
Если ваш проект использует другие зависимости которые необходимо подключать через Bridging Header, то надеемся что пример с подключением CardIO окажется полезным и сэкономит вам время.
На сегодняшний день мы не смогли найти непреодолимых причин подключения Objective-C кода через Briding Header. Если у вас есть подобный пример, мы будем рады если вы с нами им поделитесь. Мы продолжим исследование проблемы для более глубокого понимания её причин и разработки новых вариантов решения.
Дополнительно о модулярных фреймворках можно найти информацию по следущим ссылкам:
https://clang.llvm.org/docs/Modules.html http://nsomar.io/modular-framework-creating-and-using-them/ https://github.com/search?utf8=✓&q=modulemap+language%3Aswift&type=