IOS无法监测到摇一摇,并附解决方案【转载】

9915次阅读 414人点赞 作者: WuBin 发布时间: 2021-08-10 08:29:21
扫码到手机查看

基本思路

很久没搞摇一摇了, 上次还是IOS 11 的时候需要  https ,

没想到 IOS 13.3 又来玩大家一把。

代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script language="javascript" id="temp">document.write('<meta name="viewport" content="width=750, initial-scale='+window.screen.width/750+',user-scalable=no, target-densitydpi=device-dpi">');
console.logF("%c math.yang@heymeo.com ",'background: #000;color: #FFF');</script>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>    body{margin:0; background:#333; overflow:hidden;}.abs{position:absolute;}html {-webkit-tap-highlight-color:rgba(0,0,0,0);}.ipt{background-color:transparent; border-color:transparent;-webkit-appearance: none;outline: none;}</style>
<title>无标题文档</title>
</head>

<body>
<div id="log" class="abs" style="width:710px; left:20px; height:1000px; font-size:24px; line-height:34px; color:#FFF; font-family:Arial, Helvetica, sans-serif"></div>

<div id='fkIOS'  class="abs" style="display:none;">
    <div class="abs" style=" top:400px; left:150px; width:450px; height:220px; background-color:#FFF; text-align:center; color:#333; font-size:30px; border-radius:15px; padding-top:40px;font-family:Arial, Helvetica, sans-serif">
        摇一摇需要授权使用<br>请点击<strong>允许</strong>
        <br>
        <br>
        <div class="abs" type="button" style="width:210px; left:120px; color:#333; background:#E2E2E2; border-radius:10px; line-height:60px; height:60px;font-size:34px;font-family:Arial, Helvetica, sans-serif" onclick="ios13granted();">允许</div>
    </div>
    
</div>
</body>
</html>
<script src="zepto.min.js"></script>
<script>




//调试使用-------↓↓↓↓↓
var logCount=0
function logF(str)
{
    logCount++
    $("#log").append("<br>"+logCount+" "+str)
}
//调试使用-------↑↑↑↑↑




window.onload=function()
{
    addShakeEvent();
}

function addShakeEvent()
{    
    addCheckShake();

    logF("check system")
    //检查系统版本
    var ua = navigator.userAgent.toLowerCase();
    if(ua.indexOf("like mac os x") > 0)
    {
        logF("ios")
        var reg = /os [\d._]*/gi ;
        var verinfo = ua.match(reg) ;
        var version = (verinfo+"").replace(/[^0-9|_.]/ig,"").replace(/_/ig,".");
        if (Number(version)>=13.3) 
        {  
            //对13.3以后的版本处理,包括13.3,
            logF("IOS 13.3+")            
            DeviceMotionEvent.requestPermission()
            .then(permissionState => {                
                if (permissionState == 'granted') {
                     logF("已授权")
                     logF("可以摇一摇了0")
                     window.addEventListener('devicemotion', () => {});
                }
                else
                {
                    //denied
                     logF("历史授权已被拒绝过<br>后台退出APP再次进入即可弹出授权框<br>20200931测试微信\钉钉\微博'")
                }
            }).catch((err)=>
            {
                logF("弹出自定义提示框")
                $("#fkIOS").css("display","block")
            })  
        } 
        else
        {
            logF("IOS 13.2-")
            logF("可以摇一摇了1") ;          
        }
    }
    else
    {  
        logF("其他系统")
        logF("可以摇一摇了2")   
    }
}


function ios13granted() 
{
    //必须用户点击事件内触发,才能弹出授权框
    $("#fkIOS").css("display","none")
    
    logF("弹出IOS系统授权")
    if (typeof DeviceMotionEvent.requestPermission === 'function') 
    {
        DeviceMotionEvent.requestPermission().then((permissionState) => 
        {
            if (permissionState === 'granted') 
            {
                logF("授权成功")
                window.addEventListener('devicemotion', () => {});
                logF("可以摇一摇了3")
            }
            else
            {
                 logF("授权被拒绝<br>后台退出APP再次进入即可弹出授权框<br>20200931测试微信\钉钉\微博'")
            }
        }).catch((error) =>
        {
              logF("奇葩错误"+JSON.stringify(error))
        })
    } 
    else 
    {
        logF("!ios 2")
        logF("可以摇一摇了4")
    } 
}



function addCheckShake()
{
    var SHAKE_THRESHOLD = 4000;
    var last_update = 0;
    var x=0,y=0,z=0,last_x=0,last_y=0,last_z=0;
    
    function deviceMotionHandler(eventData) {
        var acceleration = eventData.accelerationIncludingGravity;
        var curTime = new Date().getTime();
        if ((curTime - last_update) > 60) {
            var diffTime = curTime - last_update;
            last_update = curTime;
            x = acceleration.x;
            y = acceleration.y;
            z = acceleration.z;
            var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
            //$("#debug").val(x.toFixed(2) +"    "+last_x.toFixed(2)+"     "+y.toFixed(2)+"     "+last_y.toFixed(2)+"     "+z.toFixed(2)+"     "+last_z.toFixed(2))
            if (speed > SHAKE_THRESHOLD) 
            {
                alert("你摇了")
            }
            last_x = x;
            last_y = y;
            last_z = z;
        }
    }    
    //
    window.addEventListener('devicemotion', deviceMotionHandler, false);      
}
</script>

需要在HTTPS环境下运行,本地无效。

案例在线地址:需要在手机上运行查看效果

附件下载

相关资料

点赞 支持一下 觉得不错?客官您就稍微鼓励一下吧!
关键词:devicemotion
推荐阅读
  • uniapp实现被浏览器唤起的功能

    当用户打开h5链接时候,点击打开app若用户在已经安装过app的情况下直接打开app,若未安装过跳到应用市场下载安装这个功能在实现上主要分为两种场景,从普通浏览器唤醒以及从微信唤醒。

    9152次阅读 592人点赞 发布时间: 2022-12-14 16:34:53 立即查看
  • Vue

    盘点Vue2和Vue3的10种组件通信方式

    Vue中组件通信方式有很多,其中Vue2和Vue3实现起来也会有很多差异;本文将通过选项式API组合式API以及setup三种不同实现方式全面介绍Vue2和Vue3的组件通信方式。

    3898次阅读 290人点赞 发布时间: 2022-08-19 09:40:16 立即查看
  • JS

    几个高级前端常用的API

    推荐4个前端开发中常用的高端API,分别是MutationObserver、IntersectionObserver、getComputedstyle、getBoundingClientRect、requ...

    14154次阅读 921人点赞 发布时间: 2021-11-11 09:39:54 立即查看
  • PHP

    【正则】一些常用的正则表达式总结

    在日常开发中,正则表达式是非常有用的,正则表达式在每个语言中都是可以使用的,他就跟JSON一样,是通用的。了解一些常用的正则表达式,能大大提高你的工作效率。

    12955次阅读 446人点赞 发布时间: 2021-10-09 15:58:58 立即查看
  • 【中文】免费可商用字体下载与考证

    65款免费、可商用、无任何限制中文字体打包下载,这些字体都是经过长期验证,经得住市场考验的,让您规避被无良厂商起诉的风险。

    11572次阅读 928人点赞 发布时间: 2021-07-05 15:28:45 立即查看
  • Vue

    Vue3开发一个v-loading的自定义指令

    在vue3中实现一个自定义的指令,有助于我们简化开发,简化复用,通过一个指令的调用即可实现一些可高度复用的交互。

    15698次阅读 1251人点赞 发布时间: 2021-07-02 15:58:35 立即查看
  • JS

    关于手机上滚动穿透问题的解决

    当页面出现浮层的时候,滑动浮层的内容,正常情况下预期应该是浮层下边的内容不会滚动;然而事实并非如此。在PC上使用css即可解决,但是在手机端,情况就变的比较复杂,就需要禁止触摸事件才可以。

    14857次阅读 1211人点赞 发布时间: 2021-05-31 09:25:50 立即查看
  • Vue

    Vue+html2canvas截图空白的问题

    在使用vue做信网单页专题时,有海报生成的功能,这里推荐2个插件:一个是html2canvas,构造好DOM然后转canvas进行截图;另外使用vue-canvas-poster(这个截止到2021年3月...

    29076次阅读 2282人点赞 发布时间: 2021-03-02 09:04:51 立即查看
  • Vue

    vue-router4过度动画无效解决方案

    在初次使用vue3+vue-router4时候,先后遇到了过度动画transition进入和退出分别无效的情况,搜遍百度没没找到合适解决方法,包括vue-route4有一些API都进行了变化,以前的一些操...

    25097次阅读 1933人点赞 发布时间: 2021-02-23 13:37:20 立即查看
交流 收藏 目录