zoukankan      html  css  js  c++  java
  • 【H5-移动端开发】外部唤起本机APP的解决方法

     太长时间没来博客园,原因很简单啊——太懒了!罪过罪过~


     最近公司的APP项目开始运行,采用的是原生框架+内嵌H5页面。作为一个菜鸡前端,开始入手学习移动端的界面制作加载性能优化。由于公司开始推广软件,加大引流量,运营部开发了软件短信提醒功能,其中需要在短信内放置软件的短链接,简单常见的一个小功能,而我要做的是提供一个短连接就可以了。

    分析了一下功能需求:.当用户通过短信内部点击短链接时,会自动唤起我们的APP。

    需要考虑:1.判断用户的设备类型。2.判断用户是否已经安装了此软件,安装了直接唤起,未安装安卓跳转到应用宝对应的下载页面,苹果跳转到APPStroe的下载页面。


    参考网上文档,首先写了一个demo来实现判断设备类型,并跳转到相关下载页。

    具体如下:

    <!DOCTYPE HTML>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>APP下载页面</title>
    </head>
    <body>
    <script type="text/javascript"> // 获取终端的相关信息 var Terminal = { // 辨别移动终端类型 platform : function(){ var u = navigator.userAgent, app = navigator.appVersion; return { // android终端或者uc浏览器 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, // 是否为iPhone或者QQHD浏览器 iPhone: u.indexOf('iPhone') > -1 , // 是否iPad iPad: u.indexOf('iPad') > -1 }; }(), // 辨别移动终端的语言:zh-cn、en-us、ko-kr、ja-jp... language : (navigator.browserLanguage || navigator.language).toLowerCase() } // 根据不同的终端,跳转到不同的地址 var theUrl; if(Terminal.platform.android){ theUrl = '应用宝对应的下载地址'; }else if(Terminal.platform.iPhone){ theUrl = 'APPStroe对应的软件下载页面'; }else if(Terminal.platform.iPad){ theUrl = 'APPStroe对应的软件下载页面';
    };
    location.href = theUrl;
    </script
    </
    body>
    </html>

    之把该页面放到服务器上,生成链接地址即可。此时的效果已经实现了一半,即点击链接会根据设备类型自动跳转下载页面。


    接下来我们将功能进一步的完善一下:点击短链接会先判断是否已经安装,未安装在执行以上步骤。

    我们采用的唤起方式是url scheme(iOS,Android平台都支持),Android和iOS 开发人员开发时可以实现在安装这款app到手机时,同时在手机上注册一个这个URL。只需原生APP开发时注册scheme, 那么用户点击到此类链接时,会自动跳到APP。

    iframe方案的唤起原理是: 程序切换到后台时,计时器会被推迟。如果app被唤醒那么网页必然就进入了后台,如果用户从app切回来,那么时间一般会超过2s;若app没有被唤起,那么网页不会进入后台,setTimeout基本准时触发,那么时间不会超过2s。

    具体实现代码如下:

    <!DOCTYPE html>
    <html>
    
        <head>
            <meta charset="UTF-8">
            <title></title>
        </head>
    
        <body>
    
            <div id="btn">
                <a onclick="submitFn"><button>打开app</button></a>
            </div>
    
            <script type=" text/javascript ">
                function submitFn() {
                    //判断浏览器
                    var u = navigator.userAgent;
                    if(/MicroMessenger/gi.test(u)) {
                            // 引导用户在浏览器中打开
                            alert('请在浏览器中打开');
                            return;
                        }
                        var d = new Date();
                        var t0 = d.getTime();
                        if(u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {
                            //Android 向安卓同事索要链接
                            if(openApp('en://startapp')) {
                                openApp('en://startapp');
                            } else {
                                //由于打开需要1~2秒,利用这个时间差来处理--打开app后,返回h5页面会出现页面变成app下载页面,影响用户体验
                                var delay = setInterval(function() {
                                    var d = new Date();
                                    var t1 = d.getTime();
                                    if(t1 - t0 < 3000 && t1 - t0 > 2000) {
                                        alert('检测到未安装,请下载APP');
                                        window.location.href = "app下载地址 ";
                                    }
                                    if(t1 - t0 >= 3000) {
                                        clearInterval(delay);
                                    }
                                }, 1000);
                            }
                        } else if(u.indexOf('iPhone') > -1) {
                            //IOS  向IOS同事索要
                            if(openApp('ios--scheme')) {
                                openApp('ios--scheme');
                            } else {
                                var delay = setInterval(function() {
                                    var d = new Date();
                                    var t1 = d.getTime();
                                    if(t1 - t0 < 3000 && t1 - t0 > 2000) {
                                        alert('检测到未安装,请下载APP');
                                        window.location.href = "app下载地址 ";
                                    }
                                    if(t1 - t0 >= 3000) {
                                        clearInterval(delay);
                                    }
                                }, 1000);
                            }
                        }
                    };
    
                    function openApp(src) {
                        // 通过iframe的方式试图打开APP,如果能正常打开,会直接切换到APP,并自动阻止a标签的默认行为
                        // 否则打开a标签的href链接
                        var ifr = document.createElement('iframe');
                        ifr.src = src;
                        ifr.style.display = 'none';
                        document.body.appendChild(ifr);
                        window.setTimeout(function() {
                            document.body.removeChild(ifr);
                        }, 2000);
                    }
            </script>
    
        </body>
    
    </html>

    然后再将页面放到服务器上面生成地址,之后百度一下,生成短链接就可以丢给运营部了~不过别忘了多机型多浏览器测试一下效果哦!

  • 相关阅读:
    centos6和centos7网卡修改
    centos7.4编译安装LNMP
    centos7yum安装LNMP
    jira搭建
    centos6.9编译安装LNMP
    监控命令命令
    linux设置命令历史的时间戳
    zabbix3.0安装
    Mysql(centos7) 主从搭建
    Android 利用剪切板(clipboardManager )实现数据传递
  • 原文地址:https://www.cnblogs.com/wq1994/p/8821388.html
Copyright © 2011-2022 走看看