当用户单击我们付费墙站点上的“共享”按钮时,我们通过异步调用生成 token ,该 token 允许点击共享链接的人绕过付费墙。

我添加了对Web Share API的支持,首先触发 token ,然后再触发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
(这只发生在第一次共享尝试时,因为我将响应保存到窗口中,因此,在随后的单击中,它避免了AJAX调用,并且工作正常。)

由于我们拥有的阅读器数量少且实际使用共享选项的数量很少,因此要对AJAX进行一次永远的页面加载(相对于仅当用户表示要共享时)才进行调用会很昂贵。

由于在Chrome中可以正常运行,因此我认为规范中没有任何内容禁止在启动Web Share之前进行AJAX调用。

这可能是Safari实现中的错误吗?还是相反,实际上Chrome不应该允许?

示例:https://mkonikov.com/web-share-testing/
我添加了一个切换,可以先共享或不共享。仅当启用获取时,此共享才会失败。 (还值得注意的是,共享将失败,并且setTimeout超过1000ms)

更新:我已经在这里的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版本注释包括以下令人兴奋的段落:



期待它很快就会出现在Safari的其余部分中!

09-30 17:42
查看更多