Как использовать WebShareAPI, которому предшествует вызов AJAX в Safari? - PullRequest
4 голосов
/ 08 мая 2019

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

Я добавил поддержку API веб-ресурса, сначала вызывая токен, прежде чем запускать navigator.share - по следующим направлениям:

fetchCallForLink()
  .then((url) => {
    navigator.share({
      title: 'Test Title',
      url,
    });

Это нормально работает на Chrome / Android, который поддерживает веб-ресурс.

Однако в Safari я получаю недопустимую ошибку.

The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission

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

Из-за количества читателей, которые у нас есть, и небольшого числа, которые фактически используют опцию общего доступа, было бы дорого делать вызов AJAX при любой загрузке страницы (по сравнению только тогда, когда пользователь выражает намерение делиться).

Поскольку в Chrome это работает нормально, я предполагаю, что в спецификации ничего не запрещает вызов AJAX перед запуском веб-ресурса.

Может ли это быть ошибкой в ​​реализации Safari? Или наоборот и на самом деле Chrome не должен позволять?

Пример: https://mkonikov.com/web-share-testing/ Я добавил переключатель, чтобы поделиться с или без выборки в первую очередь. Этот общий ресурс завершается ошибкой, только когда включена выборка. (Также стоит отметить, что при совместном использовании setTimeout превысит 1000 мс)


Обновление : я создал ошибку с командой веб-набора здесь: https://bugs.webkit.org/show_bug.cgi?id=197779.

...