Как реализовать deep linking в iOS приложении?
Что проверяют
Вопрос про iOS задают Android-разработчику, когда проект кроссплатформенный или когда хотят понять, видите ли вы общую схему за платформенными деталями. Ждут различия схем и верифицированных ссылок, а следом спрашивают про отложенные ссылки и холодный старт.
Как отвечать
Стройте ответ параллельно с Android, так он звучит увереннее:
- кастомная схема:
myapp://product/42. На iOS объявляется вCFBundleURLTypesв Info.plist, на Android черезintent-filterсandroid:scheme. Просто, но схему может занять любое приложение, а без установленного приложения ссылка никуда не ведёт; - Universal Links: обычная
https-ссылка на ваш домен. В проекте включается Associated Domains с записьюapplinks:example.com, на сервере по адресу/.well-known/apple-app-site-associationлежит JSON с идентификатором приложения и путями, отдаётся по HTTPS без редиректов. Аналог на Android: App Links,android:autoVerify="true"иassetlinks.json; - обработка: в приложении со сценами ссылка по схеме приходит в
scene(_:openURLContexts:), Universal Link вscene(_:continue:)какNSUserActivityс типомNSUserActivityTypeBrowsingWeb. При холодном старте URL лежит вconnectionOptionsметодаscene(_:willConnectTo:options:). В SwiftUI всё сводится к.onOpenURL; - маршрутизация: разбор URL выносится в отдельный роутер, который превращает путь в экран и проверяет авторизацию;
- отложенные ссылки: штатного механизма нет ни на iOS, ни на Android. Берут AppsFlyer, Branch, Adjust или свой сервер. Firebase Dynamic Links закрыт в 2025 году, советовать его уже нельзя.
Проверка: xcrun simctl openurl booted myapp://product/42 на симуляторе, для Universal Links ссылка из Заметок или Сообщений на устройстве.
Где спотыкаются
Обрабатывают ссылку только в application(_:open:options:) у AppDelegate. В приложении со сценами этот метод не вызывается, и ссылка молча теряется.
Проверяют Universal Link, вставив адрес в строку Safari. Так приложение не откроется, это ожидаемое поведение, а не поломка.
Забывают, что файл ассоциации Apple забирает через свой CDN с кэшированием, поэтому правка на сервере доезжает до устройств не сразу.