Appy

Бесплатный инструмент

Генератор AASA и assetlinks.json

Создайте файл apple-app-site-association для Universal Links на iOS и файл assetlinks.json для App Links на Android. Введите данные приложения, затем скопируйте или скачайте готовый к загрузке файл.

  • Бесплатно, без регистрации
  • Работает в браузере
  • Актуальный формат components от Apple

Файлы уже готовы? Проверьте их валидатором

Приложения

Добавьте каждое приложение, которое должно открывать ссылки этого домена. Каждое станет записью в appIDs.

  1. Приложение 1

    10 символов, в аккаунте Apple Developer в разделе Membership details.

    Из таргета приложения в Xcode, например com.example.app.

Пути, которые открывают приложение

Правила проверяются сверху вниз, и срабатывает первое совпадение, поэтому ставьте исключения выше общих правил. * означает любое количество символов, ? ровно один.

  1. Правило 1

    пары имя=значение через &

Другие сервисы

Ваш файл

apple-app-site-association

Пример. Введите свои данные, и он заменится.

{
  "applinks": {
    "details": [
      {
        "appIDs": [
          "ABCDE12345.com.example.app"
        ],
        "components": [
          {
            "/": "/*"
          }
        ]
      }
    ]
  }
}

Создаётся в вашем браузере. Никуда не отправляется.

Где разместить файл

  1. Загрузите его по адресу https://ваш-домен/.well-known/apple-app-site-association, без расширения .json.
  2. Отдавайте по HTTPS с действующим сертификатом и сразу с кодом 200, без редиректов.
  3. Отправляйте заголовок Content-Type: application/json.
  4. Повторите для каждого хоста в ссылках: example.com и www.example.com — разные хосты, и каждому нужны файл и запись applinks:.
  5. CDN Apple забирает новый файл в течение 24 часов. До этого тестируйте с ?mode=developer.
Проверить домен валидатором

Не хотите размещать файлы сами? Smart-ссылки бесплатны, а на Enterprise Appy отдаёт оба файла на домене ссылок вашего приложения.

Создать бесплатную ссылку

Как это связано

Два файла, взаимная проверка

Universal Links и App Links открывают приложение, только когда обе стороны подтверждают друг друга. Приложение называет домен, а файл на домене называет приложение. Если одной половины нет, ссылка откроет ваш сайт.

Приложение iOS

Entitlement Associated Domains

applinks:example.com

Ваш домен

example.com/.well-known/

  • apple-app-site-association

    Содержит app ID: Team ID и bundle ID

    ABCDE12345.com.example.app
  • assetlinks.json

    Содержит имя пакета и отпечаток SHA-256

    com.example.app · 14:6D:E9:…

Приложение Android

Intent-фильтр с autoVerify

android:autoVerify="true"android:host="example.com"

Обе половины совпадают: ссылка открывает приложение

Чего-то не хватает: ссылка открывает ваш сайт

iOS получает файл через CDN Apple при установке приложения и проверяет обновления примерно раз в неделю. Android проводит проверку при установке. Ни одна из систем не обращается к домену в момент нажатия.

Поле за полем

Что означает каждый ключ в файлах

Оба файла — обычный JSON. Ниже ключи, которые пишет генератор, и необязательные, о которых полезно знать.

apple-app-site-association

applinks
Сервис Universal Links. Всё, что решает, какой URL открывает какое приложение, находится внутри.
details
Массив записей, каждая связывает группу приложений с группой правил для URL. Используйте несколько записей, если разные приложения обрабатывают разные пути.
appIDs
App ID в формате <Team ID>.<bundle ID>, например ABCDE12345.com.example.app. Каждое приложение также должно указать домен в entitlement Associated Domains.
components
Правила для URL, проверяются по порядку. Первое совпавшее правило решает, откроется ли приложение.
/
Шаблон пути URL, например /products/*. Если его нет, подходит любой путь.
?
Параметры запроса для сравнения, в виде словаря. {"ref": "?*"} требует непустой параметр ref.
#
Шаблон для фрагмента после #.
exclude
Значение true оставляет совпавшие URL на сайте. Ставьте такие правила выше общих.
comment
Заметка для тех, кто читает файл. iOS её игнорирует.
webcredentials
Необязательно. Перечисляет приложения, которым автозаполнение может предлагать пароли, сохранённые для этого сайта.
appclips
Необязательно. Перечисляет App Clip, которые может запускать этот домен.

* означает любое количество символов, ? ровно один, ?* хотя бы один. Сравнение учитывает регистр, если не добавить "caseSensitive": false.

assetlinks.json

[ ]
Файл представляет собой JSON-массив утверждений, даже если утверждение одно.
relation
delegate_permission/common.handle_all_urls разрешает приложению открывать ссылки этого сайта. delegate_permission/common.get_login_creds добавляет общие данные для входа.
target
Приложение, к которому относится утверждение.
namespace
Для Android-приложения всегда android_app.
package_name
applicationId приложения, например com.example.app.
sha256_cert_fingerprints
Отпечатки SHA-256 сертификатов, которыми подписано приложение: пары заглавных символов через двоеточие. Укажите каждый ключ, которым подписаны устанавливаемые сборки.
relation_extensions
Необязательно, Android 15 и новее. Его dynamic_app_link_components добавляет правила для путей в духе components от Apple. Более старые версии его игнорируют.

Старый формат с paths

До iOS 13 в каждой записи был один appID, массив paths с NOT перед исключениями, а в файле требовался пустой массив apps. iOS 13 и новее читают appIDs и components. Генератор пишет только современный формат. Если вы ещё поддерживаете iOS 12, добавьте старые ключи в ту же запись.

Старый, iOS 12 и ниже
{
  "applinks": {
    "apps": [],
    "details": [{
      "appID": "ABCDE12345.com.example.app",
      "paths": ["NOT /help/website/*", "/buy/*"]
    }]
  }
}
Современный, iOS 13 и выше
{
  "applinks": {
    "details": [{
      "appIDs": ["ABCDE12345.com.example.app"],
      "components": [
        {"/": "/help/website/*", "exclude": true},
        {"/": "/buy/*"}
      ]
    }]
  }
}

Частые ошибки

Почему файл выглядит правильно, но не работает

JSON может быть валидным, а ссылки всё равно открывают сайт. Прежде всего проверьте эти семь пунктов.

  1. 01iOS

    Неверный префикс Team ID

    Файл загружается, но iOS так и не открывает приложение.

    Как исправить

    Используйте Team ID аккаунта, которым подписан релиз, из раздела Membership details. Не числовой ID в App Store, не Key ID и не команду агентства, если приложение публикуется с вашего аккаунта.

    Полное руководство по Universal Links для iOS и Android
  2. 02Android

    Ключ загрузки вместо ключа подписи Play

    Ваши собственные сборки открывают приложение, а установки из Google Play открывают браузер.

    Как исправить

    Google подписывает распространяемые приложения ключом подписи приложения. Скопируйте его SHA-256 в Play Console, в разделе «Целостность приложения», а ключ загрузки оставьте в списке, только если раздаёте подписанные им сборки.

    Android App Links не проходят проверку: диагностика за пять минут с adb
  3. 03iOS + Android

    Файл отдаётся через редирект

    В браузере адрес открывается нормально, но проверка не проходит.

    Как исправить

    Apple и Android ждут код 200 по точному адресу. Исключите /.well-known/ из редиректов с домена без www на www, обратно и по языку.

    Universal Links открывают Safari? Исправьте AASA, App Links, редиректы и headers
  4. 04iOS + Android

    Неверный Content-Type или HTML вместо JSON

    Файл на месте, но платформа его игнорирует.

    Как исправить

    Отдавайте оба файла как application/json. Серверы часто отдают AASA без расширения как application/octet-stream, а некоторые хостинги возвращают страницу входа или проверку на бота.

    Universal Links открывают Safari? Исправьте AASA, App Links, редиректы и headers
  5. 05iOS + Android

    Забытый хост www

    Ссылки на example.com открывают приложение, а на www.example.com — сайт.

    Как исправить

    Каждый хост проверяется отдельно. Загрузите файл на оба, укажите оба в Associated Domains и объявите оба в intent-фильтрах Android.

    Полное руководство по Universal Links для iOS и Android
  6. 06iOS

    Исключение под общим правилом

    Страницы, которые должны оставаться на сайте, открывают приложение.

    Как исправить

    Срабатывает первое совпавшее правило. Поднимите правила exclude выше /*, как в примере Appy в генераторе.

  7. 07iOS

    Расширение .json или не та папка

    По адресу, который запрашивает iOS, ничего нет.

    Как исправить

    Файл называется apple-app-site-association, без расширения, и лежит в /.well-known/. Кнопка скачивания выше уже использует это имя.

Без возни с хостингом

Пусть оба файла отдаёт Appy

На Enterprise приложение получает собственный домен для ссылок, и Appy размещает на нём apple-app-site-association и assetlinks.json, собранные из Team ID, bundle ID, имени пакета и отпечатков, которые вы указали. Сами smart-ссылки бесплатны, а deep links доступны на Pro.

  • Бесплатный тариф
  • Без банковской карты
  • Безлимитные клики на любом тарифе
  • Ссылки работают и после отмены подписки

Частые вопросы

Что такое файл apple-app-site-association?

JSON-файл на вашем домене, который сообщает iOS, какие приложения могут открывать какие URL как Universal Links. Он лежит по адресу https://ваш-домен/.well-known/apple-app-site-association, не имеет расширения и перечисляет app ID (Team ID и bundle ID) с правилами URL для каждого.

Что такое assetlinks.json?

Аналог для Android на основе Google Digital Asset Links. Файл лежит по адресу https://ваш-домен/.well-known/assetlinks.json и указывает пакет и отпечатки сертификата подписи приложения, которому разрешено открывать ваши ссылки. Android проверяет его при установке приложения и только после этого считает ссылки проверенными App Links.

Куда загружать созданные файлы?

В папку /.well-known/ в корне каждого хоста, который вы используете в ссылках. Оба файла должны открываться по HTTPS сразу с кодом 200, без редиректов и с типом application/json. На статическом хостинге для AASA часто нужно отдельное правило заголовков, потому что у файла нет расширения.

Где найти Team ID и bundle ID?

Team ID указан в аккаунте Apple Developer в разделе Membership details. Bundle ID находится на вкладке General таргета приложения в Xcode. Вместе они образуют app ID, например ABCDE12345.com.example.app.

Как получить отпечаток SHA-256 для assetlinks.json?

Если приложение подписывает Google Play, откройте Play Console, перейдите в «Целостность приложения» и скопируйте SHA-256 сертификата ключа подписи приложения. Для ключей, которые хранятся у вас, выполните keytool -list -v -keystore my-release-key.keystore или ./gradlew signingReport. Генератор принимает значение с двоеточиями и без.

Что использовать в AASA: paths или components?

Используйте components. Apple ввела этот ключ в iOS 13, и он поддерживает параметры запроса, фрагменты, исключения и комментарии. Старый массив paths нужен, только если вы ещё поддерживаете iOS 12 и ниже; тогда укажите оба в одной записи.

Может ли один файл охватывать несколько приложений?

Да. В AASA перечислите все app ID в appIDs или добавьте отдельные записи details, если приложения обрабатывают разные пути. В assetlinks.json добавьте в массив по утверждению на каждый пакет. Генератор поддерживает несколько iOS-приложений; для второго Android-пакета скопируйте утверждение и замените имя пакета и отпечатки.

Сколько времени изменения идут до устройств?

По данным Apple, её CDN запрашивает AASA в течение 24 часов, а устройства проверяют обновления примерно раз в неделю после установки. Android проводит проверку при установке приложения; на тестовом устройстве adb shell pm verify-app-links --re-verify com.example.app запускает её заново.

Нужно ли подписывать файл AASA?

Нет. Подпись TLS-сертификатом требовалась только в iOS 8. Начиная с iOS 9 Apple ожидает обычный JSON-файл, отданный по HTTPS.

Отправляется ли то, что я ввожу, в Appy?

Нет. Файлы создаёт код, который работает в вашем браузере, и ничего из введённого не загружается и не сохраняется. Валидатор устроен иначе: при запуске он забирает файлы с вашего домена.

Что дальше