在IOS中DeviceMotion及DeviceOrientation事件不触发的问题

现象:window.DeviceMotionEvent 是有定义的,但就是不触发 devicemotion 事件;

基本用法:

if (window.DeviceMotionEvent) {
    window.addEventListener('devicemotion', function () {
        var acceleration = event.accelerationIncludingGravity;
        var x = acceleration.x;
        var y = acceleration.y;
        var z = acceleration.z;
        // do your want to do
    }, false);
}

 

解决方案:使用 https 协议可搞定!

以上是2019年5月左右的问题。

——————————————————————————————————————

2020-07-20更新:

 

现在IOS13+以上的版本又失效了,查询一堆文档发现:需要申请权限!

也尝试了网上各位大神写的代码,即:直接通过以下方式:

DeviceMotionEvent.requestPermission().then(function (state) {
    if ('granted' === state) {
       window.addEventListener('devicemotion', function () {
           // do something
       }, false);
    } else {
        alert('apply permission state: ' + state);
    }
}).catch(function(err){
    alert('error: ' + err);
});

代码没有问题,但你会发现会报以下错(依然要在https协议下使用):

NotAllowedError: Requesting device orientation or motion access requires a user gesture to prompt

问题在于,这个事件必须由用户主动触发,具体文档可以在这儿看到:https://w3c.github.io/deviceorientation/#devicemotionevent

具体位置在下面的截图里面了:

在IOS中DeviceMotion及DeviceOrientation事件不触发的问题_第1张图片

然后根据文档所提示,通过用户点击事件来获取用户授权,就成功了,如图:

在IOS中DeviceMotion及DeviceOrientation事件不触发的问题_第2张图片

至于有开发者遇到拒绝后就不再提示授权的问题,目前还不知道怎么解决。

你可能感兴趣的:(Javascript)