Javascript Navigator.share仅在iOS中工作一次,第二次单击会抛出错误“;用户代理不允许请求…”;

Javascript Navigator.share仅在iOS中工作一次,第二次单击会抛出错误“;用户代理不允许请求…”;,javascript,ios,safari,web-share,Javascript,Ios,Safari,Web Share,还有其他人遇到过这个问题吗?我正在实现Web共享API,以便将共享按钮添加到页面上的多个列表中。代码一开始似乎运行良好,因为我可以单击任何“共享”按钮,对话框将正确显示 但是,如果我关闭该对话框并再次尝试单击它,我会收到一个错误消息:“用户代理或平台在当前上下文中不允许该请求,可能是因为用户拒绝了权限。” 更奇怪的是,关于如何实现Web共享API,我在所有这些教程网站上都遇到了相同的行为(例如:-在iOS Safari上多次尝试在页面中间单击“共享我!”按钮。) 以下是我的代码供参考: cons

还有其他人遇到过这个问题吗?我正在实现Web共享API,以便将共享按钮添加到页面上的多个列表中。代码一开始似乎运行良好,因为我可以单击任何“共享”按钮,对话框将正确显示

但是,如果我关闭该对话框并再次尝试单击它,我会收到一个错误消息:“用户代理或平台在当前上下文中不允许该请求,可能是因为用户拒绝了权限。”

更奇怪的是,关于如何实现Web共享API,我在所有这些教程网站上都遇到了相同的行为(例如:-在iOS Safari上多次尝试在页面中间单击“共享我!”按钮。)

以下是我的代码供参考:

const shareButtons = document.querySelectorAll('.share');

for (const button of shareButtons) {
    button.addEventListener("click", async () => {
        if (navigator.share) {
            try {
                await navigator.share({ 
                    url: button.getAttribute('data-url')
                });
            } catch (err) {
                  alert(err.message);
            }
        } else {
            // fallback
        }
    });
}

非常感谢我对这一点的了解-非常感谢

您使用的是哪个版本的IOS

看起来在IOS 14.0.1中有一个已知的bug,最初的承诺没有解决

文章(对我有效)中建议的修复方法是:

或者在您的情况下使用try/catch

const shareButtons = document.querySelectorAll('.share');

for (const button of shareButtons) {
    button.addEventListener("click", async () => {
        if (navigator.share) {
            try {
                await navigator.share({ 
                    url: button.getAttribute('data-url')
                });
            } catch (err) {
                  // this will catch the second share attempt on ios14
                  window.location.reload(true); // now share works again
                  alert(err.message);
            }
        } else {
            // fallback
        }
    });
}

缺点是,如果用户正在使用IOS14,实际上这意味着用户必须点击两次才能触发第二次共享-但其他用户不会发生这种情况

感谢所有关于这一点的答案,非常有用。我对它进行了研究,发现我使用的最佳解决方案是不使用async和Wait,而是在共享多次返回时使用承诺

root.navigator.share({ title, url })
  .then(() => {
    /*
     this will be hit even if the message is logged
     due to iOS being a bit rubbish ATM
    */
  })
  .catch((err) => {
    const { message = '' } = err || {};
    if (message.indexOf('user denied permission') !== -1) {
      console.log(message);
    }
  });

IOS 14.1中仍然存在漏洞。当我共享URL时,使用promise可以修复该漏洞,但在共享文件时则无法修复。
root.navigator.share({ title, url })
  .then(() => {
    /*
     this will be hit even if the message is logged
     due to iOS being a bit rubbish ATM
    */
  })
  .catch((err) => {
    const { message = '' } = err || {};
    if (message.indexOf('user denied permission') !== -1) {
      console.log(message);
    }
  });