uni-js-bridge.umd.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. (function (global, factory) {
  2. typeof exports === 'object' && typeof module !== 'undefined' ? factory() :
  3. typeof define === 'function' && define.amd ? define(factory) :
  4. (factory());
  5. }(this, (function () { 'use strict';
  6. if (window.UniJsBridge) {
  7. throw new Error('UniJsBridge已经存在了');
  8. }
  9. var uniqueId = 1; // 全局唯一标识,主要用来生产callbackId
  10. var responseCallbacks = {}; // 给客户端发送消息后的回调函数集合
  11. var messageHandlers = {}; // 在H5中注册的函数(就是等待客户端调用的函数)的集合
  12. var receiveMessageQueue = []; // 消息队列,Native给H5发消息的队列,所有的消息都集中在此,依次调用
  13. if (!uni) {
  14. throw new Error('uni未定义,需要先引入uni-sdk,地址为:https://js.cdn.aliyun.dcloud.net.cn/dev/uni-app/uni.webview.1.5.2.js');
  15. }
  16. var UniJsBridge = {
  17. init: init,
  18. send: send,
  19. callHandler: callHandler,
  20. registerHandler: registerHandler,
  21. uni: uni,
  22. _handleMessageFromNative: _handleMessageFromNative,
  23. };
  24. // Native调用H5函数必须是要挂载到window下
  25. window.UniJsBridge = UniJsBridge;
  26. function init(messageHandler) {
  27. if (UniJsBridge._messageHandler) {
  28. throw new Error('UniJSBridge._messageHandler 被调用了两次');
  29. }
  30. UniJsBridge._messageHandler = messageHandler;
  31. var receiveMessage = receiveMessageQueue;
  32. receiveMessageQueue = null;
  33. for (var i = 0; i < receiveMessage.length; i++) {
  34. _dispatchMessageFromNative(receiveMessage[i]);
  35. }
  36. }
  37. /**
  38. * 发送消息给客户端
  39. * PS:主动发送
  40. * @param data 给客户端的数据
  41. * @param responseCallback 回调函数
  42. */
  43. function send(data, responseCallback) {
  44. _doSend('send', data, responseCallback);
  45. }
  46. // 调用线程
  47. function callHandler(handlerName, data, responseCallback) {
  48. _doSend(handlerName, data, responseCallback);
  49. }
  50. /**
  51. * 注册一个函数,待客户端调用
  52. * PS:被动等待调用
  53. * @param handlerName
  54. * @param handler: 接收两个参数,data(客户端回复给H5的数据),responseCallback(一个回调函数:调用该函数,客户端才可以执行回调,且可以传参数给客户端)
  55. */
  56. function registerHandler(handlerName, handler) {
  57. messageHandlers[handlerName] = handler;
  58. }
  59. /**
  60. * 发送给客户端的核心函数,依赖uni-app SDk
  61. * PS:主动发送
  62. * @param handlerName
  63. * @param message
  64. * @param responseCallback: 可接收String和Function,如果为String的话就是给客户端的一个回调ID,这个ID其实本来就是由客户端自己传过来的
  65. * 如果为Function的话就是H5的回调函数
  66. * @private
  67. */
  68. function _doSend(handlerName, message, responseCallback) {
  69. var callbackId;
  70. if (typeof responseCallback === 'string') {
  71. callbackId = responseCallback;
  72. }
  73. else if (responseCallback) {
  74. /**
  75. * 把回调函数塞进集合中去,待客户端代码执行完毕就去找到对应的函数开始执行
  76. */
  77. callbackId = 'cb_' + (uniqueId++) + '_' + new Date().getTime();
  78. responseCallbacks[callbackId] = responseCallback;
  79. }
  80. else {
  81. callbackId = '';
  82. }
  83. if (!uni.postMessage) {
  84. return console.error('此接口依赖uni.webview,具体参考:https://uniapp.dcloud.io/component/web-view');
  85. }
  86. // 给客户端发送消息
  87. uni.postMessage({
  88. data: {
  89. data: message,
  90. callbackId: callbackId,
  91. handlerName: handlerName,
  92. },
  93. });
  94. }
  95. function _dispatchMessageFromNative(messageJSON) {
  96. if (!messageJSON) {
  97. return console.warn('客户端没有回复任何消息');
  98. }
  99. try {
  100. /**
  101. * responseId: 客户端回复前端的回调函数的ID
  102. * callbackId: 给客户端自己用的回调ID
  103. * handlerName: 前后端统一约定的一个名字[约定不同的名字对应不同的功能,需要后期加,这里只是封装的一个方法]
  104. * responseData: 客户端给前端的参数
  105. */
  106. var callbackId = messageJSON.callbackId, responseId = messageJSON.responseId, handlerName = messageJSON.handlerName, responseData = messageJSON.responseData;
  107. var responseCallback = void 0;
  108. if (responseId) {
  109. responseCallbacks[responseId] && responseCallbacks[responseId](responseData);
  110. delete responseCallbacks[responseId];
  111. }
  112. else {
  113. if (callbackId) {
  114. var callbackResponseId_1 = callbackId;
  115. responseCallback = function (responseData) {
  116. _doSend('response', responseData, callbackResponseId_1);
  117. };
  118. }
  119. var handler = UniJsBridge._messageHandler;
  120. if (handlerName) {
  121. handler = messageHandlers[handlerName];
  122. }
  123. handler(responseData, responseCallback);
  124. }
  125. }
  126. catch (e) {
  127. console.log(e);
  128. }
  129. }
  130. /**
  131. * 提供给客户端调用的函数,
  132. * 约定客户端只能通过此函数发消息给H5
  133. * @param messageJSON
  134. * @private
  135. */
  136. function _handleMessageFromNative(messageJSON) {
  137. if (receiveMessageQueue) {
  138. receiveMessageQueue.push(messageJSON);
  139. }
  140. _dispatchMessageFromNative(messageJSON);
  141. }
  142. })));
  143. //# sourceMappingURL=uni-js-bridge.umd.js.map