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

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

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

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

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