【问题标题】:Web Share API permission missing缺少 Web 共享 API 权限
【发布时间】:2019-05-10 23:02:37
【问题描述】:

我正在尝试在我的测试网络应用程序上实现 Web Share Api 功能,但我似乎无法做到。这是代码:

const newVariable: any = navigator;
{newVariable && newVariable.share && <IconButton aria-label="Share" onClick={async (e) => {
try {
  const id = await shareRepository.shareTrip(this.props.todolist)
  const url = "https://something.com/share/" + id
  await newVariable.share({
      title: 'Check my todolist for ' + this.props.todolist.trip.departure + ' - ' + this.props.todolist.trip.arrival,
      text: 'Check my todolist for ' + this.props.todolist.trip.departure + ' - ' + this.props.todolist.trip.arrival,
      url: url,
  })
} catch (error) {
  alert(error)
}
}}>
<ShareIcon />
</IconButton>}

每次我在 Firefox 和 iOS 版 Safari 上尝试时,都会收到一条错误消息:

NotAllowedError:当前上下文中用户代理或平台不允许该请求,可能是因为用户拒绝了权限。

如果在这些浏览器上我尝试从 google.com 共享某些内容,我会得到本机对话框来选择要与哪个应用共享。

我不明白为什么。此页面上没有关于权限的讨论:https://developers.google.com/web/updates/2016/09/navigator-share

更新:

在 Chrome for android 上运行正常,在 Firefox for Android 上不起作用。在 Chrome、Firefox 和 Safari 上(我相信它们都使用了 safari 引擎这三个)只有在我通过 "" 这意味着页面本身或 "https://something.com/share/" 时才会工作,如果我通过 "https://something.com/share/"+id 就会中断:/

【问题讨论】:

  • 在搜索时,我遇到了关于网络共享功能的非常简单的演示:mkonikov.com/web-share-testing,它适用于我的 Chrome@Android。你能在你得到 NotAllowedError 的浏览器上检查一下吗?
  • 如果我用''更改我的网址,即使我的代码也有效。但我不明白我的网址有什么问题
  • 它是否与托管代码的域匹配?
  • @skyboyer 我写了一个更新,基本上:在 Chrome for android 上工作正常,在 Firefox for Android 上不起作用。在 Chrome、Firefox 和 Safari 上(我相信它们都使用 safari 引擎这三个)只有在我通过 "" 时才有效,这意味着页面本身,或者 "https://something.com/share/",如果我通过 "https://something.com/share/"+id :/
  • 这是一个 Safari 错误:stackoverflow.com/questions/56046434/…

标签: javascript


【解决方案1】:

对于当前答案过于特定于该代码的其他未来用户。根本问题是必须从用户手势调用share() 方法。

如果方法调用不是由用户激活触发的,则返回一个带有“NotAllowedError”DOMException 的 promise 被拒绝。 From the Web Share API.


用户激活是以下任何一种:

  • 改变
  • 点击
  • 上下文菜单
  • dblclick
  • 鼠标移动
  • 指针
  • 重置
  • 提交
  • 触摸结束

【讨论】:

  • 只是补充一点,我正在使用 click 事件来更新我的 share package 中的 vue 监视变量,它在测试期间有效,但在通过 npm 使用包后它没有。我切换到直接在组件上调用该方法并且它起作用了。
【解决方案2】:

我明白是什么问题,这绝对是烦人的。

所以:

  const id = await shareRepository.shareTrip(this.props.todolist)

此调用是导致问题的调用。如果我评论它,在 iOS 上没有问题。

如果我保留它,我在 Android 上完全没有问题,但 iOS 会抱怨。

所以我需要重新考虑应用程序的流程,以便从 'onClick' 事件之外传递 id。

【讨论】:

  • 啊哈!因此,由于它使share() 在单独的microtask 中运行,因此对于浏览器而言,它不是通过单击启动的!所以它看起来像浏览器的安全违规。有道理!
  • 是的。但我没有看到任何其他方式来获取需要共享信息的数据:/
  • 有很多替代方案可以提前获取吗?作为一种解决方法,您可以先单击检索数据 + 显示附加弹出窗口,以便用户需要单击它(然后 share() 不需要异步操作,浏览器会很好)
  • 无论如何。我不明白为什么 Android 版 Chrome 没有抱怨
  • 也许他们对此没有那么严格的检查
猜你喜欢
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
  • 2016-05-07
  • 2021-08-04
相关资源
最近更新 更多