UNPKG

@sinosun/lib

Version:

sinosun jsbridge and net toolkit

214 lines (167 loc) 7.67 kB
"use strict"; 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;