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 },
});