通过一个链接打开本地app,或者去下载app

以前支付宝发短信给你手机 ,然后你点开这个链接的时候会发现它自动的打开了支付宝软件   ,这个是如何做到的呢 ?

我认为实现的原理就是,这个链接通过浏览器打开,然后自动执行js方法,如果本地有支付宝软件,就去打开这个方法。。当然支付宝app也要做对应的处理了

1.app端的处理

其实这个主要的工作还是在链接js上的处理,app所要的操作就是很简单的,在Android中的intent-filter提供了对应的操作,

[html]  view plain  copy
  1. <activity android:name=".H5CallActivity">  
  2.             <intent-filter>  
  3.                 <action android:name="android.intent.action.VIEW" />  
  4.                 <category android:name="android.intent.category.BROWSABLE" />  
  5.                 <category android:name="android.intent.category.DEFAULT" />  
  6.                 <data android:scheme="schemedemo"  
  7.                       android:host="pszh.com"  
  8.                       android:pathPrefix="/test/"  
  9.                     />  
  10.             </intent-filter>  
  11.         </activity>  

其中的scheme和hos,以及pathPrefix 和链接的必须是一致的,h5的链接格式必须是

[html]  view plain  copy
  1. <a href="[scheme]://[host]/[path]?[query]"> 唤起应用 </a>  

和上面的一一对应,scheme (唤起协议)和host(唤起指定host)是必须的有的,然后path(协议路径)和query(参数)可以没有

然后就是activity的处理了,

[html]  view plain  copy
  1. Uri uri = getIntent().getData();  
  2.         StringBuilder sb = new StringBuilder();  
  3.         // 唤起链接  
  4.         sb.append("string : ").append(getIntent().getDataString()).append("\n");  
  5.         sb.append("scheme : ").append(uri.getScheme()).append("\n");  
  6.         sb.append("host : ").append(uri.getHost()).append("\n");  
  7.         sb.append("port : ").append(uri.getPort()).append("\n");  
  8.         sb.append("path : ").append(uri.getPath()).append("\n");  
  9.         // 接收唤起的参数  
  10.         sb.append("name : ").append(uri.getQueryParameter("name")).append("\n");  
  11.         sb.append("page : ").append(uri.getQueryParameter("page"));  
  12.   
  13.         tv_url.setText(sb.toString());  

2js的处理

对于js的应用代码呢也贴下吧,这个是通过点击 Start or DownLoad这个按钮来下载的

[html]  view plain  copy
  1. <a id="call-app" href="javascript:;" > Start or Download </a><br/><br/>  
  2.           
  3.           
  4.     <script type="text/javascript">  
  5.   
  6.             (function(){  
  7.   
  8.         var ua = navigator.userAgent.toLowerCase();  
  9.   
  10.         var t;  
  11.   
  12.         var config = {  
  13.   
  14.                 /*scheme:必须*/  
  15.   
  16.                 scheme_IOS: 'schemedemo://',  
  17.   
  18.                 scheme_Adr: 'schemedemo://pszh.com/test/scheme?name=google&page=1',  
  19.   
  20.                 download_url: 'http://www.baidu.com',  
  21.   
  22.                 timeout: 600  
  23.   
  24.         };  
  25.   
  26.   
  27.   
  28.         function openclient() {  
  29.   
  30.             var startTime = Date.now();  
  31.   
  32.   
  33.   
  34.             var ifr = document.createElement('iframe');  
  35.   
  36.   
  37.   
  38.             ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;  
  39.   
  40.             ifr.style.display = 'none';  
  41.   
  42.             document.body.appendChild(ifr);  
  43.   
  44.   
  45.   
  46.             var t = setTimeout(function() {  
  47.   
  48.                 var endTime = Date.now();  
  49.   
  50.   
  51.   
  52.                 if (!startTime || endTime - startTime < config.timeout + 200) {  
  53.   
  54.                     window.location = config.download_url;  
  55.   
  56.                 } else {  
  57.   
  58.   
  59.   
  60.                 }  
  61.   
  62.             }, config.timeout);  
  63.   
  64.   
  65.   
  66.             window.onblur = function() {  
  67.   
  68.                 clearTimeout(t);  
  69.   
  70.             }  
  71.   
  72.         }  
  73.   
  74.         window.addEventListener("DOMContentLoaded", function(){  
  75.   
  76.             document.getElementById("call-app").addEventListener('click',  
  77.   
  78.                     openclient, false);  
  79.   
  80.         }, false);  
  81.   
  82.     })()  
  83.     </script>  

如果你不想点击打开链接就直接OK了呢,(这个呢可以直接问会js的人了)。也可以用下面的代码了

[html]  view plain  copy
  1. <!DOCTYPE html>  
  2.    <html lang="en">  
  3.    <head>  
  4.    <title>h5跳原生</title>  
  5.    </head>  
  6.   
  7.    <body></body>  
  8.   
  9.    <script>  
  10.   
  11.    (function(){  
  12.   
  13.        var ua = navigator.userAgent.toLowerCase();  
  14.   
  15.        var t;  
  16.   
  17.        var config = {  
  18.   
  19. *scheme:必须*/  
  20.   
  21.                scheme_IOS: 'schemedemo://',  
  22.   
  23.                scheme_Adr: 'schemedemo://pszh.com/test/scheme?name=google&page=1',  
  24.   
  25.                download_url: 'http://www.baidu.com',  
  26.   
  27.                timeout: 600  
  28.   
  29.        };  
  30.   
  31.   
  32.   
  33.        function openclient() {  
  34.   
  35.            var startTime = Date.now();  
  36.   
  37.   
  38.   
  39.            var ifr = document.createElement('iframe');  
  40.   
  41.   
  42.   
  43.            ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;  
  44.   
  45.            ifr.style.display = 'none';  
  46.   
  47.            document.body.appendChild(ifr);  
  48.   
  49.   
  50.   
  51.            var t = setTimeout(function() {  
  52.   
  53.                var endTime = Date.now();  
  54.   
  55.   
  56.   
  57.                if (!startTime || endTime - startTime < config.timeout + 200) {  
  58.   
  59.                    window.location = config.download_url;  
  60.   
  61.                } else {  
  62.   
  63.   
  64.   
  65.                }  
  66.   
  67.            }, config.timeout);  
  68.   
  69.   
  70.   
  71.            window.onblur = function() {  
  72.   
  73.                clearTimeout(t);  
  74.   
  75.            }  
  76.   
  77.        }  
  78.   
  79.        openclient();  
  80.   
  81.    })()  
  82.    </script>  
  83.   
  84.    </html>  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值