Как настроить связи с сайтами и динамические правила

Чтобы поддерживать ссылки на приложение, создайте JSON-файл протокола связи цифровых объектов с названием assetlinks.json и опубликуйте его в общедоступном месте на своем сайте. В этом файле указывается, какие приложения могут обрабатывать ссылки для вашего домена. Устройства Android будут получать этот файл с вашего сервера, чтобы проверять ссылки на контент.

Для динамических ссылок на приложения в Android 15 и более поздних версиях в файле assetlinks.json также определяется конфигурация динамических правил, например сопоставители шаблонов для пути, фрагмента и параметров запроса. Устройства Android с Android 15 (API уровня 35) или более поздней версии, на которых установлены сервисы Google, будут периодически получать этот файл и объединять динамическую конфигурацию со статической в манифесте приложения.

В этом руководстве рассказывается, как подготовить файл assetlinks.json и опубликовать его на сайте. Вы также можете создать файл assetlinks.json с помощью инструмента Play Deep Links или App Links Assistant в Android Studio. Подробнее об инструментах разработчика для ссылок на приложения…

Как объявить о связи между сайтами

Чтобы указать, какие приложения для Android связаны с сайтом, и подтвердить намерения URL приложения, опубликуйте на сайте файл JSON протокола связи цифровых объектов. Для идентификации связанных приложений в файле JSON используются следующие поля:

  • package_name – идентификатор приложения, указанный в файле build.gradle.
  • sha256_cert_fingerprints – цифровые отпечатки SHA-256 сертификата подписи приложения. Чтобы сгенерировать цифровой отпечаток с помощью Java keytool, используйте следующую команду:

keytool -list -v -keystore my-release-key.keystore

  • В этом поле можно указать несколько цифровых отпечатков, чтобы обеспечить поддержку разных версий приложения, например отладочной и рабочей. Если вы используете функцию подписания приложений в Google Play, то цифровой отпечаток сертификата, полученный при локальном запуске keytool, обычно не совпадает с отпечатком на устройствах пользователей. Проверить, используете ли вы функцию подписания приложений в Google Play, можно в аккаунте разработчика Play Console в разделе Release > Setup > App signing. Если да, то на этой же странице вы найдете правильный фрагмент JSON протокола связи цифровых объектов для своего приложения.

В примере ниже файл assetlinks.json предоставляет права на открытие ссылок приложению Android com.example.

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Как связать сайт с несколькими приложениями

В одном файле assetlinks.json можно указать связь сайта с несколькими приложениями. Ниже приведен пример файла манифеста, в котором объявляется связь с двумя приложениями по отдельности. Он находится по адресу https://www.example.com/.well-known/assetlinks.json.

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.puppies.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
  },
  {
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.monkeys.app",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Разные приложения могут обрабатывать ссылки на разные ресурсы в рамках одного веб-хоста. Например, приложение 1 может объявить фильтр интентов для https://example.com/articles, а приложение 2 – для https://example.com/videos.

Как связать несколько сайтов с одним приложением

С одним приложением можно связать несколько сайтов, указав их в файлах assetlinks.json. В приведенных ниже списках файлов показано, как объявить о связи example.com и example.net с app1. В первом списке показана связь example.com с app1:

https://www.example.com/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

В следующем списке показана связь example.net с app1. Разница заключается только в месте размещения файлов (.com и .net):

https://www.example.net/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "sha256_cert_fingerprints":
    ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]

Как настроить динамические правила

Динамические ссылки на приложения в Android 15 и более поздних версиях позволяют использовать правила сопоставления ссылок на контент на стороне сервера, которые работают вместе с правилами, статически заданными в манифесте приложения. Динамические правила задаются в файле assetlinks.json. Это необязательный параметр.

Устройства Android с Android 15 (API уровня 35) или более поздней версии, на которых установлены сервисы Google, будут периодически получать этот файл с вашего сервера и объединять конфигурацию динамических правил со статической конфигурацией в манифесте приложения. Ниже приведен пример файла assetlinks.json с динамическими правилами.

[
  {
    "relation": [
      "delegate_permission/common.handle_all_urls"
    ],
    "target": {
      "namespace": "android_app",
      "package_name": "com.example.app",
      "sha256_cert_fingerprints": [...]
    },
    "relation_extensions": {
      "delegate_permission/common.handle_all_urls": {
        "dynamic_app_link_components": [
          {"?": {"dl": "*"}},
          {"#": "app"},
          {"/": "/products/*"},
          {"/": "/shoes", "?": {"in_app": "true"}},
          {"/": "*", "exclude": true}
        ]
      }
    }
  }
]

Важные сведения о коде

  • Динамические ссылки на приложения добавляют новое расширение отношений Digital Asset Links под названием dynamic_app_link_components, в котором вы настраиваете динамические правила.
  • Динамические правила могут включать сопоставители шаблонов для пути, фрагмента и параметров запроса.
  • Вы также можете исключить любой шаблон, чтобы соответствующие ему URL не открывали приложение.
  • В этом примере показаны сопоставители для пути ("/"), фрагмента ("#") и параметров запроса ("?"), а также исключенные сопоставители ("exclude").
  • Если какие-либо поля в файле неправильно отформатированы или пусты, Android отбрасывает динамические правила, и устройство возвращается к правилам, которые статически определены в манифесте приложения.

Динамические правила могут указывать только правила, которые применяются в рамках доменов, объявленных в файле манифеста приложения. Подробнее об объявлении динамических правил…

Объявление динамических правил

Динамические ссылки на приложения поддерживают новое расширение отношений dynamic_app_link_components, которое содержит массив объектов правил. Каждое правило определяется с помощью сопоставителей шаблонов для путей, фрагментов и параметров запроса, которые будут открывать ваше приложение. Сопоставители также можно исключить по отдельности, чтобы они не открывали ваше приложение. Все это необязательно.

  • Соответствие пути
    • Клавиша: /
    • Значение: одна строка, соответствующая выражению для пути URL.
  • Сопоставление фрагментов
    • Ключ: #
    • Значение: одна строка, соответствующая выражению для фрагмента URL.
  • Соответствие параметру запроса
    • Клавиша: ?
    • Значение: словарь для сопоставления пар "ключ-значение" в параметрах запроса URL.
    • Например, словарь {"?", {"dl": "*", "in_app":"true"} будет соответствовать строке запроса "?in_app=true&dl=abc".
    • Порядок пар "ключ-значение" в словаре не обязательно должен совпадать с порядком пар в строке запроса. Кроме того, словарь не должен соответствовать всем парам "ключ-значение" в строке запроса, но совпадение должно быть найдено для каждой записи словаря.
    • Например, словарь будет соответствовать строке запроса ?lang=en&in_app=true&tz=pst&dl=abc, но не будет соответствовать строке запроса ?lang=en&tz=pst&dl=abc.
  • Исключено
    • Ключ: "exclude"
    • Value. Необязательное логическое значение для каждого правила, заданного в dynamic_app_link_components (см. пример).

В шаблонах соответствия можно использовать следующие специальные символы:

  • "*" соответствует любому количеству символов до символа, который в шаблоне указан после подстановочного знака.
  • "?" соответствует любому символу;
  • "?*" соответствует одному или нескольким символам.

Других ограничений на символы в значениях нет.

Как упорядочить динамические правила

Порядок, в котором объявлены правила, имеет значение. Android оценивает каждое правило по порядку, пока не найдет совпадение.

В примере ниже показано, как порядок может повлиять на обработку. Первое правило соответствует всем путям ("*"), но исключает совпадения (exclude: true), то есть запрещает открывать приложение по любым URL. В этом случае второе правило, разрешающее "/path1", никогда не будет оцениваться.

dynamic_app_link_components: [
  {"/": "*", "exclude": true},
  {"/": "/path1"}
]

Однако в следующем примере правило "/path1" объявлено первым, поэтому оно будет оцениваться первым и откроет приложение для URL, соответствующего "/path1". Второе правило, которое запрещает открывать приложение по любым URL, будет проверяться вторым, но только если не сработает первое правило.

dynamic_app_link_components: [
  {"/": "/path1"},
  {"/": "*", "exclude": true}
]

Если совпадений в списке объявленных компонентов не найдено, URL не откроет приложение. В следующем примере ни один из путей не совпадает с "/path3", поэтому устройство будет считать этот путь исключенным.

dynamic_app_link_components: [
  {"/": "/path1"},
  {"/": "/path2"}
]

Это важно, если вы хотите, чтобы dynamic_app_link_components исключал только определенные части URL, но разрешал все остальные. В примере ниже, если не добавить последнее правило, разрешающее все остальные пути, все URL будут исключены из приложения.

dynamic_app_link_components: [
  {"/": "/path1", "exclude": true},
  {"/": "*"}
]

Правильно задавайте область действия динамических правил

При определении серверных правил для использования с динамическими ссылками на приложения в Android 15 и более поздних версиях важно правильно определить их область действия, чтобы они работали и дополняли статические фильтры интентов, объявленные в манифесте приложения.

Динамические правила, объявленные в файле assetlinks.json, могут указывать правила только для хостов, объявленных в файле AndroidManifest.xml приложения. Динамические правила не могут расширять область действия правил URL, которые вы статически объявляете в манифесте приложения.

Поэтому мы рекомендуем использовать этот подход как для динамических, так и для статических правил:

  • В манифесте приложения задайте правила с максимально широкой областью действия, например указав только схему и домен.
  • Для дальнейшей настройки, например маршрутизации на уровне пути, используйте динамические правила на стороне сервера.

При такой конфигурации вы сможете динамически добавлять новые пути ссылок на приложение в файл assetlinks.json по мере необходимости, зная, что они будут соответствовать широкой области действия, заданной в манифесте приложения.

Чтобы правила обрабатывались правильно, объявите только один объект dynamic_app_link_components во всех записях для определенного сайта, отношения и приложения.

  • Найдите несколько записей для одного сайта, отношения и приложения, в которых объявлен объект dynamic_app_link_components.
  • Проверьте, не объявлено ли несколько объектов dynamic_app_link_components в одном операторе.

В таких случаях Android не гарантирует, какая конфигурация динамических правил будет использоваться.

Совместимость динамических правил с более ранними конфигурациями ссылок на приложения

Если вы уже поддерживаете ссылки на приложение, то можете добавить поддержку динамических ссылок на приложение непосредственно в существующий файл assetlinks.json. Поля отношений для проверки ссылок на приложение остаются прежними, и вы можете добавить новые поля расширения отношений для динамических правил без каких-либо других изменений.

Устройства Android с Android 14 (API уровня 34 или более ранней версии) игнорируют новые поля расширения отношений для динамических правил, а устройства с Android 15 и более поздними версиями объединяют эти правила с правилами, определенными в манифесте.

Опубликуйте файл подтверждения JSON

Файл подтверждения JSON необходимо опубликовать по следующему адресу:

https://domain.name/.well-known/assetlinks.json

Убедитесь в следующем:

  • Файл assetlinks.json передается с типом контента application/json.
  • Файл assetlinks.json должен быть доступен по протоколу HTTPS, даже если в фильтрах интентов приложения в качестве схемы данных указан протокол HTTPS.
  • Файл assetlinks.json должен быть доступен без переадресации (включая переадресацию 301 и 302).
  • Если ссылки на приложение поддерживают несколько доменов хоста, то файл assetlinks.json нужно опубликовать в каждом из них. Подробнее о том, как настроить поддержку ссылок на приложение для нескольких хостов…
  • Не публикуйте приложение, если в файле манифеста указаны тестовые URL, которые могут быть недоступны для пользователей (например, те, которые открываются только через VPN). В таких случаях можно настроить варианты сборки, чтобы для сборок, предназначенных для разработки, создавался другой файл манифеста.

Ознакомьтесь со следующими руководствами: