Если в хотя бы одном из фильтров намерений вашего приложения присутствует android:autoVerify="true" , установка приложения на устройство под управлением Android 6.0 (уровень API 23) или выше приводит к автоматической проверке системой хостов, связанных с URL-адресами в фильтрах намерений вашего приложения. На Android 12 и выше вы также можете запустить процесс проверки вручную, чтобы протестировать логику проверки.
Автоматическая проверка
Автоматическая проверка системы включает в себя следующее:
- Система проверяет все фильтры намерений, включающие любой из следующих типов данных:
- Действие:
android.intent.action.VIEW - Категории:
android.intent.category.BROWSABLEиandroid.intent.category.DEFAULT - Схема передачи данных:
httpилиhttps
- Действие:
- Для каждого уникального имени хоста, найденного в указанных выше фильтрах намерений, 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. Когда пользователи позже выберут любую ссылку в добавленных ими доменах, ссылка автоматически откроется в вашем приложении.
Разрешите в своем приложении использовать домены, которые ваше приложение не может проверить.
Основная функция вашего приложения может заключаться в открытии ссылок от имени стороннего сервиса, без возможности проверки обрабатываемых им доменов. В этом случае объясните пользователям, что при выборе веб-ссылки они не смогут выбрать между собственным приложением и вашим (сторонним) приложением. Пользователям необходимо будет вручную связать домены с вашим сторонним приложением.
Кроме того, рассмотрите возможность добавления диалогового окна или интерактивной активности, которая позволит пользователю открыть ссылку в собственном приложении, если он того пожелает, выступая в качестве прокси. Прежде чем настраивать такое диалоговое окно или интерактивную активность, настройте ваше приложение таким образом, чтобы оно имело доступ к пакетам собственных приложений, соответствующих веб-фильтру намерений вашего приложения.