瀏覽器打開本地文件,就是經過使用file協議css
hybrid優勢:html
hybrid缺點:前端
適用場景web
網上搜的微信部分的schema協議瀏覽器
weixin://dl/scan 掃一掃
<!--如下是演示,沒法正常運行,微信有嚴格的權限驗證,外部頁面不能隨意使用schema--> function invokeScan() { var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = 'weixin://dl/scan'; // iframe 訪問 schema var body = document.body || document.getElementByName('body')[0]; body.appendChild(iframe); setTimeout(function(){ body.removeChild(iframe); // 銷燬iframe iframe = null; }); } document.getElementById('btn').addEventListener('click', function(){ invokeScan(); // html調用schema協議 }) // 若是要加上參數和callback,那麼就要這麼寫 window['_weixin_scan_callback'] = function(result) { alert(result); } // ...省略... iframe.src = 'weixin://dl/scan?k1=v1&k2=v2&callback=_weixin_scan_callback'; // ...省略...
voke.js安全
(function (window, undefined) { // 封裝schema function _invoke(action, data, callback){ // 拼裝schema協議 var schema = 'myapp://utils/' + action; // 拼裝參數 schema += '?a=a'; for(key in data){ if(data.hasOwnProperty(key)){ schema += '&' + key + '=' + data[key]; } } // 拼裝callback callbackName = ''; if(typeof callback === 'string'){ callbackName = callback; } else { callbackName = action + Date.now(); window[callbackName] = callback; } schema += 'callback=callbackName'; // 觸發schema var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = schema; var body = document.body; body.appendChild(iframe); setTimeout(() => { body.removeChild(iframe); iframe = null; }); } window.invoke = { share: function (data, callback) { _invoke('share', data, callback); } } })(window);
index.html微信
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <button id="btn">分享</button> </body> <script src="voke.js"></script> <script> document.getElementById('btn').addEventListener('click',function(){ window.invoke.share({ titile:'111', content:'2222' }, function(res){ if (res.status){ alert('分享成功!'); } else { alert(res.message); } }); }); </script> </html>