Подтвердить что ты не робот

Приложение связывает фильтры намерений в assetlinks.json, не работающие на Android

Мое приложение определяет фильтры намерений для обработки URL с моего сайта, определенного как

<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:host="www.host.com" android:scheme="http"/>
</intent-filter>
<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:host="www.host.com" android:scheme="https"/>
</intent-filter>

Приложение правильно определяет URL-адрес нужного хоста, но запрашивает у пользователя, открывать ли его в приложении или браузере. Я пытался использовать проверку ссылок приложения, как указано здесь: https://developer.android.com/training/app-links/index.html

Как видно из журналов моего сервера, при установке приложения устройство запрашивает /well-known/assetlinks.json и отвечает со статусом 200. Тестирование файла цифровых активов с помощью

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://<domain1>:<port>&relation=delegate_permission/common.handle_all_urls

API, и он не нашел ошибок.

SHA256 в файле assetlinks.json был получен с использованием

keytool -list -v -keystore my-release-key.keystore 

тот же .keystore, из которого подписано приложение.

Запуск adb shell dumpsys package d возвращает, что статус проверки ссылки - "спросить", что означает, что проверка не удалась. Почему проверка может быть неудачной?

4b9b3361

Ответ 1

Для нас это был конец строки Windows!

Тестирование с использованием " https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://domain1:port&relation=delegate_permission/common.handle_all_urls " оказалось бесценным, поскольку оно дало нам "Не удалось разобрать" "Список операторов (недействительный JSON)" ошибка, которая привела нас к проблеме.

СОВЕТ: Было хорошо использовать кнопку "Сохранить файл" в Помощнике по ссылкам приложений Android Studio вместо копирования и вставки, как мы это делали - таким образом, он генерирует сам файл и гарантированно не будет иметь этой проблемы.

Ответ 2

Для меня это сводилось к проверке всех основ:

  • Подтвердите, что файл моих ресурсов хорош с помощью этого инструмента: (замените domain1: порт своим доменом) https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://domain1:port&relation=delegate_permission/common.handle_all_urls
  • Всегда проверяйте подписью APK
  • Убедитесь, что тестовое устройство работает под управлением Android 6.0 или более поздней версии (это тот, который меня бил, потому что я его забыл), в старых версиях Android вы всегда получаете приглашение пользователя)

Ответ 3

Есть несколько распространенных ошибок, которые вы должны проверить дважды (я не говорю, что вы сделали это неправильно. Это всего лишь контрольный список):

  • Убедитесь, что assetlinks.json является допустимым и хранимым из https://example.com/.well-known/assetlinks.json, чтобы сделать это для посещения https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site= https://example.com&relation=delegate_permission/common.handle_all_urls, ошибок не должно быть.
  • Если вы связываете сразу несколько доменов, убедитесь, что все домены настроены правильно, как на шаге 1.
  • Убедитесь, что те <intent-filters>, которые содержат ваши теги <data>, имеют атрибут android:autoVerify="true".
  • Убедитесь, что в теге <application> имеется требуемый тег <meta-data>:

    <meta-data
        android:name="asset_statements"
        android:resource="@string/asset_statements"/>
    

    Содержимое строки asset_statements должно быть:

    <string name="asset_statements" translatable="false">[{\"include\": \"https://example.com/.well-known/assetlinks.json\"}]
    
  • Используйте для отладки также сертификат подписи выпуска (не пугайтесь, вы не можете его случайно загрузить) используйте это в build.gradle:

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
        debug {
            debuggable true
            signingConfig signingConfigs.release
        }
    }
    

Ответ 4

Обновить

Поэтому я решил свою проблему. Не уверен, кто это сделал (возможно, это была комбинация), но вот что я сделал:

  • Деинсталлированные "Сервисы Google Play для мгновенных приложений". Ранее я работал с "мгновенными приложениями", поэтому подумал, что, возможно, некоторые старые конфигурации могут остаться, как имя пакета отладки, однако это маловероятно.
  • Прекращено использование прокси: Прокси полезны для отладки сетевых вызовов, но HTTP/2 может не полностью поддерживаться инструментами, которые я использую.
  • Удалить фильтр намерений для устаревших поддоменов: это большой. Один из моих поддоменов устарел и больше не доступен. В AndroidManifest, если у вас есть несколько имен хостов, объявленных для действия, которое содержит хотя бы один фильтр намерений autoVerify, каждый хост проверяется на наличие файла JSON Digital Asset Link. Если autoVerify завершается неудачей даже для одного из хостов, то ни один из хостов не проверяется автоматически.

оригинал

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

Как затронули OP и другие ответы, в целом вызов API для конечной точки:

digitalassetlinks.googleapis.com

должен быть успешным, чтобы обойти диалог выбора. Это веб-вызов, который выполняет система Android, для проверки JSON файла Digital Asset Link, и, похоже, он выполняется после установки/обновления приложения. Полезное место для поиска - Logcat, ищущий элементы с текстом "I/SingleHostAsyncVerifier:". Если вы видите "-> true" в конце журнала, ваше приложение

В последнее время, однако, эти вызовы были неудачными для меня из-за какой-то ошибки, которая могла появиться недавно. Устройство получает этот ответ от вызова API выше:

Ошибка: недоступно: неверный тип содержимого в заголовках ответа HTTP при извлечении операторов из {host}/. Широко известного /assetlinks.json (что эквивалентно '{host}/. Широко известному /assetlinks.json'): ожидается ' Content-Type: application/json ', но обнаружил text/html [11] при извлечении веб-операторов из {host}./. Well-known/assetlinks.json

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

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

https://digitalassetlinks.googleapis.com/google.digitalassetlinks.v1.AssetLinks/Check

Ответ 5

Для меня это был тот факт, что мой файл assetlinks.json был UTF-8 и содержал метку порядка байтов (BOM), которая представляет собой трехбайтовое магическое число в assetlinks.json файла, которое сигнализирует о кодировке для программы-потребителя., Спецификация является необязательной, и, очевидно, инструменты Google/Android не любят ее видеть. Когда он присутствовал, верификатор ссылок на цифровые активы Google (URL ниже) выдал мне ошибку "неправильно сформированный JSON".

Если вы используете Visual Studio, вот как определить, есть ли в вашем файле спецификация, и при необходимости удалите ее:

  1. Щелкните правой кнопкой мыши свой файл assetlinks.json.
  2. Выберите "Открыть с помощью..." из контекстного меню.
  3. Выберите "Двоичный редактор" в диалоговом окне "Открыть с помощью".
  4. Изучите файл байтов. Если файл начинается с EF BB BF, то проблема.
  5. Удалите эти символы (вы можете сделать это через любой столбец) и сохраните файл.
  6. Повторно загрузите файл и протестируйте его с помощью инструментов Google (URL-адреса приведены ниже), и он должен работать правильно.

Вот URL, который вы можете использовать для проверки вашего файла (замените example.com вашим реальным URL):

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls

Ответ 6

В моем случае adb shell dumpsys package d обнаружил, что packageName был неправильно настроен в assetlinks.json. Я использовал значение атрибута package моего тега manifest в AndroidManifest.xml, но я должен был использовать значение android.defaultConfig.packageId в моем файле build.gradle.

Ответ 7

Окно выбора системного приложения в двух случаях

1) Пользователь вносит изменения в настройки, связанные с открытыми ссылками, перейдя в настройки > apps > значок шестеренки > открывающие ссылки > выберите приложение > открыть поддерживаемые ссылки > выберите приглашение каждый раз.

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

Я думаю, что в вашем случае автоматическая проверка включена, поэтому, пожалуйста, проверьте настройки пользователя.

Ответ 8

Ваша проблема решена? Я столкнулся с той же проблемой.

Ответ 9

Для меня не изменяйте ничего из assetlinks.json, включая обрезку пробелов и разрывов строк.