|
@@ -0,0 +1,97 @@
|
|
|
+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));
|
|
|
+ });
|
|
|
+};
|