Что такое диплинкинг в iOS
Что проверяют
Знаете ли вы реальные механизмы платформы и их ограничения, а не общую идею перехода по ссылке. За вопросом обычно стоит боль команды: ссылка из рассылки открывает браузер вместо приложения, и никто не может объяснить почему.
Как отвечать
В iOS есть два штатных механизма.
Своя схема регистрируется в Info.plist, ссылка вида myapp://order/42 приходит прямо в приложение. Минус принципиальный: схема ничья, любое приложение может объявить такую же, подтверждения владения нет. Для внутренней навигации годится, для писем и рекламы нет.
Универсальные ссылки это обычные https-адреса. Нужен домен в возможностях приложения и файл apple-app-site-association на сайте: без расширения, по https, без редиректов, с типом JSON. Ссылка приходит в приложение как NSUserActivity просмотра веба, а адрес разбирает маршрутизатор экранов.
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else { return }
Router.shared.open(url)
}Отдельно скажите про переход, отложенный до установки: платформа его не поддерживает, это делается сторонним сервисом атрибуции.
Где спотыкаются
Пересказывают чужую классификацию с «динамическими» и «мягкими» ссылками. Это названия сторонних продуктов и маркетинговые ярлыки, а не понятия платформы. В iOS различаются своя схема и универсальная ссылка, всё остальное надстройки над ними.
Не знают, что файл соответствия забирает и кэширует инфраструктура платформы, а не само устройство при каждом переходе. Отсюда классическая картина: на сервере поправили, на устройстве не изменилось. При отладке помогает переустановка приложения и понимание, что мгновенного применения правок не будет.
Игнорируют поведение системы, которое выглядит как баг: переход по ссылке внутри страницы того же домена приложение не откроет, а пользователь может сам отключить открытие в приложении. Рядом частая ошибка в коде: обработчик написан только для холодного старта, и ссылка, пришедшая в уже запущенное приложение, теряется.