hybrid

来源:https://www.cnblogs.com/iceflorence/archive/2018/04/27/8961852.html
-Advertisement-
Play Games

一,hybrid是什麼,為何用hybrid? 二,hybrid更新和上線流程 三,hybrid和h5區別 四,前端js和客戶端如何通訊? 一,hybrid是什麼,為何用hybrid? 1,文字解釋 hybrid即“混合”,即前端和客戶端的混合開發 需前端開發人員和客戶端開發人員配合完成 某些環節也可 ...


  一,hybrid是什麼,為何用hybrid? 二,hybrid更新和上線流程 三,hybrid和h5區別 四,前端js和客戶端如何通訊?   一,hybrid是什麼,為何用hybrid? 1,文字解釋 hybrid即“混合”,即前端和客戶端的混合開發 需前端開發人員和客戶端開發人員配合完成 某些環節也可能涉及到server端   2,存在價值,為何用hybrid 可以快速迭代更新【關鍵】,無須app審核,(思考為何?,因為沒有許可權操作手機系統的API,不會有安全隱患) 體驗流暢(和NA的體驗基本類似)-肉眼區別不出來 減少開發和溝通成本,雙端公用一套代碼(ios和android)   3,webview 是app中的一個組件,app可以有webview,也可以沒有 用於載入H5頁面等,即一個小型的瀏覽器內核,是個統稱 例,瀏覽器中: 微信中:   4,file://協議 一開始做網頁,就已經使用file協議了,雙擊打開 只不過當初沒有協議,標準的概念 再次強調協議,標準的重要性!!!如前端的 w3c標準,promise標準等等啊 載入本地的資源   01,http協議和file協議區別: file協議:本地文件,快    file:// http/https協議:網路載入,慢  http://     5,hybrid實現流程 不是所有場景都適合hybrid: 使用NA:體驗要求極致,變化不頻繁(如頭條的首頁) 使用hybrid:體驗要求高,變化頻繁(如頭條的新聞詳情頁) 使用H5:體驗無要求,不常用(如舉報,反饋等頁面)   具體實現: 前端做好靜態頁面,(html,css,js)將文件交給客戶端 客戶端拿到前端靜態頁面,以文件形式存儲在app中 客戶端在一個webview中,使用file協議載入靜態頁面 具體流程圖:   遺留問題: app發佈之後,靜態文件如何實時更新? 靜態頁面如何獲取內容?   二,hybrid 更新上線流程 回顧hybrid實現流程 思考(目的,實現途徑)   serve端,可以隨時更新文件 更新流程 思考(目的,可行途徑): 要替換每個客戶端的靜態文件 只能客戶端來做 客戶端去server下載最新的靜態文件 維護server的靜態文件   完整流程: 分版本,有版本號,如201803211015 將靜態文件壓縮成zip包,上傳到服務端 客戶端每次啟動,都去服務端檢查版本號 如果服務端版本號大於客戶端版本號,就去下載最新的zip包 下載完之後解壓包,然後將現有文件覆蓋 要點1:服務端的版本和zip包維護 要點2:更新zip包之前,先對比版本號 要點3,zip包下載解壓和覆蓋      三,hybrid 和 H5 的比較: 1,優點: 體驗好,跟NA基本一致 可快速迭代,無需app審核(關鍵) 2,缺點: 開發成本高,連調,測試,查bug都比較麻煩 運維成本高,參考上面講的更新上線流程 3,適用的場景 hybrid:產品的穩定功能,體驗要求高,迭代頻繁,適用於產品型 h5:單次的運營活動(如XX紅包),或不常用功能,適用於運營型       四,前端和客戶端通訊   (微信公眾平臺:JS-SDk(微信公眾平臺封裝的,h5前端和客戶端的一個橋),下麵內容要深入一些) 1,回顧之前的問題 2,js和客戶端通訊的基本形式 3,schema協議簡介和使用(前端和客戶端通信的協議規定) 4,schema使用的封裝 5,內置上線   新聞詳情頁適用hybrid,前端如何獲取新聞內容? 不能用ajax獲取,第一,跨域,第二,速度慢 hybrid是客戶端獲取新聞內容(可以提前獲取),然後js通訊拿到內容,再渲染   js和客戶端通訊的基本形式 js訪問客戶端能力,傳遞參數和回調函數 客戶端通過回調函數返回內容   schema協議簡介和使用(前端和客戶端) 之前介紹了http/https和file協議 scheme協議——前端和客戶端通訊的約定  如   weixin:// (APP自己定的)  
// schema協議簡介和使用
// 以下是演示,無法正常運行,微信有嚴格的許可權驗證,外部頁面不能隨意使用schema
var iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = 'weixin://dl/scan'; //iframe訪問schema
var body = document.body || document.getElementsByTagName('body')[0];
body.appendChild(iframe);
setTimeout(function() {
    body.removeChild(iframe); //銷毀iframe
    iframe = null;
})

 加上參數和callback

// 如果要加上參數和callback,那麼就要這麼寫
window['_weixin_scan_callback'] = function(result) {
    alert(result);
}

// ..省略
iframe.src = 'weixin://dl/scan?k1=v1&k2=v2&callback=_weixin_scan_callback'
// ..省略

schema協議的封裝

新建invoke.js

(function(window) {
    // 跳用schema的封裝
    function _invoke(action, data, callback) {
        // 拼裝schema協議
        var schema = 'myapp://utils/' + action;

        // 拼接參數
        schema += '?a=a';
        var key;
        for (key in data) {
            if (data.hasOwnProperty(key)) {
                schema += '&' + key + data[key];
            }
        }

        // 處理callback
        var callbackName = '';
        if (typeof callback === 'string') {
            callbackName = callback;
        } else {
            callbackName = action + Date.now();
            window[callbackName] = callback;
        }
        schema += '&callback=' + callbackName;

        // 觸發
        var iframe = document.createElement('iframe');
        iframe.style.display = 'none';
        iframe.src = schema; //重要
        var body = document.body || document.getElementsByTagName('body')[0];
        body.appendChild(iframe);
        setTimeout(function() {
            body.removeChild(iframe); //銷毀iframe
            iframe = null;
        })
    }


    // 暴露到全局變數
    window.invoke = {
        share: function(data, callback) {
            _invoke('share', data, callback)

        },
        scan: function(data, callback) {
            _invoke('scan', data, callback)
        },
        login: function(data, callback) {
            _invoke('login', data, callback)
        },
    }
})(window)

 

schema.html
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>schema</title>
</head>

<body>
    <button id="btn1">掃一掃</button>
    <button id="btn2">分享</button>
    <script src="./invoke.js"></script>
    <script>
    document.getElementById('btn1').addEventListener('click', function() {
        window.invoke.scan({}, function() {})
    })

    document.getElementById('btn2').addEventListener('click', function() {
        window.invoke.share({
            title: 'xxx',
            content: 'yyy'
        }, function(result) {
            if (result.errno === 0) {
                alert('分享成功');
            } else {
                // 分享失敗
                alert(result.message);
            }
        })
    })
    </script>
</body>

</html>

 

內置上線

將以上封裝的代碼打包,invoke.js,內置到客戶端

客戶端每次啟動 webview,都預設執行 invoke.js

本地載入,免去網路載入的事件,更快

本地載入,沒有網路請求,黑客看不到 schema 協議,更安全

 

總結:前端如何和客戶端通訊

通訊的基本形式:調用能力,傳遞參數,監聽回調

對schema協議的理解和使用 (前端和客戶端通訊協議,可使用iframe)

調用 schema 代碼的封裝

內置上線的好處:更快,更安全

 

 

                                 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 做安卓開發時一定要註意,主線程不能更改UI界面,如果出現程式運行時崩潰的情況,如果沒有明顯的語法錯誤,請檢查自己的進程是否出現衝突,崩潰。如果有與後臺的連接,即請求向伺服器發送請求的時尤其需要註意,或出現沒有報錯,但就是網路請求這段代碼不會執行,這種情況下,如果設置的參數或者其他地方沒有什麼問題,但 ...
  • 前言: ​ 這是每天看github上面的一位大佬 "冴羽" [的博客 自己加以自己的理解總結的 是指程式源碼中定義變數的區域 作用域決定瞭如何查找變數,也就是度額定當前執行代碼對變數的訪問許可權 JavaScript 使用的是 (lexical scoping) 也就是靜態作用域 靜態作用域與動態作用 ...
  • 先上效果預覽: Web Components 首先,什麼是 Web Components ? "MDN" 給出的定義是: Web Components 是一套不同的技術,允許您創建可重用的定製元素(它們的功能封裝在您的代碼之外)並且在您的web應用中使用它們。 ... ... 實現web compo ...
  • 今天在寫html5中播放曠視C2攝像頭視頻監控的功能,查了很多資料,才發現Html5 <video>並不支持rtsp協議。後來查到使用第三方轉碼才得以實現。 這裡把方法寫下來分享給大家。 首先要獲取攝像機品牌的RTSP地址: 如大華的是 rtsp://user:pwd@ip:port/cam/ re ...
  • 前言 之前用餓了麽印象最深刻的是聯動菜單和小球飛入購物車動畫,所以想看看別人是怎麼實現的,但是看了很多仿餓了麽的demo都是實現了一個完整的大的項目,要找到那個小模塊很麻煩,所以自己將聯動菜單和動畫提取出來寫了一個demo,方便學習。 目的只是想突出功能所以界面細節很relax,大家也relax的看 ...
  • 測試jQuery模板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery Ajax</title> <!-- 引用線上jQuery文件 --> <script src="https://code.j ...
  • 還記得是去年的時候,查資料時偶然點進了一位名叫馬開東的大佬的博客,不禁為他的博客特效所吸引。正好當時在找模板,於是想著在註冊、登陸頁面用上這種特效。先是查看了一下網頁源碼把所有js,css鏈接點了一遍,弄下來試了一遍發現沒有用後,於是加了博客旁的一個qq群,但問了一下沒人理我,於是一氣之下退了群,關 ...
  • 上傳的文件大小大於2MB的解決方法 #預設apache 允許上大小2MB #技術經理-->修改apache預設配置 php.ini (授權) (1)複製 php.ini -> php1.ini (2)修改 php.ini (3)停止apache/重啟apache php.ini 生效 file_up ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...