以前支付宝发短信给你手机 ,然后你点开这个链接的时候会发现它自动的打开了支付宝软件 ,这个是如何做到的呢 ?
我认为实现的原理就是,这个链接通过浏览器打开,然后自动执行js方法,如果本地有支付宝软件,就去打开这个方法。。当然支付宝app也要做对应的处理了
1.app端的处理
其实这个主要的工作还是在链接js上的处理,app所要的操作就是很简单的,在Android中的intent-filter提供了对应的操作,
- <activity android:name=".H5CallActivity">
- <intent-filter>
- <action android:name="android.intent.action.VIEW" />
- <category android:name="android.intent.category.BROWSABLE" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:scheme="schemedemo"
- android:host="pszh.com"
- android:pathPrefix="/test/"
- />
- </intent-filter>
- </activity>
其中的scheme和hos,以及pathPrefix 和链接的必须是一致的,h5的链接格式必须是
- <a href="[scheme]://[host]/[path]?[query]"> 唤起应用 </a>
和上面的一一对应,scheme (唤起协议)和host(唤起指定host)是必须的有的,然后path(协议路径)和query(参数)可以没有
然后就是activity的处理了,
- Uri uri = getIntent().getData();
- StringBuilder sb = new StringBuilder();
- // 唤起链接
- sb.append("string : ").append(getIntent().getDataString()).append("\n");
- sb.append("scheme : ").append(uri.getScheme()).append("\n");
- sb.append("host : ").append(uri.getHost()).append("\n");
- sb.append("port : ").append(uri.getPort()).append("\n");
- sb.append("path : ").append(uri.getPath()).append("\n");
- // 接收唤起的参数
- sb.append("name : ").append(uri.getQueryParameter("name")).append("\n");
- sb.append("page : ").append(uri.getQueryParameter("page"));
- tv_url.setText(sb.toString());
2js的处理
对于js的应用代码呢也贴下吧,这个是通过点击 Start or DownLoad这个按钮来下载的
- <a id="call-app" href="javascript:;" > Start or Download </a><br/><br/>
- <script type="text/javascript">
- (function(){
- var ua = navigator.userAgent.toLowerCase();
- var t;
- var config = {
- /*scheme:必须*/
- scheme_IOS: 'schemedemo://',
- scheme_Adr: 'schemedemo://pszh.com/test/scheme?name=google&page=1',
- download_url: 'http://www.baidu.com',
- timeout: 600
- };
- function openclient() {
- var startTime = Date.now();
- var ifr = document.createElement('iframe');
- ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;
- ifr.style.display = 'none';
- document.body.appendChild(ifr);
- var t = setTimeout(function() {
- var endTime = Date.now();
- if (!startTime || endTime - startTime < config.timeout + 200) {
- window.location = config.download_url;
- } else {
- }
- }, config.timeout);
- window.onblur = function() {
- clearTimeout(t);
- }
- }
- window.addEventListener("DOMContentLoaded", function(){
- document.getElementById("call-app").addEventListener('click',
- openclient, false);
- }, false);
- })()
- </script>
如果你不想点击打开链接就直接OK了呢,(这个呢可以直接问会js的人了)。也可以用下面的代码了
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <title>h5跳原生</title>
- </head>
- <body></body>
- <script>
- (function(){
- var ua = navigator.userAgent.toLowerCase();
- var t;
- var config = {
- *scheme:必须*/
- scheme_IOS: 'schemedemo://',
- scheme_Adr: 'schemedemo://pszh.com/test/scheme?name=google&page=1',
- download_url: 'http://www.baidu.com',
- timeout: 600
- };
- function openclient() {
- var startTime = Date.now();
- var ifr = document.createElement('iframe');
- ifr.src = ua.indexOf('os') > 0 ? config.scheme_IOS : config.scheme_Adr;
- ifr.style.display = 'none';
- document.body.appendChild(ifr);
- var t = setTimeout(function() {
- var endTime = Date.now();
- if (!startTime || endTime - startTime < config.timeout + 200) {
- window.location = config.download_url;
- } else {
- }
- }, config.timeout);
- window.onblur = function() {
- clearTimeout(t);
- }
- }
- openclient();
- })()
- </script>
- </html>