diff --git a/electron/main/deeplink.ts b/electron/main/deeplink.ts index fc20cb2c..d34aa9fe 100644 --- a/electron/main/deeplink.ts +++ b/electron/main/deeplink.ts @@ -99,6 +99,25 @@ export function handleCommandLine(commandLine: string[]) { `Deep link: invalid search format, expected /pkgname, got ${url.pathname}`, ); } + } else if (action === "store") { + // Format: spk://store/category/pkgname (legacy format) + // url.pathname will be '/category/pkgname' + const pathParts = url.pathname.split("/").filter(Boolean); + // 老协议格式: spk://store/category/pkgname + // 现在忽略 category,直接使用 pkgname 查找应用 + const pkgname = pathParts.length >= 2 ? pathParts[1] : pathParts[0]; + if (pkgname) { + query.pkgname = pkgname; + logger.info( + `Deep link: store legacy format query found: ${JSON.stringify(query)}`, + ); + // 使用 search 事件来处理,前端会根据 pkgname 直接打开应用详情 + listeners.emit("search", query); + } else { + logger.warn( + `Deep link: invalid store format, expected /category/pkgname, got ${url.pathname}`, + ); + } } else { logger.warn(`Deep link: unknown action ${action}`); } diff --git a/src/App.vue b/src/App.vue index 66656155..71235a53 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1146,7 +1146,28 @@ onMounted(async () => { window.ipcRenderer.on( "deep-link-search", (_event: IpcRendererEvent, data: { pkgname: string }) => { - searchQuery.value = data.pkgname; + // 根据包名直接打开应用详情 + const tryOpen = () => { + const target = apps.value.find((a) => a.pkgname === data.pkgname); + if (target) { + openDetail(target); + } else { + // 如果找不到应用,回退到搜索模式 + searchQuery.value = data.pkgname; + logger.warn(`Deep link: app ${data.pkgname} not found, fallback to search`); + } + }; + + if (loading.value) { + const stop = watch(loading, (val) => { + if (!val) { + tryOpen(); + stop(); + } + }); + } else { + tryOpen(); + } }, );