Получение общих данных с помощью API-интерфейса Web Share Target.

Совместное использование на мобильных устройствах и настольных компьютерах упрощено с помощью API Web Share Target.

На мобильном или настольном устройстве поделиться должно быть так же просто, как нажать кнопку «Поделиться» , выбрать приложение и выбрать, с кем поделиться. Например, вы можете поделиться интересной статьей, отправив ее друзьям по электронной почте или опубликовав ее в Твиттере для всего мира.

Раньше только приложения, специфичные для конкретной платформы, могли регистрироваться в операционной системе и получать общие ресурсы от других установленных приложений. Но с помощью API-интерфейса Web Share Target установленные веб-приложения могут регистрироваться в базовой операционной системе в качестве цели общего доступа для получения общего контента.

Телефон Android с открытой панелью «Поделиться через».
Средство выбора общего доступа на системном уровне с установленным PWA в качестве опции.

Посмотрите цель общего доступа в Интернет в действии

  1. Используя Chrome 76 или более позднюю версию для Android или Chrome 89 или более позднюю версию для настольного компьютера, откройте демонстрацию Web Share Target .
  2. При появлении запроса нажмите «Установить» , чтобы добавить приложение на главный экран, или воспользуйтесь меню Chrome, чтобы добавить его на главный экран.
  3. Откройте любое приложение, поддерживающее общий доступ, или воспользуйтесь кнопкой «Поделиться» в демонстрационном приложении.
  4. В средстве выбора цели выберите «Тест веб-ресурса» .

После публикации вы должны увидеть всю общую информацию в целевом веб-приложении.

Зарегистрируйте свое приложение в качестве цели общего доступа

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

Обновите манифест вашего веб-приложения

Чтобы зарегистрировать свое приложение в качестве цели общего доступа, добавьте share_target в манифест его веб-приложения . Это указывает операционной системе включить ваше приложение в качестве опции в средство выбора намерений. То, что вы добавляете в манифест, определяет данные, которые будет принимать ваше приложение. Существует три распространенных сценария использования share_target :

  • Принятие основной информации
  • Принятие изменений приложения
  • Прием файлов

Принятие основной информации

Если ваше целевое приложение просто принимает базовую информацию, такую ​​как данные, ссылки и текст, добавьте в файл manifest.json следующее:

"share_target": {
  "action": "/share-target/",
  "method": "GET",
  "params": {
    "title": "title",
    "text": "text",
    "url": "url"
  }
}

Если в вашем приложении уже есть общая схема URL-адресов, вы можете заменить значения params существующими параметрами запроса. Например, если в вашей схеме URL-адреса общего доступа используется body вместо text , вы можете заменить "text": "text" на "text": "body" .

Значение method по умолчанию равно "GET" если оно не указано. Поле enctype , не показанное в этом примере, указывает тип кодировки данных. Для метода "GET" enctype по умолчанию имеет значение "application/x-www-form-urlencoded" и игнорируется, если для него установлено любое другое значение.

Принятие изменений приложения

Если общие данные каким-либо образом изменяют целевое приложение (например, при сохранении закладки в целевом приложении), установите значение method "POST" и включите поле enctype . В приведенном ниже примере создается закладка в целевом приложении, поэтому для method используется "POST" , а для enctype "multipart/form-data" :

{
  "name": "Bookmark",
  "share_target": {
    "action": "/bookmark",
    "method": "POST",
    "enctype": "multipart/form-data",
    "params": {
      "url": "link"
    }
  }
}

Прием файлов

Как и в случае с изменениями приложения, для принятия файлов требуется, чтобы method был "POST" и присутствовал enctype . Кроме того, enctype должен быть "multipart/form-data" и необходимо добавить запись files .

Вы также должны добавить массив files , определяющий типы файлов, которые принимает ваше приложение. Элементы массива представляют собой записи с двумя членами: полем name и полем accept . Поле accept принимает тип MIME, расширение файла или массив, содержащий и то, и другое. Лучше всего предоставить массив, включающий как MIME-тип, так и расширение файла, поскольку операционные системы различаются по своим предпочтениям.

{
  "name": "Aggregator",
  "share_target": {
    "action": "/cgi-bin/aggregate",
    "method": "POST",
    "enctype": "multipart/form-data",
    "params": {
      "title": "name",
      "text": "description",
      "url": "link",
      "files": [
        {
          "name": "records",
          "accept": ["text/csv", ".csv"]
        },
        {
          "name": "graphs",
          "accept": "image/svg+xml"
        }
      ]
    }
  }
}

Обрабатывать входящий контент

То, как вы поступите с входящими общими данными, зависит от вас и вашего приложения. Например:

  • Почтовый клиент может составить новое электронное письмо, используя title в качестве темы электронного письма, а text и url объединяются в тело.
  • Приложение социальной сети может создать черновик нового сообщения, игнорируя title , используя text в качестве тела сообщения и добавляя url в качестве ссылки. Если text отсутствует, приложение также может использовать url в теле сообщения. Если url отсутствует, приложение может сканировать text в поисках URL-адреса и добавить его в качестве ссылки.
  • Приложение для обмена фотографиями может создать новое слайд-шоу, используя title в качестве заголовка слайд-шоу, text в качестве описания и files в качестве изображений слайд-шоу.
  • Приложение для обмена текстовыми сообщениями может составить новое сообщение, используя text и url , объединенные вместе, и отбрасывая title .

Обработка общих ресурсов GET

Если пользователь выбирает ваше приложение и выбран method "GET" (по умолчанию), браузер открывает новое окно по URL-адресу action . Затем браузер генерирует строку запроса, используя значения в URL-кодировке, указанные в манифесте. Например, если приложение для обмена предоставляет title и text , строка запроса будет ?title=hello&text=world . Чтобы обработать это, используйте прослушиватель событий DOMContentLoaded на странице переднего плана и проанализируйте строку запроса:

window.addEventListener('DOMContentLoaded', () => {
  const parsedUrl = new URL(window.location);
  // searchParams.get() will properly handle decoding the values.
  console.log('Title shared: ' + parsedUrl.searchParams.get('title'));
  console.log('Text shared: ' + parsedUrl.searchParams.get('text'));
  console.log('URL shared: ' + parsedUrl.searchParams.get('url'));
});

Обязательно используйте сервис-воркера для предварительного кэширования страницы action , чтобы она загружалась быстро и надежно работала, даже если пользователь находится в автономном режиме. Workbox — это инструмент, который может помочь вам реализовать предварительное кэширование в вашем сервис-воркере.

Обработка общих ресурсов POST

Если ваш method"POST" , как если бы ваше целевое приложение принимало сохраненную закладку или общие файлы, тогда тело входящего запроса POST содержит данные, передаваемые приложением совместного доступа, закодированные с использованием значения enctype , указанного в манифесте. .

Страница переднего плана не может обрабатывать эти данные напрямую. Поскольку страница воспринимает данные как запрос, она передает их сервисному работнику, где вы можете перехватить их с помощью прослушивателя событий fetch . Отсюда вы можете передать данные обратно на страницу переднего плана с помощью postMessage() или передать их на сервер:

self.addEventListener('fetch', event => {
  const url = new URL(event.request.url);
  // If this is an incoming POST request for the
  // registered "action" URL, respond to it.
  if (event.request.method === 'POST' &&
      url.pathname === '/bookmark') {
    event.respondWith((async () => {
      const formData = await event.request.formData();
      const link = formData.get('link') || '';
      const responseUrl = await saveBookmark(link);
      return Response.redirect(responseUrl, 303);
    })());
  }
});

Проверка общего контента

Телефон Android, на котором отображается демонстрационное приложение с общим контентом.
Пример целевого приложения для совместного использования.

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

Например, в Android поле url будет пустым, поскольку оно не поддерживается в общей системе Android. Вместо этого URL-адреса часто появляются в text поле или иногда в поле title .

Поддержка браузера

API-интерфейс Web Share Target поддерживается, как описано ниже:

На всех платформах ваше веб-приложение должно быть установлено , прежде чем оно станет потенциальным объектом для получения общих данных.

Примеры приложений

Показать поддержку API

Планируете ли вы использовать API-интерфейс Web Share Target? Ваша публичная поддержка помогает команде Chromium расставлять приоритеты в функциях и показывает другим поставщикам браузеров, насколько важно их поддерживать.

Отправьте твит @ChromiumDev , используя хэштег #WebShareTarget , и сообщите нам, где и как вы его используете.