From 92341be32c0d45e6463ef734f52ce51c862dbf78 Mon Sep 17 00:00:00 2001 From: Blizzard Date: Wed, 22 Jul 2026 14:44:27 +0800 Subject: [PATCH] =?UTF-8?q?fix(desktop):=20=E9=BA=A6=E5=85=8B=E9=A3=8E?= =?UTF-8?q?=E4=BC=98=E9=9B=85=E9=99=8D=E7=BA=A7=20+=20Info.plist=20?= =?UTF-8?q?=E5=8A=A0=20NSMicrophoneUsageDescription?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - voice.ts: startMic 前探测 navigator.mediaDevices?.getUserMedia——WKWebView(原生壳)非安全 上下文里它可能未暴露,直接调会抛 "undefined is not an object" 崩掉;改为给可读提示 - build/darwin/Info.plist + Info.dev.plist: 加 NSMicrophoneUsageDescription,否则 macOS 不会授权麦克风(package 后的 .app 才能弹权限) Co-Authored-By: Claude Opus 4.8 --- sundynix-desktop/build/darwin/Info.dev.plist | 2 ++ sundynix-desktop/build/darwin/Info.plist | 2 ++ sundynix-desktop/frontend/src/lib/voice.ts | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/sundynix-desktop/build/darwin/Info.dev.plist b/sundynix-desktop/build/darwin/Info.dev.plist index 1e4a765..0822f7e 100644 --- a/sundynix-desktop/build/darwin/Info.dev.plist +++ b/sundynix-desktop/build/darwin/Info.dev.plist @@ -27,6 +27,8 @@ NSAllowsLocalNetworking + NSMicrophoneUsageDescription + JARVIS 语音助手需要麦克风来听你说话。 NSHighResolutionCapable true NSHumanReadableCopyright diff --git a/sundynix-desktop/build/darwin/Info.plist b/sundynix-desktop/build/darwin/Info.plist index df3c8d9..53ad724 100644 --- a/sundynix-desktop/build/darwin/Info.plist +++ b/sundynix-desktop/build/darwin/Info.plist @@ -22,6 +22,8 @@ 0.1.1 LSMinimumSystemVersion 12.0.0 + NSMicrophoneUsageDescription + JARVIS 语音助手需要麦克风来听你说话。 NSHighResolutionCapable true NSHumanReadableCopyright diff --git a/sundynix-desktop/frontend/src/lib/voice.ts b/sundynix-desktop/frontend/src/lib/voice.ts index 0e0d54d..cc4b4df 100644 --- a/sundynix-desktop/frontend/src/lib/voice.ts +++ b/sundynix-desktop/frontend/src/lib/voice.ts @@ -196,6 +196,11 @@ export class VoiceClient { private async startMic(): Promise { if (this.micNode) return; + // WKWebView(Wails 原生壳)等非安全上下文里 navigator.mediaDevices 可能未暴露—— + // 直接调用会抛 "undefined is not an object" 崩掉。先探测,给出可读提示而非崩溃。 + if (!navigator.mediaDevices?.getUserMedia) { + throw new Error("此窗口暂不支持麦克风(原生壳需授权/安全上下文)。用浏览器打开 localhost:5173 可直接说话。"); + } const stream = await navigator.mediaDevices.getUserMedia({ audio: { channelCount: 1, echoCancellation: true, noiseSuppression: true }, });