Skip to content

Latest commit

 

History

History
54 lines (40 loc) · 4.81 KB

CardIO Integration as Development Pod.md

File metadata and controls

54 lines (40 loc) · 4.81 KB

CardIO и интеграция через dev pod

Дано: 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 фазе.

Для решения проблемы есть несколько вариантов относительно архивного состояния исходного репозитория.

  1. Собрать CardIO.framework из исходников вручную и подключить в проект.

Это решение может быть довольно накладным, так как сами архивные исходники требуют некоторой, пусть и минимальной, настройки для того чтобы успешно собираться. Также требуется внести ручную линковку относительно некоторого набора библиотек из IOS SDK в фазе Link Binary With Libraries.

  1. Подключение CardIO как development pod.

Позволяет локально решить проблему генерации modulemap реализацией изменений из card-io/card.io-iOS-SDK#284 Преимущество также состоит в минимальном количестве усилий для достижения результата. Нетривиальные особенности решения:

  1. Добавление в исходники .m файлов активирует генерацию modulemap файла spec.source_files = 'CardIO/*.{h,m}'
  2. Переименование 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=