From 285e61d13f385f45ea036f77150529a53e0f174e Mon Sep 17 00:00:00 2001 From: Vanessa Date: Fri, 6 Mar 2026 20:23:26 +0800 Subject: [PATCH] :art: https://github.com/siyuan-note/siyuan/issues/17150 --- app/src/plugin/API.ts | 2 +- app/src/plugin/platformUtils.ts | 58 +++++++++++++++++++++++++++++++++ app/src/types/index.d.ts | 10 ++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 app/src/plugin/platformUtils.ts diff --git a/app/src/plugin/API.ts b/app/src/plugin/API.ts index e2361e3e8..02aafb825 100644 --- a/app/src/plugin/API.ts +++ b/app/src/plugin/API.ts @@ -10,7 +10,7 @@ import {openNewWindow, openNewWindowById} from "../window/openNewWindow"; import {Tab} from "../layout/Tab"; /// #endif import {updateHotkeyTip} from "../protyle/util/compatibility"; -import * as platformUtils from "../protyle/util/compatibility"; +import * as platformUtils from "./platformUtils"; import {App} from "../index"; import {Constants} from "../constants"; import {Setting} from "./Setting"; diff --git a/app/src/plugin/platformUtils.ts b/app/src/plugin/platformUtils.ts new file mode 100644 index 000000000..32f7d648b --- /dev/null +++ b/app/src/plugin/platformUtils.ts @@ -0,0 +1,58 @@ +import * as compatibility from "../protyle/util/compatibility"; + +export const openByMobile = compatibility.openByMobile; +export const readText = compatibility.readText; +export const writeText = compatibility.writeText; +export const copyPlainText = compatibility.copyPlainText; +export const getEventName = compatibility.getEventName; +export const isOnlyMeta = compatibility.isOnlyMeta; +export const isNotCtrl = compatibility.isNotCtrl; +export const isHuawei = compatibility.isHuawei; +export const isIPhone = compatibility.isIPhone; +export const isIPad = compatibility.isIPad; +export const isMac = compatibility.isMac; +export const isInAndroid = compatibility.isInAndroid; +export const isInIOS = compatibility.isInIOS; +export const updateHotkeyTip = compatibility.updateHotkeyTip; +export const getLocalStorage = compatibility.getLocalStorage; +export const setStorageVal = compatibility.setStorageVal; + +/// #if BROWSER +export const sendMobileAppNotification = (channel: string, title: string, body: string, delayInSeconds: number): Promise => { + return new Promise((resolve) => { + if (window.JSAndroid && window.JSAndroid.sendNotification) { + const id = window.JSAndroid.sendNotification(channel, title, body, delayInSeconds); + resolve(id); + } else if (window.JSHarmony && window.JSHarmony.sendNotification) { + const id = window.JSHarmony.sendNotification(channel, title, body, delayInSeconds); + resolve(id); + } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.sendNotification) { + const callbackId = "cb_" + Date.now(); + // 定义临时回调 + if (!window.webkit.nativeCallbacks) { + window.webkit.nativeCallbacks = {}; + } + window.webkit.nativeCallbacks[callbackId] = (id:number) => { + delete window.webkit.nativeCallbacks[callbackId]; + resolve(id); + }; + window.webkit.messageHandlers.sendNotification.postMessage({ + title, + body, + delay: delayInSeconds, + callback: `window.webkit.nativeCallbacks.${callbackId}` + }); + } + }); +}; + +export const cancelMobileAppNotification = (id: number) => { + if (window.JSAndroid && window.JSAndroid.cancelNotification) { + window.JSAndroid.cancelNotification(id); + } else if (window.JSHarmony && window.JSHarmony.cancelNotification) { + window.JSHarmony.cancelNotification(id); + } else if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.cancelNotification) { + window.webkit.messageHandlers.cancelNotification.postMessage(id); + } +}; +/// #endif diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index d8c019d4e..c173202ca 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -221,6 +221,7 @@ interface Window { }; pdfjsLib: any; webkit: { + nativeCallbacks: { [key: string]: (id: number) => void }, messageHandlers: { openLink: { postMessage: (url: string) => void } startKernelFast: { postMessage: (url: string) => void } @@ -229,6 +230,15 @@ interface Window { purchase: { postMessage: (url: string) => void } print: { postMessage: (html: string) => void } exit: { postMessage: (text: string) => void } + sendNotification: { + postMessage: (options: { + title: string, + body: string, + delay: number, + callback: string + }) => number + } + cancelNotification: { postMessage: (id: number) => void } } }; htmlToImage: {