yoomoney / yookassa-payments-swift

This library allows implementing payment acceptance into mobile apps on iOS and works as an extension to the YooMoney API
https://yookassa.ru/developers
MIT License
41 stars 41 forks source link

Не компилируется с версией 6.5.0 #124

Open alexhtn opened 2 years ago

alexhtn commented 2 years ago
(lldb) dyld: symbol '_$s15FunctionalSwift12PromiseErrorO6cancelyA2CmFWC' not found, expected in '/private/var/containers/Bundle/Application/1EC134F4-443C-4664-837A-5859AC7F4DBA/Runner.app/Frameworks/FunctionalSwift.framework/FunctionalSwift', needed by '/private/var/containers/Bundle/Application/1EC134F4-443C-4664-837A-5859AC7F4DBA/Runner.app/Frameworks/MoneyAuth.framework/MoneyAuth'
* thread #1, stop reason = EXC_BAD_ACCESS (code=1, address=0x109dd4310)
    frame #0: 0x0000000104d255c4 dyld`strlen + 4
dyld`strlen:
->  0x104d255c4 <+4>:  ldr    q0, [x1]
    0x104d255c8 <+8>:  adr    x3, #-0xc8                ; ___lldb_unnamed_symbol35$$dyld
    0x104d255cc <+12>: ldr    q2, [x3], #0x10
    0x104d255d0 <+16>: and    x2, x0, #0xf
starxor commented 2 years ago

Здравствуйте. В следствии технической ошибки граф зависимостей cocoapods нарушился наш граф приватных зависимостей. Это приводило к тому что при установке версии 6.4.0 и старше устанавливались неправильные версии внутренних зависимостей, что в свою очередь приводило к более серьёзным проблемам при сборке в последних версиях xcode. Были внесены необходимые исправления включающие исправление и изменение podspec файлов на которые раньше ссылались. Эти изменения инвалидируют текущие локальные изображения подспек репозиториев у пользователей. Для решения проблемы необходимо удалить локальные изображения поспек репозиториев в папке ~/.cocoapods/repos и переустановить зависимости. При необходимости удалить Podfile.lock. В результате версия 6.5.0 удалена. версии 6.4.0 и 6.6.0 являются рабочими.

набор команд который исправляет установку зависимостей обычно выглядит так

rm -rf ~/.cocoapods/repos rm -rf Podfile.lock pod install --repo-update

в редких случаях может потребоваться pod deintegrate перед pod install

При сложностях с установкой по тэгу, можно воспользоваться опцией установки по коммиту 6.4.0 commit sha: 5a9711873040ada0ed19b293896fee395ed68fb1 6.6.0 commit sha: c2155a837d29bcf6fc5edb9dfbc65ac98750db70

т.е. необходимо изменить в Podfile

pod 'YooKassaPayments', :git => 'https://github.com/yoomoney/yookassa-payments-swift.git', :tag => '6.4.0'

  на

pod 'YooKassaPayments', :git => 'https://github.com/yoomoney/yookassa-payments-swift.git', :commit => '5a9711873040ada0ed19b293896fee395ed68fb1'

Приносим извинения за доставленные неудобства.


Hello. We found that internal technical error leaded to a pod spec version tree corruption. The specs have been intentionally modified to fix runtime crash problems that were present for both 6.6.0 & 6.4.0 versions compiled with new versions of Xcode.

Having that the specs were modified and current tags point to new commits, the local cocoapods spec cache is no longer valid.

Deleting cache, Podfile.lock & new install pods should resolve the problem.

rm -rf ~/.cocoapods/repos rm -rf Podfile.lock pod install --repo-update

pod deintegrate before pod install could help but as we see is not required in most cases.

the other temporary option is to make cocoapods point to a commit instead of tag in podfile so instead of having

pod 'YooKassaPayments', :git => 'https://github.com/yoomoney/yookassa-payments-swift.git', :tag => '6.4.0'

one can go pod 'YooKassaPayments', :git => 'https://github.com/yoomoney/yookassa-payments-swift.git', :commit => '5a9711873040ada0ed19b293896fee395ed68fb1'

We sincerely apologize for the inconvenience caused.

alexhtn commented 2 years ago

С версией 6.4.0 после выполнения этих действий я получаю ошибку error: using bridging headers with module interfaces is unsupported Command CompileSwiftSources failed with a nonzero exit code

starxor commented 2 years ago

Могу предположить что это связано с зависимостью CardIO или какой либо другой objective-c библиотекой подключаемой через bridging header. Мы думаем что эта проблема связана не только c зависимостями устанавливаемы через cocoapods, но и вообще с одновременным использованием любого xcframework одновременно с библиотеками подключаемыми через bridging header. Похоже что это новая парадигма использования зависимостей. Мы исследуем варианты настроек в cocoapods, но пока не добились успеха ни с use_modular_headers! для отдельного таргета или глобально, ни с :modular_headers => true для конкретной зависимости.

Мы готовим пример подключения CardIO как development pod c использованием .modulemap что должно решать эту ошибку. Пример добавим в код экзампла. Другой обозримый вариант для сторонних objective-c библиотек, старых или давно не поддерживаемых, которые не включают modulemap для подключения в проекты, является по всей видимости – локальная ручная сборка в framework и подключение напрямую в проект.

NB: Есть информация что явная установка BUILD_LIBRARY_FOR_DISTRIBUTION = NO для зависимостей помогает решить эту проблему. также убедитесь что в Podfile добавлено source 'https://github.com/yoomoney/cocoa-pod-specs.git'

source 'https://github.com/yoomoney-tech/cocoa-pod-specs.git' следует удалить и всё что будет всплывать связаное с yoomoney-tech можно удалять, так как https://github.com/yoomoney-tech/ более не существует.

alexhtn commented 2 years ago

Насколько я понимаю, что сейчас Apple рекомендует использовать BUILD_LIBRARY_FOR_DISTRIBUTION=YES, и оно работало с этой настройкой в старых версиях. Cейчас вы сделали обновление, в котором предлагаете использовать устаревший вариант настройки BUILD_LIBRARY_FOR_DISTRIBUTION=NO? Зачем нужно такое обновление?

alexhtn commented 2 years ago

Про какие устаревшие библиотеки вы говорите, если версия 6.2.0 успешно собирается? Вы в новые версии добавили какие-то устаревшие библиотеки?

starxor commented 2 years ago

Насколько я понимаю, что сейчас Apple рекомендует использовать BUILD_LIBRARY_FOR_DISTRIBUTION=YES, и оно работало с этой настройкой в старых версиях. Cейчас вы сделали обновление, в котором предлагаете использовать устаревший вариант настройки BUILD_LIBRARY_FOR_DISTRIBUTION=NO? Зачем нужно такое обновление?

BUILD_LIBRARY_FOR_DISTRIBUTION=YES эта настройка включает library evolution и необходимая для сборки xcframework, в тандеме с настройкой SKIP_INSTALL=NO. Эта настройка для зависимостей подключаемых через cocoapods очевидно приводит к конфликту подключения objc библиотек, также подключаемых через cocoapods которые и которые в итоге в приложение необходимо подключать через bridging-header.

alexhtn commented 2 years ago

Вы написали какой-то текст, но не ответы на мои вопросы.

starxor commented 2 years ago

BUILD_LIBRARY_FOR_DISTRIBUTION не является рекомендованной настройкой. Из спеки вызывавшей проблемы мы её убрали. Для cocapods настройка не имеет смысла в принципе, хотя вызывает упомянутую ошибку. Несмотря на это у части пользователей с Xcode 13, упомянутая ошибка не пропадает независимо от настроек. В этом случае мы не видим другого варианта кроме как отказаться от использования bridging header. На этой неделе мы добавим в экземпл приложение пример подключения библиотеки CardIO который не требует bridging header. Факт того что предыдущие версии библиотеки собираются, в данном случае не имеет отношения к вопросу, к найденым и исправленным проблемам. Также отметим что здесь на гитхаб мы не можем помочь ответом на срочные вопросы. По срочным вопросам просим вас обращаться в нашу службу поддержки.

alexhtn commented 2 years ago
  1. Я не использую CardIO, т.е. сейчас у меня должно собираться и без BUILD_LIBRARY_FOR_DISTRIBUTION=NO ?
  2. Как я смотрю, скорость вашей работы не особо зависит от канала обращения (github или тех. поддержка), только на гитхабе остальные разработчики ваших клиентов могут почитать о проблеме и сэкономить свое время, а в тех. поддержке мне нужно сначала написать определенное количество бесполезных писем, пока кто-то реально начнет смотреть проблему, не писать о чистке кэша. Единственное, что кое-как действует, это обращаться через своего менеджера.
starxor commented 2 years ago

Ошибка:

error: using bridging headers with module interfaces is unsupported
Command CompileSwiftSources failed with a nonzero exit code

Говорит о том что в проекте существует bridging header. Конкретно в build settings таргета проставлен какой-либо путь в настройку SWIFT_OBJC_BRIDGING_HEADER указывающий на соответствующий bridging header файл. Он может быть пустым или в нём могут быть объявлены другие заголовочные файлы которые вы хотите чтобы были видны в swift окружении. Для решения проблемы подключите obj-c / c / c++ код другим способом. Например через подпроект фреймворка или swift package и удалите настройку SWIFT_OBJC_BRIDGING_HEADER.