From 488966d7716776af3c074425181c592383e26ed4 Mon Sep 17 00:00:00 2001 From: wuyouMaster Date: Mon, 14 Sep 2026 18:20:20 +0800 Subject: [PATCH] fix: expose macOS login-time key detection --- .../src/components/DatabaseConnectionPage.tsx | 31 ++++++++-------- .../database-key/DatabaseKeyAutoDetect.tsx | 33 ++++++++++++----- .../database-key/useDatabaseKeyController.ts | 23 ++++++++---- .../features/settings/database-key/utils.ts | 4 +- tests/component/database-connection.test.tsx | 37 +++++++++++++++++++ .../component/database-key-controls.test.tsx | 28 ++++++++++++++ tests/unit/key-validation.test.ts | 2 + 7 files changed, 124 insertions(+), 34 deletions(-) diff --git a/src/renderer/src/components/DatabaseConnectionPage.tsx b/src/renderer/src/components/DatabaseConnectionPage.tsx index 4038184..6d95df1 100644 --- a/src/renderer/src/components/DatabaseConnectionPage.tsx +++ b/src/renderer/src/components/DatabaseConnectionPage.tsx @@ -137,6 +137,7 @@ export function DatabaseConnectionPage({ }: DatabaseConnectionPageProps): React.ReactElement { const isMac = platform === 'darwin' const isIntelMac = isMac && environment?.architecture === 'x64' + const isAppleSiliconMac = isMac && !isIntelMac const defaultPath = isMac ? '~/Library/Containers/com.tencent.xinWeChat/Data/Library/Application Support/com.tencent.xinWeChat/' : 'C:\\Users\\...\\WeChat Files\\Msg' @@ -189,18 +190,16 @@ export function DatabaseConnectionPage({
  • 2
    - {isIntelMac ? '让微信停在登录页面' : '准备连接组件'} + {isMac ? '让微信停在登录页面' : '准备连接组件'} - {isIntelMac - ? '启动微信,但暂时不要点击登录' - : '页面会按当前系统给出对应步骤'} + {isMac ? '启动微信,但暂时不要点击登录' : '页面会按当前系统给出对应步骤'}
  • 3
    - {isIntelMac ? '获取密钥并验证连接' : '登录并验证连接'} + {isMac ? '获取密钥并验证连接' : '登录并验证连接'} 验证通过后进入主界面
  • @@ -248,11 +247,13 @@ export function DatabaseConnectionPage({ : [ '检查本机环境', '让微信停在登录页面', - isIntelMac ? '确认开始获取密钥' : '确认开始准备', + isMac ? '确认开始获取密钥' : '确认开始准备', isIntelMac ? '正在获取 Intel Mac 密钥' - : `正在完成 ${isMac ? 'macOS' : 'Windows'} 授权`, - isIntelMac + : isAppleSiliconMac + ? '正在监听 macOS 登录密钥' + : '正在完成 Windows 授权', + isMac ? '获取成功,验证数据库连接' : '获取成功, 现在可以重新登录微信了', '验证数据库连接' @@ -264,14 +265,14 @@ export function DatabaseConnectionPage({ : status || [ '确认下方检测结果;没有找到目录时可以手动选择。', - isIntelMac + isMac ? '请启动微信并停留在未登录界面,暂时不要点击登录,然后点击“我已准备好”。' : '请退出当前微信账号,让微信停留在登录页面,然后点击“我已准备好”。', - isIntelMac ? '确认开始获取密钥。' : '开始后请按页面提示完成系统授权。', - isIntelMac + isMac ? '确认开始获取密钥。' : '开始后请按页面提示完成系统授权。', + isMac ? '等页面提示可以登录后,立即回到微信点击登录。' : '正在准备连接组件,请不要关闭微信或 TraceMemo。', - isIntelMac + isMac ? '密钥已获取,请继续验证数据库。' : '请回到微信完成登录,登录成功后再回来验证。', '正在验证密钥和本地数据库,请稍候。' @@ -445,12 +446,12 @@ export function DatabaseConnectionPage({ )} {guideStep === 3 && ( )} {guideStep === 4 && ( )} {guideStep === 5 && ( @@ -491,7 +492,7 @@ export function DatabaseConnectionPage({ <> {isIntelMac ? 'Intel Mac 首次使用需要先准备连接环境,按页面提示完成即可。' - : 'macOS 首次获取密钥需要关闭 SIP。'}{' '} + : 'macOS Apple 芯片首次获取密钥需要关闭 SIP,并在监听期间点击微信登录。'}{' '} 查看说明 diff --git a/src/renderer/src/features/settings/database-key/DatabaseKeyAutoDetect.tsx b/src/renderer/src/features/settings/database-key/DatabaseKeyAutoDetect.tsx index d0ad2ee..dd8742e 100644 --- a/src/renderer/src/features/settings/database-key/DatabaseKeyAutoDetect.tsx +++ b/src/renderer/src/features/settings/database-key/DatabaseKeyAutoDetect.tsx @@ -2,7 +2,14 @@ import type { DatabaseKeyState } from './types' import { runtimePlatform } from '../../../utils/runtime-environment' import { Button } from '../../../components/ui' -const PHASES = ['查找微信进程', '识别微信版本', '扫描候选密钥', '验证数据库', '获取完成'] +const DEFAULT_PHASES = ['查找微信进程', '识别微信版本', '扫描候选密钥', '验证数据库', '获取完成'] +const MAC_LOGIN_PHASES = [ + '查找微信进程', + '等待管理员授权', + '监听登录密钥', + '验证数据库', + '获取完成' +] export function DatabaseKeyAutoDetect({ state, @@ -17,8 +24,12 @@ export function DatabaseKeyAutoDetect({ }): React.ReactElement { const environment = state.environment const platform = environment?.platform || runtimePlatform + const isMac = platform === 'darwin' const isIntelMac = platform === 'darwin' && environment?.architecture === 'x64' - if (platform !== 'win32' && !isIntelMac) { + const isAppleSiliconMac = isMac && !isIntelMac + const supported = environment?.autoDetectSupported ?? (platform === 'win32' || isMac) + const phases = isAppleSiliconMac ? MAC_LOGIN_PHASES : DEFAULT_PHASES + if (!supported) { return (
    @@ -32,11 +43,15 @@ export function DatabaseKeyAutoDetect({
    - {isIntelMac ? 'Intel Mac 自动获取' : 'Windows 自动获取'} + + {isIntelMac ? 'Intel Mac 自动获取' : isMac ? 'macOS 自动获取' : 'Windows 自动获取'} +

    {isIntelMac ? '请让微信停在未登录界面,按页面提示操作即可。' - : 'TraceMemo 可在微信桌面端正在运行时,通过本机内存扫描尝试获取数据库密钥。'} + : isAppleSiliconMac + ? '执行时会请求管理员授权;授权后在微信登录界面点击“登录”即可,已有登录凭据时通常不需要扫码。监听最长两分钟,结束后会明确显示结果。' + : 'TraceMemo 可在微信桌面端正在运行时,通过本机内存扫描尝试获取数据库密钥。'}