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