Устранение неполадок

Колбэки QuickPaymentStateListener не приходят

SDK хранит листенер как weak-ссылку. Если нет другого владельца, ARC освободит объект.

// Неправильно — объект немедленно освобождается
YandexQuickPay.initialize(
    configuration: config,
    presenterViewController: nil,
    quickPaymentStateListener: MyListener()  // ← временный объект
)

// Правильно — свойство держит сильную ссылку
final class AppDelegate: UIApplicationDelegate {
    let listener = MyListener()

    func application(...) -> Bool {
        YandexQuickPay.initialize(
            configuration: config,
            presenterViewController: nil,
            quickPaymentStateListener: listener
        )
        return true
    }
}

OAuth-авторизация не завершается / зависает

Не подключены обработчики URL. Добавьте в AppDelegate/SceneDelegate:

// AppDelegate
func application(_ app: UIApplication, open url: URL, options: [...]) -> Bool {
    return YandexQuickPay.instance.handleOpenURL(url)
}

// SceneDelegate
func scene(_ scene: UIScene, openURLContexts: Set<UIOpenURLContext>) {
    if let url = openURLContexts.first?.url {
        _ = YandexQuickPay.instance.handleOpenURL(url)
    }
}

Также проверьте handleUserActivity для Universal Links.

Виджет отображается пустым

initialize() не был вызван перед createPaymentMethodsWidget(). Порядок вызовов:

  1. YandexQuickPay.initialize(configuration:presenterViewController:quickPaymentStateListener:) — инициализация SDK
  2. YandexQuickPay.instance.createPaymentMethodsWidget() — создание виджета

FintechQuickPaymentError.noPresentationContext

getPaymentSessionId() или enableQuickPayment() вызваны до отображения ViewController. Переместите вызов в viewDidAppear или используйте Task внутри .onAppear в SwiftUI.

Колбэки приходят, но UI не обновляется

Колбэки могут вызываться не на Main thread. Оборачивайте обновления UI:

func onSessionExpired() {
    DispatchQueue.main.async {
        self.delegate?.sessionExpired()
    }
}

QR-код не сканируется

  1. Убедитесь, что QR сгенерирован из sessionId, полученного через getPaymentSessionId().
  2. Окружение SDK (sandbox / production) должно совпадать с окружением кассового ПО.
  3. Проверьте, что сессия актуальна — при истечении вызывается onSessionExpired().
Предыдущая
Следующая