Включить целевой веб-ресурс в доверенной веб-активности

Функция Web Share Target позволяет PWA получать контент, которым делятся другие приложения, установленные на устройстве. Эта функция может использоваться, например, приложениями, такими как графические редакторы, для получения изображения из приложения камеры, или социальными сетями для получения изображения или видео для обмена.

Начиная с Chrome 86, функция Web Share Target теперь доступна и для приложений, использующих Trusted Web Activity . Хотя PWA должна работать сразу после установки, для её запуска потребуется внести несколько изменений в Android-приложение.

В данной статье предполагается, что разработчик знаком с технологией Trusted Web Activities. Читатели, незнакомые с этой технологией, могут начать работу с руководством по интеграции .

Аналогичным образом, полное объяснение реализации Web Share Target в PWA выходит за рамки данной статьи, и разработчики могут найти дополнительную информацию в этой статье .

В качестве PWA для этой статьи будет использоваться демонстрационное приложение по адресу https://scrapbook-pwa.web.app/ , его исходный код доступен на GitHub , а приложение для Android основано на базовой демонстрационной версии Trusted Web Activity .

Добавить целевой объект для веб-публикации в приложение для Android

Для модификации существующего приложения, использующего Trusted Web Activity, с целью реализации Web Share Target, необходимы изменения в трех различных файлах:

build.gradle

Библиотека android-browser-helper обновлена ​​и теперь поддерживает Web Share Target. В качестве первого шага обновите приложение до версии 2.0.1 или выше.

dependencies {
    ...
    implementation 'com.google.androidbrowserhelper:androidbrowserhelper:2.2.0'
}

res/strings.xml

Приложение должно сообщить доверенному веб-серверу (Trusted Web Activity) подробности поддерживаемого обмена данными, такие как URL-адреса для открытия, используемый метод и поддерживаемые MIME-типы.

Это делается с помощью JSON, предоставляемого доверенному веб-активному объекту через строковый ресурс. Поля идентичны полю share_target доступному в веб-манифесте, и могут быть добавлены в строку внутри strings.xml практически без изменений, с двумя важными замечаниями:

  1. Значение атрибута action должно представлять собой полный URL-адрес, включая источник.
  2. Двойные кавычки необходимо экранировать, поэтому каждая " становится \" .

Вот как выглядит раздел share_target в файле https://googlechrome.github.io/samples/scrapbook-pwa/manifest.json :

{
  ...
  "share_target": {
    "action": "/_share-target",
    "enctype": "multipart/form-data",
    "method": "POST",
    "params": {
      "files": [{
        "name": "media",
        "accept": [
          "audio/*",
          "image/*",
          "video/*"
        ]
      }]
    }
  },
  ...
}

Новый строковый элемент будет выглядеть следующим образом:

<string name="share_target">
{
    \"action\": \"https://twa-web-scrapbook.web.app/_share-target\",
    \"method\": \"POST\",
    \"enctype\": \"multipart/form-data\",
    \"params\": {
      \"files\": [{
          \"name\": \"media\",
          \"accept\": [\"image/*\", \"audio/*\", \"video/*\"]
      }]
    }
}
</string>

AndroidManifest.xml

В Android Manifest необходимо внести несколько изменений. Во-первых, нужно убедиться, что DelegationService объявлен, экспортирован и включен.

Разработчики, создавшие свои приложения на основе базовой демонстрационной версии, уже будут иметь подключенный сервис, и разметка должна находиться внутри тега `<application>` и выглядеть следующим образом:

<service
    android:name="com.google.androidbrowserhelper.trusted.DelegationService"
    android:enabled="true"
    android:exported="true">

    <intent-filter>
        <action android:name="android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE"/>
        <category android:name="android.intent.category.DEFAULT"/>
    </intent-filter>
</service>

Наконец, в тег активности LauncherActivity необходимо добавить два новых элемента: - Тег meta-data , ссылающийся на JSON, определенный в strings.xml. - intent-filter который определяет, какие MIME-типы приложение может обрабатывать для других приложений на устройстве.

<meta-data
    android:name="android.support.customtabs.trusted.METADATA_SHARE_TARGET"
    android:resource="@string/share_target"/>

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="video/*" />
</intent-filter>

Как видно из приведенной выше разметки, для каждого mime-type указанного в JSON-файле share_target , следует добавить элемент data .

Заключение

Интеграция Web Share Target позволяет более тесно интегрировать PWA, находящиеся в рамках доверенной веб-активности, с другими приложениями, установленными на устройстве Android.

Как описано в шагах выше, дополнительная разметка, необходимая для добавления поддержки API в существующее приложение Android, использующее Trusted Web Activity, упрощается благодаря android-browser-helper.

Ознакомьтесь со статьей о Web Share Target , чтобы узнать больше об использовании API в PWA, и с Web Share API , чтобы узнать, как делиться контентом из прогрессивного веб-приложения.

Поиск неисправностей

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

Если приложение не отображается в списке вариантов, это означает, что intent-filter указан неверно. Дважды проверьте разметку intent-filter , убедитесь, что она содержит правильные действия, категорию и mime-types обрабатываемые приложением.

В моём приложении в качестве опции отображается запуск PWA, но данные не передаются.

Причин этому может быть несколько. Вот список того, на что следует обратить внимание:

  • Убедитесь, что проверка ссылок на цифровые активы прошла успешно.
  • Проверьте корректность JSON-данных в файле strings.xml.