ios motion orientation access 和 deviceorientation 失效的解决方案

目前苹果的 ios13.3.0 以上的系统(经过测试不是那么严谨有的相同的版本还有能用不能用的问题),对于deviceorientation 事件无法触发,需要权限才可以触发。
代码如下:

<!doctype html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no">
    <title>
      motion orientation access
    </title>
  </head>
  <body>
    <button onclick="testClick()">
      deviceorientation
    </button>
    <script type="text/javascript">
      // 判断是否是 ios 设备    
      function getIos() {
        var u = window.navigator.userAgent;
        return !! u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
      }

      function requestPermissionsIOS() {
        requestDeviceMotionIOS();
        requestDeviceOrientationIOS();
      }

      function requestDeviceMotionIOS() {
        
        if (typeof(DeviceMotionEvent).requestPermission === 'function') { 
          (DeviceMotionEvent).requestPermission().then(permissionState =>{

            if (permissionState === 'granted') {
              window.addEventListener('devicemotion', () =>{

              });
            }
          }).
          catch((err) =>{
            alert(JSON.stringify(err)) alert("用户未允许权限");
          })
        } else {
          // handle regular non iOS 13+ devices
        }
      }

      // requesting device orientation permission
      function requestDeviceOrientationIOS() {

        if (typeof(DeviceOrientationEvent).requestPermission === 'function') { (DeviceOrientationEvent).requestPermission().then(permissionState =>{
            if (permissionState === 'granted') {
              window.addEventListener('deviceorientation', () =>{

             });
            }
          }).
          catch((err) =>{
            alert(JSON.stringify(err)) alert("用户未允许权限");
          })
        } else {
          // handle regular non iOS 13+ devices
        }
      }
      function testClick() {
        requestPermissionsIOS();
      }
    </script>
  </body>

</html>

重点说明:

  1. 需要https的链接。
  2. 需要人为手动点击button按钮触发弹出授权弹窗,或者body onclick事件触发。目前测试 touchstart 是不行的。
  3. 微信打开的链接点击了取消,需要杀死微信,重新进去,刷新页面就可以再次弹出授权弹窗。清除缓存测试是不行的。无法弹出授权弹窗。
  4. safari 每次取消了需要清楚缓存才可以弹出。
  5. 只需要授权一次就可以了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 配置NSURLSession NSURLSessionConfiguration 用于配置NSURLSession...
    无心雨眸阅读 778评论 0 0
  • 笑红尘_陈淑桦_高音质在线试听_笑红尘歌词|歌曲下载_酷狗音乐 文/译垚 原创心情文字 原创 文/译垚(恋梦清锹...
    译垚阅读 984评论 12 13
  • 《悦读纪》 芳茉,两性情感类稿件,投稿邮箱:sunny19890205@126.com 崔悦,言情小说、散文美文,...
    秦缺阅读 5,189评论 2 42