native-message.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import { browser, getRandomKey } from '/src/helpers/utils';
  2. export interface IPostMessage {
  3. api: string;
  4. content?: any;
  5. }
  6. /**
  7. * 劫持postMessage
  8. */
  9. const originalPostMessage = window.postMessage;
  10. window.postMessage = (message: IPostMessage) => {
  11. // console.log('通过劫持', message)
  12. originalPostMessage(message, '*');
  13. };
  14. /**
  15. *
  16. * 目前已支持API
  17. *
  18. * openWebView
  19. *
  20. */
  21. type CallBack = (evt?: IPostMessage) => void;
  22. const loop = () => {};
  23. const calls: { [key: string]: CallBack } = {};
  24. const browserInfo = browser();
  25. if (browserInfo.isApp) {
  26. window.addEventListener('message', evt => {
  27. try {
  28. const data = evt.data
  29. ? typeof evt.data === 'object'
  30. ? evt.data
  31. : JSON.parse(evt.data)
  32. : {};
  33. const uuid = data.content?.uuid || data.uuid;
  34. try {
  35. if (data.content) {
  36. data.content = JSON.parse(data.content);
  37. }
  38. } catch (error) {}
  39. if (data?.content?.uuid) {
  40. console.log('data', data);
  41. }
  42. if (!uuid) {
  43. const keys = Object.keys(calls).filter(
  44. key => key.indexOf(data.api) === 0
  45. );
  46. for (const key of keys) {
  47. const callback = calls[key] || loop;
  48. callback(data);
  49. }
  50. return;
  51. }
  52. const callid = data.content?.uuid || data.uuid || data.api + data.uuid;
  53. const callback = calls[callid] || loop;
  54. callback(data);
  55. } catch (error) {
  56. console.error('通信消息解析错误', error);
  57. }
  58. });
  59. }
  60. const instance: any =
  61. (window as any).DAYA || (window as any).webkit?.messageHandlers?.DAYA;
  62. export const postMessage = (data: IPostMessage, callback?: CallBack) => {
  63. if (browserInfo.isApp) {
  64. const uuid = getRandomKey();
  65. calls[uuid] = callback || loop;
  66. data.content = data.content ? { ...data.content, uuid } : { uuid };
  67. instance.postMessage(JSON.stringify(data));
  68. console.log('send:', JSON.stringify(data));
  69. }
  70. };
  71. export const listenerMessage = (api: string, callback: CallBack) => {
  72. if (browserInfo.isApp) {
  73. const uuid = api + getRandomKey();
  74. calls[uuid] = callback || loop;
  75. }
  76. };
  77. export const promisefiyPostMessage = (
  78. data: IPostMessage
  79. ): Promise<IPostMessage | undefined> => {
  80. return new Promise(resolve => {
  81. postMessage(data, res => resolve(res));
  82. });
  83. };