Deep link - это URL, который операционная система передаёт приложению, а не браузеру. Нажмите на него при установленном приложении, и приложение откроется. Без приложения загрузится веб-страница в браузере. В iOS это называется Universal Links, в Android - App Links, и ни тому, ни другому SDK не нужен.
Настройка - это два JSON-файла на домене под вашим контролем плюс один entitlement или intent-фильтр в приложении. Дальше: оба файла, как вписывается домен коротких ссылок, часть, которую пропускает большинство руководств (приложение получает короткий URL, а не цель редиректа), и три задачи, которые SDK всё ещё решает лучше.
Это важнее, чем раньше. Google закрыл Firebase Dynamic Links 25 августа 2025 года, и его FAQ теперь возвращает для этих ссылок HTTP 404 (FAQ поддержки Firebase, дата обращения 2026-10-24). Этот FAQ указывает поставщика для полного паритета функций, а App Links и Universal Links - для приложений, которым нужно только открываться, когда они установлены. Для случая «от печати до установки» QR-код для загрузки приложения ставит ту же маршрутизацию за сканируемый код.
Коротко
- Android App Links (Android 6, API 23, и новее) и iOS Universal Links закрывают сценарий «открыть в приложении, если оно установлено, иначе веб-страница» без стороннего SDK.
- Каждому нужен домен под вашим контролем, отдаваемый по HTTPS, с файлом ассоциации в
/.well-known/. - На домене коротких ссылок приложение запускается с коротким URL. Код вашего приложения должен превратить его в экран. 302 не выполняется никогда.
- SDK по-прежнему окупаются для отложенного deep link, атрибуции установок и сшивания идентичности. Если они вам не нужны, пропустите их.
Как ОС решает открыть ваше приложение
Обе системы утверждают проверенную связь между доменом и приложением. Документация Android говорит, что App Links позволяют проверенным URL сайта «сразу открывать соответствующий контент в вашем приложении Android, не требуя от пользователя выбирать приложение в диалоге уточнения», а пользователи без приложения «попадают на ваш сайт - без 404, без ошибок» (developer.android.com/training/app-links/about, дата обращения 2026-10-24).
Android проверяет при установке. Когда intent-фильтр содержит android:autoVerify="true", устройство с Android 6 или новее при установке приложения сверяет объявленные хосты с https://hostname/.well-known/assetlinks.json (developer.android.com/training/app-links/verify-android-applinks, дата обращения 2026-10-24). Перед тестированием подождите не менее 20 секунд для этой проверки. В Android 15 и новее повторная проверка также выполняется периодически, а изменения файла могут распространяться до семи дней. Android 14 и старее подхватывают изменения только при установке или обновлении.
Страницы разработчика Apple (developer.apple.com, Supporting associated domains и Supporting universal links) не отобразились при моей загрузке 2026-10-24, поэтому я не цитирую поведение Apple сверх того, что показывают его опубликованные примеры: файл лежит в /.well-known/apple-app-site-association, приложение объявляет applinks:your-domain в entitlement Associated Domains, и Universal Link попадает в приложение как активность пользователя веб-просмотра, несущая URL. Перед выпуском сверьтесь с актуальной страницей Apple, особенно в части кэширования и поведения в режиме разработки.
Вывод для коротких ссылок следует напрямую. ОС решает по нажатому URL. Это происходит до любого запроса к вашему серверу. Если домен этого URL проверен для вашего приложения, приложение открывается с этим URL. HTTP-запрос к короткой ссылке не выполняется, поэтому редирект не срабатывает.
Два файла
По одному файлу на платформу, каждый по фиксированному пути на одном домене.
apple-app-site-association
Файл AASA должен отдаваться по адресу https://yourdomain.example/.well-known/apple-app-site-association. Отдавайте его по HTTPS с корректной цепочкой сертификатов, статусом 200 и Content-Type: application/json, без редиректа.
Справочник Apple по формату - Supporting associated domains; его страница не отобразилась у меня 2026-10-24, поэтому считайте пример ниже общепринятой опубликованной формой и сверьте его с этой страницей.
Минимальная форма AASA:
{
"applinks": {
"details": [
{
"appIDs": ["ABCDE12345.com.example.acme"],
"components": [
{
"/": "/spring-*",
"comment": "Match any path starting with /spring-"
},
{
"/": "/campaigns/*"
}
]
}
]
}
}
appIDs - это конкатенация вашего Apple Team ID и идентификатора пакета приложения, разделённых точкой. Массив components определяет, какие пути запускают маршрутизацию в приложение; всё, что не совпало ни с одним компонентом, уходит в браузер. В массиве details можно зарегистрировать несколько приложений - полезно, если у вас на одном домене есть потребительский и корпоративный вариант одного продукта.
Одна деталь, о которой стоит сказать прямо: "/" с шаблоном-подстановкой вроде /spring-* - это совпадение по префиксу пути. Синтаксис шаблонов в том же справочнике включает * (любая подстрока), ? (любой одиночный символ) и объекты исключения. Если нужно совпадение со всеми путями домена, используйте "/" : "/*". Если нужно исключить конкретный путь из маршрутизации в приложение - скажем, страница /account/delete должна всегда открываться в браузере, - добавьте объект исключения перед подстановкой:
{
"/": "/account/delete",
"exclude": true
}
Правила вычисляются от первого к последнему, поэтому ставьте исключения перед подстановками.
assetlinks.json
Файл Digital Asset Links для Android лежит по адресу https://yourdomain.example/.well-known/assetlinks.json. Google документирует формат на developers.google.com/digital-asset-links/v1/getting-started.
[
{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.acme",
"sha256_cert_fingerprints": [
"AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33:44:55:66:77:88:99"
]
}
}
]
package_name - это идентификатор приложения в Play Store. sha256_cert_fingerprints содержит отпечатки SHA-256 сертификата подписи вашего приложения (страница Google говорит, что мобильные приложения идентифицируются хешем сертификата и именем пакета). Получите его через keytool -list -v -keystore your.keystore или из настроек подписи в Play Console, если приложение подписывает Play. Перечислите каждый сертификат, которым подписаны устанавливаемые вами сборки, включая отладочный.
В отличие от файла AASA, файл Android не несёт правил путей. Сопоставление путей для App Links выполняется в AndroidManifest.xml через <intent-filter> с android:pathPrefix, android:pathPattern. Файл assetlinks.json подтверждает владение доменом; манифест объявляет, какие пути обрабатывает приложение.
Как вписывается домен коротких ссылок
Ссылка вроде go.acme.example/spring-launch - это просто URL на домене. Дайте go.acme.example оба файла ассоциации и объявите его в приложении, и нажатие на эту ссылку откроет приложение на устройствах, где оно установлено. В этом фокус, и в этом же подвох. Приложение получает https://go.acme.example/spring-launch, а не страницу, на которую ссылка перенаправляет.
У кода вашего приложения тогда два варианта. Первый: самому сопоставить путь (/spring-launch означает экран весны), что работает, когда вы контролируете слаги. Второй: спросить у сервера, куда ведёт короткая ссылка, и маршрутизировать по ответу. У Elido нет документированного эндпоинта, чтобы приложение разрешало слаг в его цель. Публичный редирект просто отвечает 302. Сегодня надёжен первый вариант, а этот пробел есть в нашем бэклоге.
На устройствах без приложения, или когда нажатие происходит там, где ссылки не передаются ОС, короткая ссылка ведёт себя как всегда. Edge отвечает редиректом (по умолчанию 302; ссылку можно настроить на 301 или 307), и браузер следует за ним. Правила таргетинга Elido могут сопоставлять по ОС, поэтому одна ссылка может отправить посетителей iOS на страницу App Store, а посетителей Android в Google Play, когда приложения нет.
Вот что Elido делает и не делает для этого сегодня, проверено по коду:
| Возможность | Статус | Где |
|---|---|---|
Отдавать apple-app-site-association для собственного домена | Да | Вставить JSON для домена в дашборде |
Отдавать assetlinks.json для собственного домена | Да | Та же панель |
| Возвращать 404, если для домена файл не настроен | Да | Домены без приложения ничего не раскрывают |
| Направлять посетителей iOS и Android на разные URL | Да | Правила таргетинга (по ОС) |
| Отложенный deep link после установки | Нет | Используйте SDK поставщика |
| Атрибуция установки по клику | Нет | Консоли магазинов или поставщик |
Elido хранит JSON, который вы пишете, и отдаёт его без изменений по собственным путям /.well-known/ домена. Team ID, идентификатор пакета и отпечаток сертификата подписи Elido за вас не создаёт; они берутся из вашего аккаунта Apple Developer и вашего ключа подписи. Настройка самого домена (CNAME и TLS) такая же, как в коротких ссылках на собственном домене, а страница функции deep link показывает путь в дашборде. Для продуктовых команд, использующих короткие ссылки для онбординга, эта схема покрывает пригласительные и реферальные ссылки без добавления SDK в бинарник. Половину задачи, когда ничего ещё не установлено, решают App Clip Codes в iOS.
Что SDK всё ещё делает лучше
Три вещи лежат за пределами того, что даёт ОС.
Отложенный deep link. Пользователь нажимает до установки. У ОС нет приложения, которому передать URL, поэтому нажатие уходит в браузер, а намерение теряется. Поставщики восстанавливают его вероятностным сопоставлением по данным запроса или передачей через буфер обмена. Запрос согласия на отслеживание у Apple делает пограничные случаи неприятными. Elido этого сегодня не делает.
Атрибуция установок. Без SDK вы всё равно видите установки в App Store Connect и Play Console, но не можете связать одну из них с конкретным нажатием на ссылку. Относительные сигналы выживают: запускайте эксперименты с умными ссылками и сравнивайте установки по кампаниям. Для атрибуции по устройствам нужен поставщик.
Сшивание идентичности. Связать нажатие с адресом электронной почты или контактом CRM - это проект по данным. Для этого поставщики ведут граф устройств.
Если ни одно из этих трёх вам не важно, примитивов ОС достаточно. Если важно хоть одно, нанимайте поставщика только для этой задачи.
Сборник настроек
Три места, которые нужно сделать правильно: сервер, проект iOS и манифест Android.
Требования к HTTPS и путям
Отдавайте оба файла по HTTPS с сертификатом, цепочка которого ведёт к публичному корневому CA. Страница Digital Asset Links от Google говорит, что список утверждений «должен» находиться в /.well-known/assetlinks.json, а списки в других местах или под другими именами недействительны (developers.google.com/digital-asset-links/v1/getting-started, дата обращения 2026-10-24). Эта страница не говорит, следуют ли за редиректами, поэтому отдавайте файл напрямую с кодом 200 и не рискуйте. Тот же совет относится к файлу Apple.
iOS: entitlement Associated Domains
В Xcode, в разделе Signing & Capabilities, добавьте возможность Associated Domains со значением applinks:go.acme.example. Apple документирует суффикс ?mode=developer для сборок разработки, который заставляет устройство загружать файл с вашего сервера, а не через кэш Apple; заново проверить эту страницу 2026-10-24 я не смог, поэтому подтвердите это в документации Apple. Обрабатывайте входящую ссылку как активность пользователя веб-просмотра (SwiftUI onContinueUserActivity(NSUserActivityTypeBrowsingWeb) или делегат UIKit continue userActivity) и читайте webpageURL.
Android: App Links в манифесте
Внутри activity, которая должна обрабатывать ссылки:
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="go.acme.example"
android:pathPrefix="/campaigns/" />
</intent-filter>
Android рассматривает для автопроверки фильтры с действием VIEW, обеими категориями выше и схемой http или https. В Android 11 и ниже система делает ваше приложение обработчиком по умолчанию, только если находит файл Digital Asset Links для каждого хоста в манифесте, поэтому один плохой хост ломает все. На данном устройстве с доменом одновременно может быть связано только одно приложение.
Проверка, что всё работает
В Android дайте проверке не менее 20 секунд после установки, затем выполните adb shell pm get-app-links com.example.acme (Android 12 и новее) и найдите verified. Повторный запуск можно принудительно вызвать командой adb shell pm verify-app-links --re-verify com.example.acme. Результаты вроде none, denied или legacy_failure означают, что неверен файл или отпечаток.
Для самого файла API Digital Asset Links от Google перечисляет утверждения, которые он может прочитать для сайта: https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://go.acme.example&relation=delegate_permission/common.handle_all_urls. Пустой ответ означает, что Android не проверит приложение.
Для обеих платформ запросите файл так, как это сделал бы краулер:
curl -si https://go.acme.example/.well-known/assetlinks.json | head -20
curl -si https://go.acme.example/.well-known/apple-app-site-association | head -20
Вам нужны код 200 и тело JSON. Elido отправляет application/json для обоих файлов. Обычные ошибки - опечатка в Team ID или идентификаторе пакета, релизная сборка, сертификата подписи которой нет в списке отпечатков, и файл, существующий только на корневом домене, когда ссылки используют поддомен.
Компромисс прямо
Отказ от SDK для deep link убирает зависимость из бинарника приложения и отношение обмена данными из вашей политики конфиденциальности. Цифру размера я называть не буду; она зависит от поставщика, и я её не измерял. Цена: нажатие до установки нельзя связать с установкой.
Командам ранней стадии, у которых стоимость установки по каналам ещё не определяет бюджет, начните с примитивов ОС и добавьте поставщика атрибуции, когда данные станут пригодными для действий.
Читайте также в блоге
Частые вопросы
Можно ли делать deep link без Firebase или стороннего SDK?
Да, для случая, когда приложение уже установлено. iOS Universal Links и Android App Links требуют домен под вашим контролем, JSON-файл ассоциации на этом домене и несколько строк в приложении. В собственном FAQ по Firebase Dynamic Links Google указывает на эти два механизма как на вариант для deep link в установленные приложения. Вы теряете отложенный deep link, то есть открытие нужного экрана после свежей установки.
Работают ли Universal Links и App Links с доменом коротких ссылок?
Да, если домен коротких ссылок отдаёт файлы ассоциации, а приложение объявляет этот домен. Подвох в том, что операционная система открывает приложение с самим нажатым коротким URL, поэтому приложение должно превратить этот URL в экран. Оно не может полагаться на то, что редирект отработал. Когда приложения нет, то же нажатие загружается в браузере и действует обычный редирект.
Куда класть файлы ассоциации?
Android читает https://your-domain/.well-known/assetlinks.json, и документация Google по Digital Asset Links говорит, что это единственное допустимое место. Файл Apple кладётся по адресу https://your-domain/.well-known/apple-app-site-association без расширения. Отдавайте оба по HTTPS с сертификатом, цепочка которого ведёт к публичному CA.
Почему мое Android-приложение показывает выбор, а не открывается сразу?
Для прямого открытия нужен проверенный App Link. Android проверяет домен по assetlinks.json при установке приложения и только если intent-фильтр содержит android:autoVerify="true". Если файла нет, он неверный или в нём указан другой сертификат подписи, чем у установленной сборки, ссылка ведёт себя как обычный deep link.
Что такое отложенный deep link и можно ли без него обойтись?
Отложенный deep link переносит назначение ссылки через установку приложения, так что пользователь, нажавший до установки, при первом запуске попадает на нужный экран. Universal Links и App Links в этом случае ничего не делают, потому что приложения, принимающего нажатие, нет. Можно обойтись без него в сценариях онбординга, где подойдёт главный экран, и подключать для него поставщика только если маршрутизация первого запуска двигает ваши показатели.
Какие части из этого берёт на себя Elido?
Elido отдаёт файлы apple-app-site-association и assetlinks.json для собственных доменов, используя JSON, который вы вставляете в настройки домена в дашборде. Он также направляет посетителей iOS и Android на разные адреса правилами таргетинга. Отложенного deep link и атрибуции установок он не предлагает, поэтому при необходимости используйте SDK поставщика.
Попробуйте Elido
Вставьте URL - получите короткую ссылку
Без регистрации. Ссылка живёт 30 дней. Зарегистрируйтесь, чтобы оставить её навсегда.
Без регистрации. Зарегистрируйтесь бесплатно и получите 50 ссылок в месяц.