網頁H5與原生APP之間的通訊


原生APP中嵌套H5網頁,並且兩者之間需要數據相互傳遞,以下為實現代碼:

 

        // 1.1 獲取瀏覽器設備信息


        function getBrowser() {

            var userAgent = navigator.userAgent;
            var version = navigator.appVersion;
            var language = (navigator.browserLanguage || navigator.language).toLowerCase();

            // 瀏覽器信息
            var browser = {
                trident: userAgent.indexOf("Trident") > -1,
                presto: userAgent.indexOf("Presto") > -1,
                webKit: userAgent.indexOf("AppleWebKit") > -1,
                gecko: userAgent.indexOf("Gecko") > -1 && userAgent.indexOf("KHTML") == -1,
                mobile: !!userAgent.match(/AppleWebKit.*Mobile.*/),
                ios: !!userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),
                android: userAgent.indexOf("Android") > -1 || userAgent.indexOf("Linux") > -1,
                iPhone: userAgent.indexOf("iPhone") > -1,
                iPad: userAgent.indexOf("iPad") > -1,
                webApp: userAgent.indexOf("Safari") == -1,
                language: language,
                version: version
            };

            return browser;
        };
        var browser = getBrowser();


        // 1.2 注冊WebViewJavascriptBridge


        function bridgeApp() {
            //注冊事件監聽,初始化
            function setupWebViewJavascriptBridge(callback) {
                if (window.WebViewJavascriptBridge) {
                    callback(WebViewJavascriptBridge);
                } else {
                    document.addEventListener(
                        "WebViewJavascriptBridgeReady",
                        function () {
                            callback(WebViewJavascriptBridge);
                        },
                        false
                    );
                }
            };
            //回調函數,接收java發送來的數據
            setupWebViewJavascriptBridge(function (bridge) {
                connectWebViewJavascriptBridge(function (bridge) {

                    // 接收APP傳過來的數據
                    // 注冊一個方法(方法名是“registerJSmethod”),客戶端進行調用(方法名也是“registerJSmethod”),responseCallback是回調函數
                    bridge.registerHandler('registerJSmethod', function (data, responseCallback) {
                        console.log("registerJSmethod:", data)
                        responseCallback(data)
                    });

                    // 向原生APP傳遞的數據
                    //客戶端已經注冊好一個名為“registerOCmethod”的方法,H5直接進行調用(方法名也為“registerOCmethod”)就行,調用的時候可以傳客戶端需要的參數
                    bridge.callHandler('registerOCmethod', { 'key': 'value' }, function responseCallback(responseData) {
                        console.log("registerOCmethod:", responseData)
                    });
                })
            });
        };
        bridgeApp();


        // 1.3 向移動APP傳遞數據

        function sendMsg(data) {

            if (browser.android) {// android類型
                if (!window.WebViewJavascriptBridge || !window.WebViewJavascriptBridge.send) {
                    return;
                }
                window.WebViewJavascriptBridge.send(JSON.stringify(data));
            } else if (browser.ios) {// ios類型
                var iframe = document.getElementById('iframe');
                var url = "myapp:" + JSON.stringify(data);
                if (!iframe) {
                    iframe = document.createElement("iframe");
                    iframe.src = url;
                    iframe.setAttribute('id', 'iframe');
                    iframe.style.display = 'none';
                    document.body.appendChild(iframe);
                } else {
                    iframe.src = url;
                };
            };
        };
  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM