从ios12.2开始(具体版本可能略有不同),ios限制了http地址的陀螺仪事件,必须是https,而我们的站点必须是https才能正常工作,所以貌似很多程序员都填坑了。当然,虽然我们每天如履薄冰,战战兢兢,但也改变不了线上某个功能突然出现bug的现象。于是有一天用户反映说iphonexr的微信工作摇晃后没有生效。确认https无误后,开始痛苦的在线调试,发现监听事件devicemotion没有生效,于是查资料显示最新版本的系统增加了陀螺仪功能。有限制,用户必须手动授权才能正常工作,拉取授权的事件是DeviceMotionEvent.requestPermission().then(response=>{if(response=="granted"){//同意}else{//rejectit}}).catch(()=>{//一般非用户主动授权})这里有几点需要注意:整个app生命周期授权只会拉一次,以后不会后面再次调用时会拉回来,使用之前的授权结果,关闭微信即可重新发起。如果是第一次授权,用户交互后必须拉取授权。因此,根据以上情况,我们的流程图大致如下:)==="function"){getPermission().then(()=>{resolve();}).catch((e)=>{//用户被拒绝if(e.type===1){//用户最后一个状态被拒绝,并提示弹窗}elseif(e.type===2){//用户第一次进入,获取权限失败,需要打开手动,弹出窗口引导//绑定事件$(modal).on('touchstart',()=>{getPermission().then(()=>{resolve();}).catch(()=>{//用户拒绝授权,提示});})}});}else{resolve();}})}functiongetPermission(){returnnewPromise((resolve,reject)=>{DeviceMotionEvent.requestPermission().then(response=>{if(response=="granted"){resolve();}else{reject({type:1});}}).catch(()=>{reject({type:2});})})}iosCheck().then(()=>{window.addEventListener('devicemotion',deviceMotionHandler,false);})当然如果更多谨慎一些的话,我们可以在iosCheck方法中增加当前版本的限制
