Исправьте Universal Link, который после холодного старта открывает не тот экран
Universal Link открывает приложение на конкретном экране товара. Если приложение уже запущено — работает; если не было запущено (тап из Messages) — открывается вкладка по умолчанию. Определите, почему теряется случай холодного старта, и исправьте.
Ограничения:
- Оставьте одну точку входа роутинга — не дублируйте логику разбора.
- Не отключайте Universal Links и не откатывайтесь на собственную схему.
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
// только настройка окна — обработки диплинка здесь нет
}
// Только тёплый путь: срабатывает, когда приложение уже запущено.
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let url = userActivity.webpageURL { Router.shared.open(url) }
}
}
Найдите и исправьте ошибку, чтобы холодный старт открывал нужный экран.
При холодном старте iOS доставляет NSUserActivity в willConnectTo через connectionOptions, а не через scene(_:continue:). Код обрабатывает только тёплый путь continue, поэтому холодный запуск из Messages открывает не тот экран. Читайте её при подключении и ведите через тот же обработчик.
- ✗Обрабатывают только тёплый путь
continueи игнорируютconnectionOptions - ✗Считают, что холодный и тёплый запуск доставляют activity через один callback
- ✗Хватаются за аргументы запуска или запрос к серверу вместо опций сцены
- →Почему роутер должен переживать вызов навигации до появления UI на экране?
- →Как обработать ссылку, что приходит и как
URLContextпри подключении?
On a cold launch there is no running app to receive scene(_:continue:), so iOS delivers the NSUserActivity inside the scene's connectionOptions. Handle both paths through one router:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
// Cold start: the activity is waiting here, not in `continue`.
if let activity = connectionOptions.userActivities.first,
let url = activity.webpageURL {
Router.shared.open(url)
}
}
// Warm path: the app was already running.
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
if let url = userActivity.webpageURL { Router.shared.open(url) }
}
}
Both callbacks now funnel into Router.shared.open, so a tap from Messages that cold-starts the app reaches the same product screen as a tap while the app is already open.