Если хотя бы в одном из фильтров намерений вашего приложения присутствует 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» 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. Когда пользователь впоследствии выбирает любую ссылку в добавленных доменах, эта ссылка автоматически открывается в вашем приложении.
Открытые домены в вашем приложении, которые ваше приложение не может проверить
Основная функция вашего приложения может заключаться в открытии ссылок от имени третьей стороны без возможности проверки доменов, на которых оно работает. В этом случае объясните пользователям, что при выборе веб-ссылки они не смогут выбрать между собственным приложением и вашим (сторонним) приложением. Пользователям необходимо вручную связать домены с вашим сторонним приложением.
Кроме того, рассмотрите возможность внедрения диалогового окна или действия «батут», которое позволит пользователю открыть ссылку в основном приложении, если он этого захочет, выступая в качестве прокси-сервера. Перед настройкой такого диалогового окна или действия «батут» настройте приложение так, чтобы оно было доступно для просмотра в основных приложениях, соответствующих фильтру веб-намерений вашего приложения.