/
sberpay
/
AgeGate-iOS
Обзор
Документация
Войти
/
sberpay
/
AgeGate-iOS
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
develop
AgeGateSDK/Navigation/AGTWindowManager.swift
75 строк
3 KB
SergeyGladkiy
[0.2.0] БДСЧ сценарий
30 июл 2026, 21:57
30 июл 2026, 21:57
cbcdfcb
Код
Авторство
О чём код?
// // AGTWindowManager.swift // AgeGateSDK // // Created by Гладкий Сергей Игоревич on 23.07.2026. // import UIKit /// Собственное окно SDK. /// /// Не зависим от того, что у партнёра сейчас на экране, и партнёр не может /// закрыть наши экраны своим кодом. Взамен окно надо не забыть отпустить. final class AGTWindowManager { private var window: AGTTransparentWindow? private var host: UIViewController? /// Показывает контейнер шторки. /// /// Если партнёр передал свой экран — презентуем поверх него. /// Если нет — поднимаем окно с прозрачным хост-контроллером и /// презентуем шторку на нём. Контейнер шторки НЕЛЬЗЯ делать /// rootViewController окна: root растягивается на весь экран и /// контроллер презентации (высота, затемнение) не применяется. /// /// Презент откладываем на следующий цикл: показ модалки на root /// только что созданного окна в том же runloop часто не проходит. @MainActor func present(_ container: AGTContentNC, over preferred: UIViewController?, animated: Bool) { if let preferred { preferred.present(container, animated: animated) return } guard let scene = UIApplication.shared.connectedScenes .compactMap({ $0 as? UIWindowScene }) .first(where: { $0.activationState == .foregroundActive }) else { SBLogger.log(.error, "не нашли активную сцену для окна SDK") return } let host = UIViewController() host.view.backgroundColor = .clear let window = AGTTransparentWindow(windowScene: scene) window.windowLevel = .alert + 1 window.rootViewController = host window.makeKeyAndVisible() self.window = window self.host = host SBLogger.log(.lifecycle, "окно SDK поднято") DispatchQueue.main.async { host.present(container, animated: animated) } } @MainActor var topViewController: UIViewController? { window?.topViewController } @MainActor func dismiss() { guard window != nil else { return } window?.isHidden = true window = nil host = nil SBLogger.log(.lifecycle, "окно SDK закрыто") } }