Как реализовать deep linking в iOS приложении?
Что проверяют
Различаете ли вы URL-схемы и Universal Links и знаете ли, куда реально приходит ссылка в приложении со сценами. Следом спрашивают, как вы маршрутизируете ссылку, если пользователь не залогинен или приложение ещё не запущено.
Как отвечать
Механизмов два:
- URL-схема (
myapp://order/42): регистрируется вCFBundleURLTypesвInfo.plist. Просто, но схема не уникальна, её может объявить любое приложение, а без установленного приложения ссылка никуда не ведёт; - Universal Links (
https://example.com/order/42): обычная HTTPS-ссылка, которая открывает приложение, если оно установлено, и сайт, если нет. Нужны capability Associated Domains с записьюapplinks:example.comв файле.entitlementsи файлapple-app-site-associationв/.well-known/на домене: HTTPS, без редиректов, JSON без расширения. Начиная с iOS 14 файл забирает CDN Apple, правки доезжают с задержкой, а для отладки есть запись видаapplinks:example.com?mode=developer.
Точка входа зависит от жизненного цикла. С UISceneDelegate методы AppDelegate для ссылок не вызываются: тёплый запуск приходит в scene(_:openURLContexts:) и scene(_:continue:), холодный в scene(_:willConnectTo:options:) через connectionOptions.urlContexts и userActivities. В SwiftUI это модификатор .onOpenURL.
Дальше архитектура: разбираете URL в enum Route, передаёте координатору или навигационному стеку и откладываете переход, пока не пройдена авторизация. Отложенные ссылки после установки из App Store придётся делать своим сервисом или сторонним SDK: Firebase Dynamic Links закрыт в 2025 году.
Проверка на симуляторе: xcrun simctl openurl booted myapp://order/42. Universal Links удобнее проверять из Заметок или Сообщений.
Где спотыкаются
Кладут com.apple.developer.associated-domains в Info.plist. Это ключ entitlements, в Info.plist он не работает.
Обрабатывают ссылку только в AppDelegate и удивляются, что в приложении со сценами ничего не происходит.
Доверяют параметрам из ссылки. Любое приложение может вызвать вашу схему с произвольными данными, поэтому ID проверяются, а действия вроде оплаты требуют подтверждения внутри приложения.