12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- import { browser, getRandomKey } from '/src/helpers/utils';
- export interface IPostMessage {
- api: string;
- content?: any;
- }
- /**
- * 劫持postMessage
- */
- const originalPostMessage = window.postMessage;
- window.postMessage = (message: IPostMessage) => {
- // console.log('通过劫持', message)
- originalPostMessage(message, '*');
- };
- /**
- *
- * 目前已支持API
- *
- * openWebView
- *
- */
- type CallBack = (evt?: IPostMessage) => void;
- const loop = () => {};
- const calls: { [key: string]: CallBack } = {};
- const browserInfo = browser();
- if (browserInfo.isApp) {
- window.addEventListener('message', evt => {
- try {
- const data = evt.data
- ? typeof evt.data === 'object'
- ? evt.data
- : JSON.parse(evt.data)
- : {};
- const uuid = data.content?.uuid || data.uuid;
- try {
- if (data.content) {
- data.content = JSON.parse(data.content);
- }
- } catch (error) {}
- if (data?.content?.uuid) {
- console.log('data', data);
- }
- if (!uuid) {
- const keys = Object.keys(calls).filter(
- key => key.indexOf(data.api) === 0
- );
- for (const key of keys) {
- const callback = calls[key] || loop;
- callback(data);
- }
- return;
- }
- const callid = data.content?.uuid || data.uuid || data.api + data.uuid;
- const callback = calls[callid] || loop;
- callback(data);
- } catch (error) {
- console.error('通信消息解析错误', error);
- }
- });
- }
- const instance: any =
- (window as any).DAYA || (window as any).webkit?.messageHandlers?.DAYA;
- export const postMessage = (data: IPostMessage, callback?: CallBack) => {
- if (browserInfo.isApp) {
- const uuid = getRandomKey();
- calls[uuid] = callback || loop;
- data.content = data.content ? { ...data.content, uuid } : { uuid };
- instance.postMessage(JSON.stringify(data));
- console.log('send:', JSON.stringify(data));
- }
- };
- export const listenerMessage = (api: string, callback: CallBack) => {
- if (browserInfo.isApp) {
- const uuid = api + getRandomKey();
- calls[uuid] = callback || loop;
- }
- };
- export const promisefiyPostMessage = (
- data: IPostMessage
- ): Promise<IPostMessage | undefined> => {
- return new Promise(resolve => {
- postMessage(data, res => resolve(res));
- });
- };
|