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

После оплаты через ApplePay не пропадает тень #89

Closed lexfoxer closed 3 years ago

lexfoxer commented 3 years ago

После успешной оплаты через Apple Pay не пропадает затемнение, которое появляется при выборе способа оплаты.

  1. На первом скрине только создалась тень и появилась шторка выбора способа оплаты.
  2. На втором заметно, что тени ApplePay и тени от шторки наложились (однако, шторка пропала после выбора способа оплаты).
  3. На третьем сам баг. Шторки выбора способа оплаты нет, тень осталась, а оплата успешно выполнилась. При клике по тени ничего не происходит, работать с приложением можно только после перезапуска.

Подскажите, на чьей стороне эта проблема и как её решить?

IMG_4945

IMG_4946

IMG_4947

oltv00 commented 3 years ago

@Lexfoxer Привет!

Вероятней всего проблема где то в реализации метода

func tokenizationModule(
        _ module: TokenizationModuleInput,
        didTokenize token: Tokens,
        paymentMethodType: PaymentMethodType
)

протокола TokenizationModuleOutput

Там должен вызываться dismiss(animated:)

Пример реализации есть тут. Выглядит он так:

func tokenizationModule(_ module: TokenizationModuleInput,
                                           didTokenize token: Tokens,
                                           paymentMethodType: PaymentMethodType) {
        DispatchQueue.main.async { [weak self] in
            guard let self = self else { return }
            self.dismiss(animated: true)
        }
        // Отправьте токен в вашу систему
}

Если у вас похожая реализация, то можете ее показать?

lexfoxer commented 3 years ago

У меня приложение на react native.

В модуле код такой.

15C763F9-00D9-4E47-B8EA-B8F202E2453D

oltv00 commented 3 years ago

@Lexfoxer Сложно предположить почему так происходит. Судя по коду, dismiss должен вызываться 100%. Но могу предложить это проверить, например поставив breakpoint.

Если вызывается, и тень так и не пропадает, то можно попробовать (только попробовать !) вызвать dismiss 2 раза подряд.

Если тень пропадет то, можно предположить что проблема где то в вызовах dismiss до этого момента. В таком случае мне понадобится тестовый проект, или шаги по воспроизведению проблемы, т.к. такой кейс мне не встречался ранее, и воспроизвести у меня его не получилось.

lexfoxer commented 3 years ago

Вызов dismiss 2 раза решает проблему...

lexfoxer commented 3 years ago

Сделал через проверку

DispatchQueue.main.async {
    self.viewController!.dismiss(animated: true)

    if (self.viewController!.isViewLoaded && self.viewController!.view.window) {
        self.viewController!.dismiss(animated: true)
    }
}

Подозреваю, что это проблема в использовании react-native, так как перед отображением шторки появляются ошибки в логах:

=================================================================
Main Thread Checker: UI API called on a background thread: -[UIViewController init]
PID: 29143, TID: 2872062, Thread name: (none), Queue name: com.facebook.react.ShadowQueue, QoS: 33
...
2021-01-12 14:33:11.617769+0300 appName[29143:2872062] [reports] Main Thread Checker: UI API called on a background thread: -[UIViewController init]
PID: 29143, TID: 2872062, Thread name: (none), Queue name: com.facebook.react.ShadowQueue, QoS: 33
...

=================================================================

Main Thread Checker: UI API called on a background thread: -[UIViewController initWithNibName:bundle:]
PID: 29143, TID: 2872062, Thread name: (none), Queue name: com.facebook.react.ShadowQueue, QoS: 33
...
2021-01-12 14:33:26.072667+0300 appName[29143:2872062] [reports] Main Thread Checker: UI API called on a background thread: -[UIViewController initWithNibName:bundle:]
PID: 29143, TID: 2872062, Thread name: (none), Queue name: com.facebook.react.ShadowQueue, QoS: 33
...

=================================================================
Main Thread Checker: UI API called on a background thread: -[UIViewController setTransitioningDelegate:]
PID: 29143, TID: 2872062, Thread name: (none), Queue name: com.facebook.react.ShadowQueue, QoS: 33
...
2021-01-12 14:33:26.415561+0300 appName[29143:2872062] [reports] Main Thread Checker: UI API called on a background thread: -[UIViewController setTransitioningDelegate:]
PID: 29143, TID: 2872062, Thread name: (none), Queue name: com.facebook.react.ShadowQueue, QoS: 33
...

=================================================================

Main Thread Checker: UI API called on a background thread: -[UIViewController setModalPresentationStyle:]
PID: 29143, TID: 2872062, Thread name: (none), Queue name: com.facebook.react.ShadowQueue, QoS: 33
...
2021-01-12 14:33:26.751970+0300 appName[29143:2872062] [reports] Main Thread Checker: UI API called on a background thread: -[UIViewController setModalPresentationStyle:]
PID: 29143, TID: 2872062, Thread name: (none), Queue name: com.facebook.react.ShadowQueue, QoS: 33
...
oltv00 commented 3 years ago

@Lexfoxer

так как перед отображением шторки UI API called on a background thread

перед отображением шторки Apple Pay или самого SDK ? если самого SDK, нужно обернуть этот вызов present в DispatchQueue.main.async { ... }

например

let viewController = TokenizationAssembly.makeModule( ... )
DispatchQueue.main.async {
    present(viewController, animated: true, completion: nil)
}
lexfoxer commented 3 years ago

@oltv00 Да, отображается перед выводом самого SDK. Так и реализовано. Или я что-то не понимаю тк не являюсь разработчиком на Swift.

Здесь код файла используемого для связи SDK и react-native.