Есть ли главный роутер в iOS приложении
Что проверяют
Понимаете ли вы, что в iOS нет встроенного центрального роутера, и можете ли объяснить, как навигацию организуют в реальных проектах. Следом часто спрашивают, как вы обработаете диплинк на экран третьего уровня вложенности.
Как отвечать
Короткий ответ: в UIKit и SwiftUI «главного роутера» нет. Система даёт точку входа (@main, UIApplicationDelegate, SceneDelegate, где задаётся window.rootViewController) и контейнеры навигации: UINavigationController, UITabBarController, модальные показы, а в SwiftUI NavigationStack с NavigationPath начиная с iOS 16. Всё остальное это архитектурное решение команды.
Варианты, которые встречаются:
- Router в VIPER: у каждого модуля свой, отвечает за сборку модуля и переходы из него. Глобального роутера схема не требует;
- Coordinator: корневой
AppCoordinatorрешает, что показать при старте (онбординг, авторизация, основной таб-бар), и владеет дочерними координаторами отдельных флоу. Это ближе всего к «главному роутеру»; - роутер в SwiftUI: объект
@ObservableилиObservableObjectс массивом маршрутов илиNavigationPath, который передаётся через environment, а переходы делаются изменением этого состояния; - центральная обработка диплинков: даже без координаторов входящие ссылки (
onOpenURL,scene(_:openURLContexts:), Universal Links) и пуши удобно сводить в одно место, которое разбирает адрес и строит нужный стек экранов.
Сильный ответ называет причину выбора: главный координатор оправдан, когда много флоу и диплинков, а приложению на пять экранов хватит NavigationStack.
Где спотыкаются
Делают главный роутер объектом, который знает про все экраны приложения. Он превращается в гигантский switch, и любая правка задевает всех.
Получают утечки памяти: координатор держит контроллер, а контроллер сильной ссылкой держит координатор. Другой частый случай: пользователь ушёл назад свайпом, а дочерний координатор остался в childCoordinators, потому что никто не отследил это через UINavigationControllerDelegate.
Смешивают подходы: часть переходов через сегвеи в сторибордах, часть через координатор. После этого непонятно, кто отвечает за стек экранов.