После оплаты через ApplePay не пропадает тень
lexfoxer opened this issue · 7 comments
После успешной оплаты через Apple Pay не пропадает затемнение, которое появляется при выборе способа оплаты.
- На первом скрине только создалась тень и появилась шторка выбора способа оплаты.
- На втором заметно, что тени ApplePay и тени от шторки наложились (однако, шторка пропала после выбора способа оплаты).
- На третьем сам баг. Шторки выбора способа оплаты нет, тень осталась, а оплата успешно выполнилась. При клике по тени ничего не происходит, работать с приложением можно только после перезапуска.
Подскажите, на чьей стороне эта проблема и как её решить?
- YooKassaPayments 5.1.0
- Xcode 12.2 (12B45b)
- Выполняется на физическом устройстве (iPhone 11 Pro / iOS 14.3)
@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
Сложно предположить почему так происходит.
Судя по коду, dismiss должен вызываться 100%.
Но могу предложить это проверить, например поставив breakpoint.
Если вызывается, и тень так и не пропадает, то можно попробовать (только попробовать !) вызвать dismiss 2 раза подряд.
Если тень пропадет то, можно предположить что проблема где то в вызовах dismiss до этого момента.
В таком случае мне понадобится тестовый проект, или шаги по воспроизведению проблемы, т.к. такой кейс мне не встречался ранее, и воспроизвести у меня его не получилось.
Вызов dismiss 2 раза решает проблему...
Сделал через проверку
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
...
так как перед отображением шторки
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)
}