@sinosun/lib
Version:
sinosun jsbridge and net toolkit
214 lines (167 loc) • 7.67 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
require("core-js/modules/es.date.to-string.js");
var _defineProperty = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/json/stringify"));
var _setTimeout2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/set-timeout"));
(0, _defineProperty["default"])(exports, "__esModule", {
value: true
}); //notation: js file can only use this kind of comments
//since comments will cause error when use in webview.loadurl,
//comments will be remove by java use regexp
var uaUtil_1 = require("../../../Utils/uaUtil");
var webviewjsbridge = function webviewjsbridge() {
//如果WebViewJavascriptBridge 已经加载则不再加载
//AndObj为T信客户端专用标志,如果不是T信客户端则不加载该js bridge
if (window.WebViewJavascriptBridge || !(window.AndObj || uaUtil_1.isElectronH5Container())) {
return;
}
var messagingIframe;
var sendMessageQueue = [];
var receiveMessageQueue = [];
var messageHandlers = {};
var CUSTOM_PROTOCOL_SCHEME = 'yy';
var QUEUE_HAS_MESSAGE = '__QUEUE_MESSAGE__/';
var responseCallbacks = {};
var uniqueId = 1;
function _createQueueReadyIframe(doc) {
messagingIframe = doc.createElement('iframe');
messagingIframe.style.display = 'none';
doc.documentElement.appendChild(messagingIframe);
} //set default messageHandler
function init(messageHandler) {
if (window.WebViewJavascriptBridge._messageHandler) {
throw new Error('WebViewJavascriptBridge.init called twice');
}
window.WebViewJavascriptBridge._messageHandler = messageHandler;
var receivedMessages = receiveMessageQueue;
receiveMessageQueue = null;
for (var i = 0; i < receivedMessages.length; i++) {
_dispatchMessageFromNative(receivedMessages[i]);
}
}
function send(data, responseCallback) {
_doSend({
data: data
}, responseCallback);
}
function registerHandler(handlerName, handler) {
messageHandlers[handlerName] = handler;
}
function callHandler(handlerName, data, responseCallback) {
// console.log("callHandler start"+new Date().getTime() + " handlerName = " + handlerName+" data = "+JSON.stringify(data));
_doSend({
handlerName: handlerName,
data: data
}, responseCallback); // console.log("callHandler end"+new Date().getTime() + " handlerName = " + handlerName);
} //sendMessage add message, 触发native处理 sendMessage
function _doSend(message, responseCallback) {
// console.log(" message = " + JSON.stringify(message) + "_doSend start"+new Date().getTime());
if (responseCallback) {
var callbackId = 'cb_' + uniqueId++ + '_' + new Date().getTime();
responseCallbacks[callbackId] = responseCallback;
message.callbackId = callbackId;
}
sendMessageQueue.push(message); // messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE;
_getDataByNative(CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE); // AndObj.getData(CUSTOM_PROTOCOL_SCHEME + '://' + QUEUE_HAS_MESSAGE);
// console.log(" message = " + message + "_doSend end"+new Date().getTime());
} // 提供给native调用,该函数作用:获取sendMessageQueue返回给native,由于android不能直接获取返回的内容,所以使用url shouldOverrideUrlLoading 的方式返回内容
function _fetchQueue() {
// console.log("_fetchQueue start"+new Date().getTime());
var messageQueueString = (0, _stringify["default"])(sendMessageQueue);
sendMessageQueue = []; //android can't read directly the return data, so we can reload iframe src to communicate with java
// messagingIframe.src = CUSTOM_PROTOCOL_SCHEME + '://return/_fetchQueue/' + encodeURIComponent(messageQueueString);
// AndObj.getData(CUSTOM_PROTOCOL_SCHEME + '://return/_fetchQueue/' + encodeURIComponent(messageQueueString));
_getDataByNative(CUSTOM_PROTOCOL_SCHEME + '://return/_fetchQueue/' + encodeURIComponent(messageQueueString)); // console.log("_fetchQueue end AndObj.getData -- "+new Date().getTime());
}
/**
* 调用native的jsbridge交互接口
* @param data
*/
function _getDataByNative(data) {
PromiseAndObjReady(function () {
window.AndObj.getData(data);
});
}
/**
* 监听确保native的andObj jsBridge交互接口已经注入挂载了
* @param callback
*/
function PromiseAndObjReady(callback) {
// 如果 AndObj 已经注入则直接调用
if (window.AndObj) {
callback && callback();
} else {
// 如果没有注入则监听注入的事件
document.addEventListener('AndObjReady', function () {
callback && callback();
}, false);
}
} //提供给native使用,
function _dispatchMessageFromNative(messageJSON) {
(0, _setTimeout2["default"])(function () {
var message = JSON.parse(messageJSON);
var responseCallback;
if (message.responseId) {
responseCallback = responseCallbacks[message.responseId];
if (!responseCallback) {
return;
}
responseCallback(message.responseData);
delete responseCallbacks[message.responseId];
} else {
//直接发送
if (message.callbackId) {
var callbackResponseId_1 = message.callbackId;
responseCallback = function responseCallback(responseData) {
_doSend({
responseId: callbackResponseId_1,
responseData: responseData
});
};
}
var handler = window.WebViewJavascriptBridge._messageHandler;
if (message.handlerName) {
handler = messageHandlers[message.handlerName];
} //查找指定handler
try {
handler(message.data, responseCallback);
} catch (exception) {
if (typeof console !== 'undefined') {
console.log("WebViewJavascriptBridge: WARNING: javascript handler threw.", message, exception);
}
}
}
});
} //提供给native调用,receiveMessageQueue 在会在页面加载完后赋值为null,所以
function _handleMessageFromNative(messageJSON) {
if (receiveMessageQueue && receiveMessageQueue.length > 0) {
receiveMessageQueue.push(messageJSON);
} else {
_dispatchMessageFromNative(messageJSON);
}
}
var SnJSBridge = window.WebViewJavascriptBridge = {
init: init,
send: send,
registerHandler: registerHandler,
callHandler: callHandler,
_fetchQueue: _fetchQueue,
_handleMessageFromNative: _handleMessageFromNative
};
var doc = document; // _createQueueReadyIframe(doc);
var readyEvent = doc.createEvent('Events');
readyEvent.initEvent('SnJSBridgeReady');
readyEvent.bridge = SnJSBridge;
doc.dispatchEvent(readyEvent);
};
webviewjsbridge(); // 定义导出接口
var jsbridge = {
init: window.WebViewJavascriptBridge && window.WebViewJavascriptBridge.init,
send: window.WebViewJavascriptBridge && window.WebViewJavascriptBridge.send,
registerHandler: window.WebViewJavascriptBridge && window.WebViewJavascriptBridge.registerHandler,
callHandler: window.WebViewJavascriptBridge && window.WebViewJavascriptBridge.callHandler,
_fetchQueue: window.WebViewJavascriptBridge && window.WebViewJavascriptBridge._fetchQueue,
_handleMessageFromNative: window.WebViewJavascriptBridge && window.WebViewJavascriptBridge._handleMessageFromNative
};
exports["default"] = jsbridge;