【问题标题】:Navigator vibrate break the code on ios browsers导航器振动破解ios浏览器上的代码
【发布时间】:2019-11-17 11:27:02
【问题描述】:

我想在我的页面上使用navigator.vibrate

这是我的代码:

    var canVibrate = "vibrate" in navigator || "mozVibrate" in navigator;
    if (canVibrate && !("vibrate" in navigator))
    {
        navigator.vibrate = navigator.mozVibrate;
    }

    $(document).on('click', '.answer', function (eve) {
        $this = $(this);

        navigator.vibrate(222);

        // some other code ...

这适用于 Android 设备,但在 iOS 上(我在某些 iOS 设备上在 Firfox、Chrome 和 Safari 上进行了测试)代码将在这一行被破坏。

这是为什么呢?

【问题讨论】:

  • 从开发者的角度来看(试图建立一个很棒的网站),振动 api 没有暴露在 iOS 上使用似乎很荒谬;毕竟,它已经在其他浏览器中可用将近 8 年了。但是,从 Apple 的角度来看……想想所有糟糕的网站,它们会通过垃圾邮件振动破坏您的浏览体验。他们足够聪明,可以看到它会变成另一个流行世界末日。这就是为什么我们不能拥有美好的事物。
  • 我不同意。 API 可能需要用户交互才能成功调用该函数,并且可能有用户选项来控制它在设置中的工作方式。如果 Apple 没有在 iOS 中实现 API 的原因是因为它可能被滥用,那么这实际上是短视的,因为 API 可以为残疾用户启用额外的触觉反馈。可以提出合理的论点,即在 Safari/Webkit 中未实施违反了美国残疾人法案 (ADA)。
  • 我想知道什么样的代码可以让我们在 Android 上使用它,同时让其他一切都在 iOS 上运行而不会中断执行。有没有人测试过github.com/SomaticLabs/haptics.js
  • @isaacdre 那么为什么它没有破坏安卓用户的任何东西呢?这是那些有缺陷的逻辑之一。如果您非常害怕用户,请询问他们是否要允许特定站点的振动。如果他们不 - 阻止它。就这么简单
  • 关于 ADA CubicleSoft 的有趣点,我想知道他们是否从这个角度对其进行了审查。 @Andrew,我想澄清一下,我不为 Apple 工作/与 Apple 合作,我对他们的工作没有发言权。据我所知,Apple 有严格控制对其硬件的访问的历史,因此它的品牌,我预计这可能是不为 web iOS 启用触觉的原因。另一种理论是,Apple 不希望他们的手机在网络上振动,因为他们希望保持网络体验不如 iOS 应用程序复杂......这显然意味着他们可以控制流量和美元流量。

标签: javascript vibration


【解决方案1】:

我们不希望我们的应用在 iOS 设备上出现故障并无法使用。 但我们真的想在 Android 或任何可能的地方使用navigator.vibrate()。 您可以做的一件事是您可以在浏览器策略上创建自己的策略。问“我们可以让 iOS 设备忽略navigator.vibrate()”吗? 答案是“嗯,是的,您可以通过使用用户代理解析器来做到这一点。” (例如 Faisal Salman 的 UAParser 来检测用户的设备是 iOS 还是 Mac OS 设备。) 在您的代码中,将所有 navigator.vibrate() 调用包装在条件中,例如,

if(nameOfUsersOS != "iOS" && nameOfUsersOS != "Mac OS") { navigator.vibrate(); }

注意:您必须将nameOfUsersOS 替换为您自己的变量名。

注意:这只是一种可能的方法。苹果的决策者可以而且有时确实会改变主意。这意味着将来他们可以像最近允许 Web Speech API 一样允许良好的 Vibration API。您必须在 kotavy 的回答中使用该解决方案,除非您的政策类似于 “Apple 用户永远不会振动”

【讨论】:

    【解决方案2】:

    Quentin 是正确的,Apple 设备不支持 API。

    实际调用该方法时,给定的代码无法检查振动支持。为了避免振动功能被捕获未定义:

    const canVibrate = window.navigator.vibrate
    if (canVibrate) window.navigator.vibrate(100)
    

    【讨论】:

    • 漂亮而简单。这个答案肯定比我的好。但我很清楚,有些浏览器实际上可以欺骗开发人员。所以我们必须仔细检查。如果有人尝试并验证这一点,请写在这里告诉大家。如果它有效,那么这就是最终的答案。
    【解决方案3】:

    Apple 的移动网络浏览器只需 does not have support for it

    Firefox 和 iOS 版 Chrome 是 Safari 渲染引擎的包装器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多