【问题标题】:ios 13 DeviceOrientationEvent.requestPermission: how to force device to ask again for user permissionios 13 DeviceOrientationEvent.requestPermission:如何强制设备再次请求用户权限
【发布时间】:2019-09-24 16:35:17
【问题描述】:

在 iOS 13 中,Apple 引入了 API DeviceOrientationEvent.requestPermission。它必须在用户操作(单击、点击或等效操作)时触发。 我的问题是结果似乎被缓存了,所以如果用户拒绝权限,我不能再次请求访问(承诺会自动用缓存的值实现)。 有什么方法可以强制设备忘记缓存的值并再次请求用户访问方向数据的权限(我的意思是它应该再次显示用户可以允许或拒绝访问的弹出窗口)?

这是相关代码:

if (DeviceOrientationEvent && typeof(DeviceOrientationEvent.requestPermission) === "function") {
    const permissionState = await DeviceOrientationEvent.requestPermission();

    if (permissionState === "granted") {
        // Permission granted    
    } else {
        // Permission denied
    }
}

【问题讨论】:

    标签: javascript ios device-orientation


    【解决方案1】:

    我在 iOS 13 Safari 上看到了相同的行为。您需要删除需要许可的特定网站的网站数据。转到设置 > Safari > 高级 > 网站数据,查找网站并删除所有数据。 然后,当您请求许可时,提示应该会再次出现。

    【讨论】:

    • 它对我不起作用。网站应该在 https 上吗?
    • 我有带有一些端口的本地网络 IP,但它对我不起作用。我尝试请求权限,Safari 总是在 iPhone 上返回 denied
    • 是的,你需要在 https
    【解决方案2】:

    尝试简单地退出 Safari 并重新启动它。 提示将返回。

    【讨论】:

      【解决方案3】:

      您确定这是缓存问题吗?我无法在 iOS 13 中获得隐身 Safari 以响应“授予”权限。我立即收到“拒绝”回复 - 没有提示。

      我正在使用以下代码来测试结果,但它总是立即被“拒绝”而没有显示提示事件。 (https://codepen.io/ejarnutowski/pen/WNePqmM)

      <button onclick="testDeviceOrientation()">Test Device Orientation</button>
      
      function testDeviceOrientation() {
        if (typeof DeviceOrientationEvent !== 'function') {
          return setResult('DeviceOrientationEvent not detected')
        }
        if (typeof DeviceOrientationEvent.requestPermission !== 'function') {
          return setResult('DeviceOrientationEvent.requestPermission not detected')
        }
        DeviceOrientationEvent.requestPermission().then(function(result) {
          return setResult(result);
        });
      }
      
      function setResult(result) {
        document.getElementById('result').innerHTML = 'RESULT: ' + result;
      }
      

      看起来 drawmote.app 可以正常工作,但 JS 已编译,我需要一段时间才能对其逻辑进行逆向工程。

      【讨论】:

      • 是的,我已经在 Safari iOS 13 (iPhone 8) 上尝试过,它按预期工作(我可以授予或拒绝访问)。问题是一旦用户做出决定(授予或拒绝),我就无法再次要求不同的选择。
      • 明白了,谢谢。如果我看到任何有关缓存问题的信息,我会通知您。看来我的问题是我使用的是 codepen 并且权限 API 不喜欢在 iframe 中运行 - 有道理。
      • 我在 iOS 13.4.1 的 Safari 和 Chrome (v81.0.4044.124) 中对此进行了测试。在这两种情况下,我都会在按下按钮后立即被“拒绝”。
      • @LukeStevenson 你需要有 https,它总是在 localhost 上被“拒绝”:)
      猜你喜欢
      • 2015-01-11
      • 2012-10-06
      • 2020-07-20
      • 2017-07-06
      • 2018-01-05
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2017-09-13
      相关资源
      最近更新 更多