Простой случай
Диплинк — это URL, называющий место внутри приложения, а не страницу в вебе: товар, приглашение, ветку переписки, сброс пароля. Если приложение установлено, операционная система отдаёт ссылку ему, и оно открывает нужный экран вместо того, чтобы браузер открыл страницу.
Механизма два, и они не взаимозаменяемы.
Собственные URL-схемы — myapp://product/42 — более старый вариант. Любое приложение может заявить любую схему, и никто эту заявку не проверяет, так что два приложения могут претендовать на одну и ту же. Хуже другое: за пределами устройства такой URL не значит ничего. Без установленного приложения нажатие не ведёт никуда, и опубликовать его там, где ссылку может открыть браузер, нельзя. Схемы остаются уместны для передачи управления между приложениями на одном устройстве; как основа для ссылок, которые вы отправляете людям, они плохи.
Universal Links на iOS и App Links на Android — обычные https://-адреса, права на которые приложение заявляет, отдавая подписанный файл-ассоциацию со своего домена: apple-app-site-association и assetlinks.json соответственно. Платформа скачивает этот файл и проверяет заявку, поэтому перехватить ваши ссылки нельзя, а тот же самый URL продолжает работать как веб-страница для всех, у кого приложения нет. Именно на них и нужно строить.
Три разные вещи, которые называют «диплинком»
| Что делает | Если приложение не установлено | |
|---|---|---|
| Своя схема | Открывает экран через приватный myapp:// | Ничего не происходит — ссылка в никуда |
| Universal / App Link | Открывает экран через проверенный https:// | Откроется ваша веб-страница |
| Отложенный диплинк | Открывает экран после установки | Уводит в магазин, а при первом запуске восстанавливает адрес назначения |
Большинство споров о диплинках — это ситуация, когда один человек говорит про одно из трёх, а слышат другое. Первые два — вопрос конфигурации. Третий — настоящая инженерная задача.
Сложный случай: пережить установку
Всё сказанное выше предполагает, что приложение уже установлено. Если нет, нажатие уводит пользователя в App Store или Google Play, а запускается в итоге свежая установка, ничего не помнящая о том, на что нажимали. Человек оказывается на безликой главной, и то, чего он хотел, потеряно.
Отложенный диплинкинг — это та часть, которая переносит адрес назначения через разрыв, и сложна она по конкретной причине: между нажатием и первым запуском нет общего состояния. Только что установленное приложение никогда не видело той сессии браузера, с которой всё началось, так что полезную нагрузку приходится протаскивать через границу ОС, построенную ровно для того, чтобы этого не позволять.
Механизмы у каждой платформы свои. На iOS ссылку до появления полного приложения способен перехватить App Clips и передать её через общий контейнер. На Android параметры кампании при первом запуске детерминированно отдаёт API install referrer. Firebase Dynamic Links раньше прятал оба за одним SDK и закрылся в августе 2025 года — поэтому вопрос снова открыт, а не решён.
Два обходных пути, которые выглядят проще, стоит назвать, чтобы от них отказаться. Фингерпринтинг устройства сопоставляет браузер и приложение по IP, размеру экрана и локали в пределах короткого временного окна; он плохо работает в общих и операторских сетях, а вероятностное сопоставление пользователей — ровно тот приём, против которого направлены правила приватности платформ. Сопоставление через буфер обмена копирует нагрузку и читает её на запуске; с iOS 14 пользователю показывается баннер о вставке, а любое другое копирование в промежутке нагрузку уничтожает. И то и другое — догадки, выдаваемые за инфраструктуру.
Где это ломается на практике
- Файл-ассоциация. Редирект, неверный content type или залежавшийся кеш — и платформа тихо перестаёт признавать вашу заявку. Симптом — не ошибка, а ссылки, открывающие сайт вместо приложения: это легко не заметить при тестировании и дорого в проде.
- Встроенные браузеры. Ссылки, нажатые внутри соцсетей, часто открываются во встроенном webview, который вообще не передаёт управление ОС, — universal link, работающий из мессенджера, из ленты не делает ничего.
- Нет веб-фолбэка. Если за
https://-адресом нет настоящей страницы, все, у кого нет приложения, получают 404 — ровно та аудитория, которую вы пытались привести. - Атрибуция. Если реферер не переживает установку, понять, какая кампания дала какого пользователя, невозможно, и цифры привлечения, которые вы показываете, — оценки.
Когда это стоит хлопот
Ссылка, высаживающая человека на безликую главную, тратит впустую единственный момент намерения, который вам достался. Контент, которым делятся, приглашения, сброс пароля и любая платная кампания держатся на том, что адрес назначения переживает дорогу, — как и понимание того, сколько вы заплатили за установку.
Стоит не всегда. Приложению, вся ценность которого и так за логином, куда все всё равно доходят, или продукту без шеринга и без платного привлечения можно выйти без отложенной обработки и ничего не потерять. Цена реальна: таргет App Clips — это второй бинарник, который надо собирать, подписывать и держать в пределах 15 МБ.
Полную реализацию — обе платформы и очередь отложенных ссылок, которая ждёт логина, прежде чем выполнить переход, — мы разобрали в статье отложенный диплинкинг после Firebase Dynamic Links.