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

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

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

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

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

    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() . Пользователь может выбрать свое предпочтительное приложение из списка соответствующих приложений, которые отображаются в диалоге.

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

Файл Digital Asset Links 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 Digital Asset Links для своего приложения на той же странице.

Следующий пример файла 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 App Links на тестовом устройстве. Для этого выполните следующую команду в окне терминала:

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

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

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

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

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 }

Ява

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 . Подпись должна быть в верхнем регистре.
  • Если вы используете Play App Signing, убедитесь, что вы используете подпись, которую Google использует для подписи каждого вашего релиза. Вы можете проверить эти данные, включая полный фрагмент JSON, следуя инструкциям по объявлению ассоциаций веб-сайтов .