Проверить ссылки приложений

Если в хотя бы одном из фильтров намерений вашего приложения присутствует 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:///.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 . Любое другое состояние указывает на то, что проверка домена не могла быть выполнена. В частности, состояние « none указывает на то, что агент проверки, возможно, еще не завершил процесс проверки.

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

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

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

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

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

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

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

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

  • API 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 }

Java

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)

Java

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. Диалоговое окно, в котором пользователи могут выбрать дополнительные домены для связи с вашим приложением.

Разрешите в своем приложении использовать домены, которые ваше приложение не может проверить.

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

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