Adyen / adyen-ios

Adyen iOS Drop-in and Components
https://docs.adyen.com/checkout/ios
MIT License
151 stars 121 forks source link

[BUG] With Adyen delivered by SPM Adding Apple Pay card causes crash #1525

Open odys1528 opened 8 months ago

odys1528 commented 8 months ago

Describe the bug I'm using Adyen dropin to add a regular card or Apple Pay card. I'm in progress of migrating from Cocoapods to SPM. The problem appears when I'm trying to add an Apple Pay card as a payment method. When I'm confirming the authorization payment and the system popup is in processing state, the app crashes with error:

-[AdyenComponents.ApplePayComponent paymentAuthorizationViewController:didAuthorizePayment:completion:]: unrecognized selector sent to instance

To Reproduce Steps to reproduce the behavior:

  1. Add Adyen to the project with SPM
  2. Open dropin component with Apple Pay configured
  3. Try to add Apple Pay card from wallet

Expected behavior Card is correctly processed.

Environment

Additional context The problem does not occur when Adyen is provided by Cocoapods. The problem occurs also on Adyen v5.6.0. Project is build with Tuist. The problem occurs on both v3 and v4.

goergisn commented 8 months ago

Hi @odys1528,

I just tried to reproduce the issue by building a small example app but can't reproduce the issue you are describing. Is there a way for you to isolate the issue (e.g. not using Tuist)?

Best, Alex

odys1528 commented 8 months ago

The project is pretty complex. Let me try to post some details. In Package.swift PackageSettings is initiated with productTypes including "Adyen": .framework.

let packageSettings = PackageSettings(
    productTypes: [
        "Adyen": .framework
    ],
    ...
)

Then Package is initiated with dependencies including

.package(
    url: "https://github.com/Adyen/adyen-ios",
    exact: "5.3.0"
)

Then a Module struct mainTargetDependencies includes .external(name: "Adyen") like this:

struct SomeModule: Module {
    var mainTargetDependencies: [TargetDependency] {
         .external(name: "Adyen")
    }
    ...
}

And as described, it causes the app to build and run correctly until a payment attempt.