android&ios內(nèi)嵌H5頁面使用jsbridge實例

1、使用vue.js框架搭建前段項目頁面 在main.js中初始化 WebViewJavascriptBridge 對象,
WebViewJavascriptBridge 是app端定義的,在前端頁面中獲取 獲取過程需要等待 , 所以vue實例的創(chuàng)建要在
WebViewJavascriptBridge 獲取成功之后,因為我的vue入口頁面用到了jsbridge方法調(diào)用app端的數(shù)據(jù)獲取header信息,

然后把header信息放到我需要請求后臺數(shù)據(jù)接口里(接口有權(quán)限 需要登錄 h5頁面沒有登錄入口 只有從app端獲取header信息進(jìn)行身份驗證)
下面是在main.js中初始化 WebViewJavascriptBridge 對象 的代碼:

// android
function connectWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) {
        callback(WebViewJavascriptBridge)
    } else {
        document.addEventListener(
            'WebViewJavascriptBridgeReady'
            , function() {
                callback(WebViewJavascriptBridge)
            },
            false
        );
    }
}

connectWebViewJavascriptBridge(function(bridge) {
    initVueApp();

    bridge.init(function(message, responseCallback) {
        console.log('JS got a message', message);
        var data = {
            'Javascript Responds': '測試中文!'
        };
        console.log('JS responding with', data);
        responseCallback(data);
    });
});
// ios
function setupWebViewJavascriptBridge(callback) {
    if (window.WebViewJavascriptBridge) {
        return callback(WebViewJavascriptBridge);
    }
    if (window.WVJBCallbacks) {
        return window.WVJBCallbacks.push(callback);
    }
    window.WVJBCallbacks = [callback];
    var WVJBIframe = document.createElement('iframe');
    WVJBIframe.style.display = 'none';
    WVJBIframe.src = 'https://__bridge_loaded__';
    document.documentElement.appendChild(WVJBIframe);
    setTimeout(function () {
        document.documentElement.removeChild(WVJBIframe)
    }, 0)
}
setupWebViewJavascriptBridge(function (bridge) {
        initVueApp(); // vue 實例
});

// vue 實例

function initVueApp() {
    new Vue({
        el: '#app',
        router,
        store,
        components: {
            App
        },
        data () {
            return {
                listData: []
            };
        }
    }).$mount('#app');
}

2、然后創(chuàng)建一個js文件,里面定義調(diào)用app端數(shù)據(jù)的方法, 在需要使用的vue模板中import 這個js文件就行

jsbridge.js :

function requestBack () {
    // 請求返回
    return new Promise(function (resolve, reject) {
        window.WebViewJavascriptBridge.callHandler(
            'jsToNativeGoBack',
            {
                "code": 0,
                "msg": "",
                "data": {
                   "backType": 0 // 關(guān)閉
                }

            },
            function (responseData) {
            }
        );
    });
}

function getHeader () {
    // 獲取請求頭信息
    return new Promise(function (resolve, reject) {
        window.WebViewJavascriptBridge.callHandler(
            'jsToNativeGetHeader'
            , {'header': ''}
            , function (responseData) {
                let headerDate = JSON.parse(String(responseData));
                window.headers = headerDate.data;
                resolve(headerDate.data);
            }
        );
    });
}

在模塊中:

import jsBridge from 'common/js/jsbridge';
在vue鉤子函數(shù)中:
jsBridge.getExtra(JSON.stringify(self.toAppJson)).then(function (value) {
    let companyId = value.companyId;
    // 獲取header
    jsBridge.getHeader().then(function (value) {
        self.$http({
            url: '/approve/setting/flow/list?companyId=' + companyId,
            method: 'GET',
            headers: value
        }).then((res) => {
            if (res.body.code === 0) {
                self.$store.state.homeFlag = false;
                self.modules = res.body.data.list;
                self.SAVE_HOMETYPELISTS(res.body.data.list);
            } else {
                self.$store.state.homeFlag = true;
            }
        }, (res) => {
            self.$store.state.homeFlag = true;
        });
    });
});
methods: 

backToApp () {
    jsBridge.requestBack().then(function () {
        self.$store.state.stuffsFlag = true;
        self.$store.state.homeFlag = true;
    });
}

3、安卓物理返回鍵 頁面跳轉(zhuǎn)重定向

在Android 中監(jiān)測物理返回鍵點擊事件 點擊后通知h5頁面

在h5頁面中 給jsbridge 注冊一個事件

mounted () {
   // 安卓 控制全局物理返回鍵頁面跳轉(zhuǎn)
    WebViewJavascriptBridge.registerHandler("androidPhysicalBack", () => {
        this.backTo();
    });
},

backTo方法 是我頁面中左上角自定義返回路徑的方法:

methods: {
    backTo () {
        if (!this.go) {
           // this.$router.back 會觸發(fā)onpopstate
            this.$router.back();
        } else if (this.go === 'app') {
           this.$emit('backToApp');
        } else if (this.go === 'toHome') { 
            this.$emit('ifLeave');
        } else if(this.go === 'draftToList'){ 
            this.$emit('doBack');
        } else if (this.go === 'applyToHome') { 
           this.$emit('resetMyApplyStatus');
        } else if (this.go === 'approvalToHome') { 
            this.$emit('resetMyApprovalStatus');
        } else { 
            this.$router.replace(this.go);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,094評論 25 709
  • 我說青春是熱情而美麗的綻放 剎那間在那遙遠(yuǎn)的地方駐足 常想起那張笑臉 淹沒在過去的記憶里 不曾忘記年少的容顏 還有...
    田萍閱讀 269評論 1 3
  • GCD提供了功能強(qiáng)大的任務(wù)和隊列控制功能,相比于NSOperationQueue更加底層,因此如果不注意也會導(dǎo)致死...
    Chivalrous閱讀 1,069評論 0 0
  • 喜歡畫畫很久了,終于拿起筆開始學(xué)習(xí),無論基礎(chǔ)怎么樣,能開始,能堅持,這就是我對自己的要求與希冀。
    小薔薇呀閱讀 259評論 0 1
  • 陽光已模糊 因為淚水的緣故 嗓音已模糊 因為聲帶的緣故 面容已模糊 因為流年的緣故 視線已模糊 因為沉睡的緣故 字...
    Rachel1999閱讀 142評論 0 0

友情鏈接更多精彩內(nèi)容