/*
注意:源生app需要配置jsbridge的環境,而在前端頁面中需要下方封裝代碼,既可以達到調用app方法的功能和注冊供app調用的方法
1、注冊方法:注冊后,供app調用,注冊時,同名函數,下一個會覆蓋上一個
2、調用函數,可以調用多次
3、使用時,只需要導入即可 如:import {setbridge, getbridge} from 'jsbridge'
4、使用方式:
調用app方法: getbridge(functionName,data,callback) 第一個參數是app的函數名字;
第2個參數是要傳遞給app方法的數據,數據類型不限(具體要看app接收什么類型的數據,如:json,string,number等)
第3個參數是一個函數,函數內隱含回調數據data,調用例子如下:
getbridge('closePage','關閉頁面',(data) => {
// 'app返回過來的數據:'+data
})
注冊方法,供app使用:
setbridge(functionName,data,callback) 調用方式類似於上方說明
第一個參數:函數名字,可以自定義
第2個參數,app調用該方法是,需要給app傳遞的數據
第3個參數,回調函數,默認函數有一個數據data參數,得到的是app返回給前台js的數據
*/
function setupWebViewJavascriptBridge(callback) {
if (/android/.test(navigator.userAgent.toLowerCase())) {
if (window.WebViewJavascriptBridge) {
callback(window.WebViewJavascriptBridge);
} else {
document.addEventListener(
'WebViewJavascriptBridgeReady',
function() {
callback(window.WebViewJavascriptBridge);
},
false
);
}
} else if (/ios|iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase())) {
if (window.WebViewJavascriptBridge) {
return callback(window.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);
}, 100);
}
}
setupWebViewJavascriptBridge(function(bridge) {
if (/android/.test(navigator.userAgent.toLowerCase())) {
bridge.init(function(message, responseCallback) {
// 'JS got a message', message
var data = {
'Javascript Responds': '測試中文!'
};
if (responseCallback) {
// 'JS responding with', data
responseCallback(data);
}
});
}
});
// 初始化jsbridge
function setbridge(funName, dataJson, callback) {
setupWebViewJavascriptBridge(function(bridge) {
bridge.registerHandler(funName, function(data, responseCallback) {
// '注冊函數,從app拿到的數據', data
callback && callback(data);
var responseData = dataJson;
// 'js返回給app的數據', responseData
responseCallback(responseData);
});
});
}
function getbridge(funName, dataJson, callback) {
setupWebViewJavascriptBridge(function(bridge) {
bridge.callHandler(funName, dataJson, function(response) {
callback && callback(response);
});
});
}
export { setbridge, getbridge };