• app唤起的完美解决方案,及阻止浏览器的默认弹窗行为


    https://stackoverflow.com/questions/10237031/how-to-open-a-native-ios-app-from-a-web-app
    var frame = document.createElement('iframe'); frame.src = 'myapp://?params=...'; frame.style.display = 'none'; document.body.appendChild(frame); setTimeout(function() { document.body.removeChild(frame); }, 4);

    以上这个方案在唤起app时,当唤起不成功的时候不会有浏览器的默认行为,如果用href跳转的化就会有浏览器的弹窗提示的行为了



    var preventDefault = function(e) {
    e = e || window.event;
    if(e.preventDefault) {
    e.preventDefault();
    }else{
    e.returnValue = false;
    }
    }
    preventDefault();

    以上的方法试过了,可以禁止手机上浏览器的弹窗的行为

     

    https://segmentfault.com/a/1190000011231042

    下面的方法没试过

    Ios/Android h5 唤起本地APP

       

    纠结两天(浏览器中唤起本地APP),一直找不到解决方案,今天总算基本搞定。

    ps:吐槽一下 魔窗那篇文章,为什么就不直接把js代码开源开源,混淆后的代码看得我好恼火

    参考文章:魔窗解决方案京东解决方案

    首先是判断浏览器

    // 判断浏览器
    var Navigator = navigator.userAgent;
    var ifChrome = Navigator.match(/Chrome/i) != null && Navigator.match(/Version/d+.d+(.d+)?sChrome//i) == null ? true : false;
    var ifAndroid = (Navigator.match(/(Android);?[s/]+([d.]+)?/)) ? true : false;
    var ifiPad = (Navigator.match(/(iPad).*OSs([d_]+)/)) ? true : false;
    var ifiPhone = (!ifiPad && Navigator.match(/(iPhonesOS)s([d_]+)/)) ? true : false;
    var ifIos = Navigator.match(/iPhone|iPad|iPd/i) ? true : false;
    var ifSafari = ifIos && Navigator.match(/Safari/);
    // ios 设备的版本号
    var iosVersion = Navigator.match(/OSs*(d+)/)
    iosVersion = iosVersion ? (iosVersion[1] || 0) : 0;
    // 安卓版本号
    var androidVersion = Navigator.match(/Androids*(d+)/)
    androidVersion = androidVersion ? (androidVersion[1] || 0) : 0;

    android5 及以上的高版本

    // 延后50毫秒
    setTimeout(function() {
        location.href = ‘自定义 URL’
    }, 50)

    ios9 及以上的版本

    setTimeout(function() {  // 必须要使用settimeout
        var a = document.createElement("a"); //创建a元素
        a.setAttribute("href", ‘自定义 URL’), a.style.display = "none", document.body.appendChild(a);
        var t = document.createEvent("HTMLEvents"); // 返回新创建的 Event 对象,具有指定的类型。
        t.initEvent("click", !1, !1) // 初始化新事件对象的属性
        a.dispatchEvent(t)  // 绑定事件
    }, 0)

    所有情况都用 iframe

    document.querySelector("#" + iframe).src = ‘自定义 URL’ // 将iframe增加src

    计算时差的方案打开APP

    var checkOpen = function (cb){
        var _clickTime = +(new Date());
        function check(elsTime) {
            if ( elsTime > 3000 || document.hidden || document.webkitHidden) {
                cb(1);
            } else {
                cb(0);
            }
        }
        //启动间隔20ms运行的定时器,并检测累计消耗时间是否超过3000ms,超过则结束
        var _count = 0, intHandle;
        intHandle = setInterval(function(){
            _count++;
            var elsTime = +(new Date()) - _clickTime;
            if (_count>=100 || elsTime > 3000 ) {
                clearInterval(intHandle);
                check(elsTime);
            }
        }, 20);
    }
    checkOpen(function(opened){
        // APP没有打开成功  并且开启自动跳转到下载页
        if(opened === 0 && option.autoRedirectToDownloadUrl){
            location.href = downloadUrl;
        }
    });
  • 相关阅读:
    jQuery使用工具集
    JQuery解决鼠标单双击冲突问题
    线程池
    配置文件application.properties参数详解
    SpringBoot整合SpringDataJPA
    获取数据库的自增主键(六)
    【使用篇二】邮箱自动化配置集成(18)
    Quartz自动化配置集成
    Cron表达式详解
    标准盒模型和怪异盒模型的区别
  • 原文地址:https://www.cnblogs.com/chaoyuehedy/p/9112478.html
Copyright © 2020-2023  润新知