feat(deep-link): 支持通过 store 协议直接打开应用详情

添加对 legacy store 协议格式的支持,当收到 spk://store/category/pkgname 格式的 deep link 时,忽略 category 直接使用 pkgname 查找并打开应用详情。如果应用未找到,则回退到搜索模式。
This commit is contained in:
2026-03-29 13:58:52 +08:00
parent 1e6e776afe
commit 3f9447d2cc
2 changed files with 41 additions and 1 deletions

View File

@@ -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}`);
}

View File

@@ -1146,7 +1146,28 @@ onMounted(async () => {
window.ipcRenderer.on(
"deep-link-search",
(_event: IpcRendererEvent, data: { pkgname: string }) => {
// 根据包名直接打开应用详情
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();
}
},
);