如何在 Safari 中使用 AJAX 调用之前的 WebShareAPI?

How to use WebShareAPI preceded by an AJAX call in Safari?

当用户点击我们付费专区网站上的分享按钮时,我们通过异步调用生成一个令牌,允许点击分享的人 link 绕过付费专区。

我添加了对 Web 共享的支持 API 在触发 navigator.share 之前首先调用令牌 - 沿着这些行:

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

这在支持 Web 共享的 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

(这只发生在第一次共享尝试时,因为我保存了对 window 的响应,因此在随后的点击中它避免了 AJAX 调用并且工作正常。)

由于我们拥有的读者数量和实际使用共享选项的人数很少,因此在每次页面加载时进行 AJAX 调用会很昂贵(相对于仅当用户表达意图时)分享)。

因为这在 Chrome 中工作正常,我假设规范中没有任何内容禁止在启动 Web 共享之前调用 AJAX。

这可能是 Safari 实现中的错误?或者反过来,实际上 Chrome 不应该允许?

示例:https://mkonikov.com/web-share-testing/ 我添加了一个切换开关来共享或不先获取。此共享仅在启用提取时失败。 (同样值得注意的是,分享将失败,setTimeout 超过 1000 毫秒)


更新:我在这里与 web-kit 团队创建了一个错误:https://bugs.webkit.org/show_bug.cgi?id=197779

更新 2:这是来自 W3C 的一些人的相关 Twitter 话题 https://twitter.com/marcosc/status/1167607222009884672

令人振奋的消息!在向 webkit 团队 here 提交错误后,这个问题得到了一些关注,并且正如错误讨论中所指出的,这个初始实现是经过深思熟虑的。值得庆幸的是,这个问题已经得到修复,最新的 Safari Technology Preview 发行说明包括这个令人兴奋的段落:

"Added support for a user gesture to allow using the Web Share API even when preceded by an XHR call" https://developer.apple.com/safari/technology-preview/release-notes/

期待它很快进入 Safari 的其余部分!