Проверьте ссылки на приложения Android

Ссылка на приложение Android — это особый тип глубокой ссылки, которая позволяет URL-адресам вашего сайта мгновенно открывать соответствующий контент в вашем приложении Android, не требуя от пользователя выбора приложения. Ссылки на приложения Android используют API Digital Asset Links , чтобы подтвердить, что ваше приложение одобрено веб-сайтом, и автоматически открывать ссылки для этого домена. Если система успешно подтверждает, что вы являетесь владельцем URL-адресов, она автоматически перенаправляет эти URL-адреса в ваше приложение.

Чтобы подтвердить, что вы являетесь владельцем URL-адресов приложения и веб-сайта, выполните следующие действия:

  1. Добавьте фильтры намерений , содержащие атрибут autoVerify . Этот атрибут сигнализирует системе о необходимости проверки принадлежности вашего приложения к URL-доменам, используемым в фильтрах намерений.

  2. Объявите связь между вашим веб-сайтом и фильтрами намерений, разместив JSON-файл Digital Asset Links по следующему адресу:

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

Соответствующую информацию вы можете найти в следующих ресурсах:

Добавить фильтры намерений для проверки ссылок приложений

Чтобы включить проверку обработки ссылок для вашего приложения, добавьте фильтры намерений, соответствующие следующему формату:

<!-- Make sure you explicitly set android:autoVerify to "true". -->
<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" />

    <!-- If a user clicks on a shared link that uses the "http" scheme, your
         app should be able to delegate that traffic to "https". -->
    <!-- Do not include other schemes. -->
    <data android:scheme="http" />
    <data android:scheme="https" />

    <!-- Include one or more domains that should be verified. -->
    <data android:host="..." />
</intent-filter>

Хотя достаточно включить autoVerify только в одно объявление <intent-filter> для каждого хоста, даже если этот хост используется в других неотмеченных объявлениях, рекомендуется добавлять autoVerify в каждый элемент <intent-filter> для обеспечения согласованности. Это также гарантирует, что после удаления или рефакторинга элементов в файле манифеста ваше приложение сохранит связь со всеми доменами, которые вы ещё определили.

Процесс проверки домена требует подключения к интернету и может занять некоторое время. Для повышения эффективности процесса система проверяет домен для приложения, предназначенного для Android 12 или более поздних версий, только если этот домен находится внутри элемента <intent-filter> , содержащего формат, указанный в предыдущем фрагменте кода. Например, схемы, отличные от «http» и «https», такие как <data android:scheme="custom" /> , предотвратят запуск проверки домена элементом <intent-filter> .

Поддержка связывания приложений для нескольких хостов

Система должна иметь возможность проверить хост, указанный в элементах данных фильтров URL-адресов приложения, на соответствие файлам ссылок на цифровые активы, размещённым на соответствующих веб-доменах в этом фильтре намерений. В случае неудачи система по умолчанию использует стандартное поведение для разрешения намерения, как описано в разделе «Создание глубоких ссылок на контент приложения» . Однако приложение по-прежнему может быть проверено как обработчик по умолчанию для любого из шаблонов URL-адресов, определённых в других фильтрах намерений приложения.

Примечание: в Android 11 (уровень API 30) и ниже система не проверяет ваше приложение как обработчик по умолчанию, пока не найдет соответствующий файл ссылок на цифровые активы для всех хостов, которые вы определяете в манифесте.

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

<application>

  <activity android:name=”MainActivity”>
    <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="http" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
    </intent-filter>
  </activity>
  <activity android:name=”SecondActivity”>
    <intent-filter>
      <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" />
     <data android:host="www.example.net" />
    </intent-filter>
  </activity>

</application>

Примечание: Все элементы <data> в одном фильтре намерений объединяются для учета всех вариаций их комбинированных атрибутов. Например, первый фильтр намерений, представленный выше, включает элемент <data> , который объявляет только схему HTTPS. Однако он объединен с другим элементом <data> , чтобы фильтр намерений поддерживал как http://www.example.com , так и https://www.example.com . Таким образом, для определения конкретных комбинаций схем URI и доменов необходимо создать отдельные фильтры намерений.

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

Протокол Digital Asset Links рассматривает поддомены в фильтрах намерений как уникальные, отдельные хосты. Поэтому, если в вашем фильтре намерений указано несколько хостов с разными поддоменами, необходимо опубликовать корректный файл assetlinks.json для каждого домена. Например, следующий фильтр намерений включает www.example.com и mobile.example.com в качестве допустимых хостов URL намерений. Таким образом, корректный файл assetlinks.json должен быть опубликован как по адресу https://www.example.com/.well-known/assetlinks.json , так и по https://mobile.example.com/.well-known/assetlinks.json .

<application>
  <activity android:name=”MainActivity”>
    <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" />
      <data android:scheme="https" />
      <data android:host="www.example.com" />
      <data android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

В качестве альтернативы, если вы объявляете имя хоста с подстановочным знаком (например, *.example.com ), вы должны опубликовать файл assetlinks.json в корневом имени хоста ( example.com ). Например, приложение со следующим фильтром намерений пройдёт проверку для любого подимена example.com (например, foo.example.com ), если файл assetlinks.json опубликован по адресу https://example.com/.well-known/assetlinks.json :

<application>
  <activity android:name=”MainActivity”>
    <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" />
      <data android:host="*.example.com" />
    </intent-filter>
  </activity>
</application>

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

Если вы публикуете несколько приложений, каждое из которых связано с одним и тем же доменом, каждое из них может быть успешно проверено. Однако, если приложения могут определить один и тот же хост и путь к домену, как это может быть в случае с облегчённой и полной версиями приложения, только приложение, установленное последним, сможет определить веб-намерения для этого домена.

В таком случае проверьте наличие конфликтующих приложений на устройстве пользователя, при условии, что у вас есть необходимые разрешения на доступ к пакетам . Затем отобразите в своём приложении диалоговое окно выбора, содержащее результаты вызова queryIntentActivities() . Пользователь может выбрать предпочитаемое приложение из списка соответствующих приложений, отображаемых в диалоговом окне.

Объявить ассоциации веб-сайтов

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

  • package_name : идентификатор приложения , объявленный в файле build.gradle приложения.
  • sha256_cert_fingerprints : SHA256-отпечатки сертификата подписи вашего приложения. Вы можете использовать следующую команду для генерации отпечатка с помощью Java keytool:
    keytool -list -v -keystore my-release-key.keystore
    
    Это поле поддерживает несколько отпечатков пальцев, которые можно использовать для поддержки разных версий вашего приложения, например отладочных и производственных сборок.

    Если вы используете функцию подписания приложений Play App Signing для своего приложения, то отпечаток сертификата, созданный при локальном запуске keytool обычно не будет совпадать с отпечатком сертификата на устройствах пользователей. Вы можете проверить, используете ли вы функцию подписания приложений Play App Signing для своего приложения, в своей учётной записи разработчика 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"]
  }
}]

Разные приложения могут обрабатывать ссылки на разные ресурсы на одном и том же веб-хосте. Например, приложение app1 может объявить фильтр намерений для https://example.com/articles , а приложение app2 может объявить фильтр намерений для 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"]
  }
}]

Публикация файла проверки JSON

Вам необходимо опубликовать свой проверочный файл JSON по следующему адресу:

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

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

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

Проверка ссылок на приложения Android

Если хотя бы в одном из фильтров намерений вашего приложения присутствует android:autoVerify="true" , то при установке приложения на устройство под управлением Android 6.0 (уровень API 23) или выше система автоматически проверит хосты, связанные с URL-адресами в фильтрах намерений вашего приложения. В Android 12 и выше вы также можете вручную запустить процесс проверки , чтобы протестировать логику проверки.

Автоматическая проверка

Автоматическая проверка системы включает в себя следующее:

  1. Система проверяет все фильтры намерений, которые включают в себя любое из следующего:
    • Действие: android.intent.action.VIEW
    • Категории: android.intent.category.BROWSABLE и android.intent.category.DEFAULT
    • Схема данных: http или https
  2. Для каждого уникального имени хоста, найденного в приведенных выше фильтрах намерений, Android запрашивает у соответствующих веб-сайтов файл ссылок на цифровые активы по адресу https:// hostname /.well-known/assetlinks.json .

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

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://domain.name:optional_port"

Ручная проверка

Начиная с Android 12, вы можете вручную запустить проверку домена для приложения, установленного на устройстве. Вы можете выполнить этот процесс независимо от того, предназначено ли ваше приложение для Android 12.

Установить подключение к Интернету

Для проверки домена ваше тестовое устройство должно быть подключено к Интернету.

Поддержите обновленный процесс проверки домена

Если ваше приложение ориентировано на Android 12 или выше, система автоматически использует обновленный процесс проверки домена.

В противном случае вы можете вручную включить обновлённый процесс проверки. Для этого выполните следующую команду в окне терминала:

adb shell am compat enable 175408749 PACKAGE_NAME

Сбросьте состояние ссылок приложений Android на устройстве

Прежде чем вручную активировать проверку домена на устройстве, необходимо сбросить состояние ссылок приложений Android на тестовом устройстве. Для этого выполните следующую команду в окне терминала:

adb shell pm set-app-links --package PACKAGE_NAME 0 all

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

Вызовите процесс проверки домена

После сброса состояния ссылок приложений Android на устройстве вы можете выполнить саму проверку. Для этого выполните следующую команду в окне терминала:

adb shell pm verify-app-links --re-verify PACKAGE_NAME

Просмотреть результаты проверки

Подождите некоторое время, пока агент проверки выполнит свои запросы, и проверьте результаты проверки. Для этого выполните следующую команду:

adb shell pm get-app-links PACKAGE_NAME

Вывод этой команды аналогичен следующему:

com.example.pkg:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [***]
    Domain verification state:
      example.com: verified
      sub.example.com: legacy_failure
      example.net: verified
      example.org: 1026

Домены, успешно прошедшие проверку, имеют статус «verified» verified . Любое другое состояние означает, что проверка домена не может быть выполнена. В частности, статус none означает, что агент проверки, возможно, ещё не завершил процесс проверки.

В следующем списке показаны возможные возвращаемые значения, которые может вернуть проверка домена для заданного домена:

none
Для этого домена ничего не зарегистрировано. Подождите ещё несколько минут, пока агент проверки завершит обработку запросов, связанных с проверкой домена, а затем повторите процесс проверки .
verified
Домен успешно проверен для декларирующего приложения.
approved
Домен был одобрен принудительно, обычно путем выполнения команды оболочки.
denied
Доступ к домену был принудительно запрещен, обычно путем выполнения команды оболочки.
migrated
Система сохранила результат предыдущего процесса, который использовал устаревшую проверку домена.
restored
Домен был одобрен после того, как пользователь выполнил восстановление данных. Предполагается, что домен был ранее проверен.
legacy_failure
Домен был отклонен устаревшим верификатором. Точная причина отказа неизвестна.
system_configured
Домен был автоматически одобрен конфигурацией устройства.
Код ошибки 1024 или больше

Пользовательский код ошибки, относящийся к верификатору устройства.

Еще раз проверьте, установлено ли сетевое соединение , и снова запустите процесс проверки домена .

Попросите пользователя связать ваше приложение с доменом

Еще один способ получить одобрение вашего приложения для домена — попросить пользователя связать ваше приложение с этим доменом.

Проверьте, одобрено ли ваше приложение для домена.

Прежде чем запрашивать подтверждение у пользователя, проверьте, является ли ваше приложение обработчиком по умолчанию для доменов, указанных в элементах <intent-filter> . Вы можете запросить статус подтверждения одним из следующих способов:

  • API DomainVerificationManager (во время выполнения).
  • Программа командной строки (во время тестирования).

DomainVerificationManager

Следующий фрагмент кода демонстрирует, как использовать API DomainVerificationManager :

Котлин

val context: Context = TODO("Your activity or fragment's Context")
val manager = context.getSystemService(DomainVerificationManager::class.java)
val userState = manager.getDomainVerificationUserState(context.packageName)

// Domains that have passed Android App Links verification.
val verifiedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_VERIFIED }

// Domains that haven't passed Android App Links verification but that the user
// has associated with an app.
val selectedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_SELECTED }

// All other domains.
val unapprovedDomains = userState?.hostToStateMap
    ?.filterValues { it == DomainVerificationUserState.DOMAIN_STATE_NONE }

Ява

Context context = TODO("Your activity or fragment's Context");
DomainVerificationManager manager =
        context.getSystemService(DomainVerificationManager.class);
DomainVerificationUserState userState =
        manager.getDomainVerificationUserState(context.getPackageName());

Map<String, Integer> hostToStateMap = userState.getHostToStateMap();
List<String> verifiedDomains = new ArrayList<>();
List<String> selectedDomains = new ArrayList<>();
List<String> unapprovedDomains = new ArrayList<>();
for (String key : hostToStateMap.keySet()) {
    Integer stateValue = hostToStateMap.get(key);
    if (stateValue == DomainVerificationUserState.DOMAIN_STATE_VERIFIED) {
        // Domain has passed Android App Links verification.
        verifiedDomains.add(key);
    } else if (stateValue == DomainVerificationUserState.DOMAIN_STATE_SELECTED) {
        // Domain hasn't passed Android App Links verification, but the user has
        // associated it with an app.
        selectedDomains.add(key);
    } else {
        // All other domains.
        unapprovedDomains.add(key);
    }
}

Программа командной строки

При тестировании приложения в процессе разработки вы можете выполнить следующую команду, чтобы запросить состояние проверки доменов, которыми владеет ваша организация:

adb shell pm get-app-links --user cur PACKAGE_NAME

В следующем примере выходных данных, даже несмотря на то, что приложение не прошло проверку для домена «example.org», пользователь 0 вручную одобрил приложение в системных настройках, и никакой другой пакет не был проверен для этого домена.

com.example.pkg:
ID: ***
Signatures: [***]
Domain verification state:
  example.com: verified
  example.net: verified
  example.org: 1026
User 0:
  Verification link handling allowed: true
  Selection state:
    Enabled:
      example.org
    Disabled:
      example.com
      example.net

Вы также можете использовать команды оболочки для имитации процесса выбора пользователем приложения, связанного с заданным доменом. Полное описание этих команд доступно в выводе команды adb shell pm .

Предоставьте контекст для запроса

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

Сделайте запрос

После того, как пользователь поймет, что ваше приложение просит его сделать, выполните запрос. Для этого вызовите намерение, включающее действие ACTION_APP_OPEN_BY_DEFAULT_SETTINGS и строку данных package: com.example.pkg для целевого приложения, как показано в следующем фрагменте кода:

Котлин

val context: Context = TODO("Your activity or fragment's Context")
val intent = Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:${context.packageName}"))
context.startActivity(intent)

Ява

Context context = TODO("Your activity or fragment's Context");
Intent intent = new Intent(Settings.ACTION_APP_OPEN_BY_DEFAULT_SETTINGS,
    Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);

При вызове намерения пользователи видят экран настроек « Открыть по умолчанию ». Этот экран содержит переключатель « Открыть поддерживаемые ссылки» , как показано на рисунке 1.

Когда пользователь включает опцию «Открывать поддерживаемые ссылки» , в разделе « Ссылки для открытия в этом приложении» появляется набор флажков. Здесь пользователи могут выбрать домены, которые они хотят связать с вашим приложением. Они также могут выбрать опцию «Добавить ссылку» , чтобы добавить домены, как показано на рисунке 2. Когда пользователь впоследствии выбирает любую ссылку в добавленных доменах, эта ссылка автоматически открывается в вашем приложении.

Когда переключатель включен, раздел внизу включает флажки и кнопку «Добавить ссылку».
Рисунок 1. Экран настроек системы, на котором пользователи могут выбрать, какие ссылки будут открываться в вашем приложении по умолчанию.
Каждый флажок соответствует домену, который можно добавить. Кнопки диалогового окна — «Отмена» и «Добавить».
Рисунок 2. Диалоговое окно, в котором пользователи могут выбрать дополнительные домены для связи с вашим приложением.

Открытые домены в вашем приложении, которые ваше приложение не может проверить

Основная функция вашего приложения может заключаться в открытии ссылок от имени третьей стороны без возможности проверки доменов, на которых оно работает. В этом случае объясните пользователям, что при выборе веб-ссылки они не смогут выбрать между собственным приложением и вашим (сторонним) приложением. Пользователям необходимо вручную связать домены с вашим сторонним приложением.

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

Ссылки тестового приложения

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

Для проверки существующего файла выписок вы можете воспользоваться инструментом «Генератор и тестер списка выписок» .

Подтвердите список хостов для проверки

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

  • атрибут android:scheme со значением http или https
  • атрибут android:host с шаблоном URL-адреса домена
  • элемент действия android.intent.action.VIEW
  • элемент категории android.intent.category.BROWSABLE

Используйте этот список, чтобы проверить, что JSON-файл ссылок на цифровые активы предоставлен на каждом поименованном хосте и поддомене.

Подтвердите файлы ссылок на цифровые активы

Для каждого веб-сайта используйте API ссылок на цифровые активы, чтобы подтвердить, что файл JSON ссылок на цифровые активы правильно размещен и определен:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://domain.name:optional_port&
   relation=delegate_permission/common.handle_all_urls

В рамках процесса тестирования вы можете проверить текущие системные настройки обработки ссылок. Используйте следующую команду, чтобы получить список текущих политик обработки ссылок для всех приложений на подключенном устройстве:

adb shell dumpsys package domain-preferred-apps

Или следующее делает то же самое:

adb shell dumpsys package d

Примечание: Обязательно подождите не менее 20 секунд после установки приложения, чтобы система могла завершить процесс проверки.

Команда возвращает список всех пользователей или профилей, определенных на устройстве, которым предшествует заголовок в следующем формате:

App linkages for user 0:

После этого заголовка вывод использует следующий формат для перечисления настроек обработки ссылок для данного пользователя:

Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

В этом списке указано, какие приложения связаны с какими доменами для данного пользователя:

  • Package — идентифицирует приложение по имени его пакета, как указано в его манифесте.
  • Domains — показывает полный список хостов, веб-ссылки которых обрабатывает это приложение, используя пробелы в качестве разделителей.
  • Status — отображает текущие настройки обработки ссылок для этого приложения. Приложение, прошедшее проверку и манифест которого содержит android:autoVerify="true" , имеет статус always . Шестнадцатеричное число после этого статуса связано с системной записью Android о настройках связывания приложений пользователя. Это значение не указывает на успешность проверки.

Примечание: Если пользователь изменит настройки ссылки приложения до завершения проверки, вы можете увидеть ложное срабатывание при успешной проверке, даже если проверка не пройдена. Однако эта ошибка проверки не имеет значения, если пользователь явно разрешил приложению открывать поддерживаемые ссылки без запроса. Это связано с тем, что пользовательские настройки имеют приоритет над программной проверкой (или её отсутствием). В результате ссылка ведёт непосредственно в ваше приложение, без отображения диалогового окна, как если бы проверка прошла успешно.

Тестовый пример

Для успешной проверки ссылок на приложения система должна иметь возможность проверить ваше приложение на каждом из веб-сайтов, указанных в заданном фильтре намерений, который соответствует критериям ссылок на приложения. В следующем примере показана конфигурация манифеста с несколькими определёнными ссылками на приложения:

<application>

    <activity android:name=”MainActivity”>
        <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" />
            <data android:scheme="https" />
            <data android:host="www.example.com" />
            <data android:host="mobile.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
            <data android:host="www.example2.com" />
        </intent-filter>
    </activity>

    <activity android:name=”SecondActivity”>
        <intent-filter>
            <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" />
            <data android:host="account.example.com" />
        </intent-filter>
    </activity>

      <activity android:name=”ThirdActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="https" />
            <data android:host="map.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="market" />
            <data android:host="example.com" />
        </intent-filter>
      </activity>

</application>

Список хостов, которые платформа попытается проверить по приведенному выше манифесту:

www.example.com
mobile.example.com
www.example2.com
account.example.com

Список хостов, которые платформа не будет пытаться проверить по приведенному выше манифесту:

map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an "http" or "https" scheme)

Дополнительную информацию о списках утверждений см. в разделе Создание списка утверждений .

Исправить распространенные ошибки реализации

Если вам не удаётся проверить ссылки на приложения Android, проверьте наличие следующих распространённых ошибок. В этом разделе example.com используется в качестве заглушки доменного имени; при выполнении этих проверок замените example.com фактическим доменным именем вашего сервера.

Неправильная настройка фильтра намерений
Проверьте, не включили ли вы в элемент <intent-filter> URL-адрес, который не принадлежит вашему приложению.
Неправильная конфигурация сервера

Проверьте конфигурацию JSON вашего сервера и убедитесь, что значение SHA верно.

Также проверьте, что example.com. (с конечной точкой) предоставляет тот же контент, что и example.com .

Перенаправления на стороне сервера

Система не проверяет ссылки на приложения Android для вашего приложения, если вы настроили перенаправление следующим образом:

  • http://example.com на https://example.com
  • example.com на www.example.com

Такое поведение защищает безопасность вашего приложения.

Надежность сервера

Проверьте, может ли ваш сервер подключиться к вашим клиентским приложениям.

Непроверяемые ссылки

В целях тестирования вы можете намеренно добавлять непроверяемые ссылки. Имейте в виду, что на Android 11 и более ранних версиях такие ссылки приводят к тому, что система не проверяет все ссылки на приложения Android для вашего приложения.

Неправильная подпись в assetlinks.json

Убедитесь, что ваша подпись верна и совпадает с подписью, использованной для подписи вашего приложения. Распространенные ошибки:

  • Подписание приложения с помощью отладочного сертификата и наличие только подписи релиза в assetlinks.json .
  • Подпись в файле assetlinks.json должна быть написана строчными буквами.
  • Если вы используете функцию подписания приложений Google Play, убедитесь, что вы используете подпись, которую Google использует для каждого вашего релиза. Вы можете проверить эти данные, включая полный фрагмент JSON-кода, следуя инструкциям по объявлению связей с веб-сайтами .