现象: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
具体位置在下面的截图里面了:
然后根据文档所提示,通过用户点击事件来获取用户授权,就成功了,如图:
至于有开发者遇到拒绝后就不再提示授权的问题,目前还不知道怎么解决。