From c381f9a3eb246fa5a6541d88d5a8eec29412df4e Mon Sep 17 00:00:00 2001 From: kdletters Date: Sat, 20 Jun 2026 13:09:51 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=81=E5=AE=9A=E7=A7=BB=E5=8A=A8=E6=89=AB?= =?UTF-8?q?=E7=A0=81=E5=A4=B1=E8=B4=A5=E5=93=8D=E5=BA=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移动扫码失败统一返回稳定 host_error 移动扫码 overlay 不再向 H5 透出相机权限细节 移动壳测试和配置检查反查扫码失败边界 --- apps/mobile-shell/scripts/check-config.mjs | 6 +++--- apps/mobile-shell/src/host-bridge/bridge.test.ts | 6 +++--- apps/mobile-shell/src/host-bridge/scanner.test.ts | 8 ++++---- apps/mobile-shell/src/host-bridge/scanner.ts | 4 ++-- apps/mobile-shell/src/shell/QrScannerOverlay.test.tsx | 4 ++-- apps/mobile-shell/src/shell/QrScannerOverlay.tsx | 4 ++-- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/apps/mobile-shell/scripts/check-config.mjs b/apps/mobile-shell/scripts/check-config.mjs index 524a28eed..7a4d49b0b 100644 --- a/apps/mobile-shell/scripts/check-config.mjs +++ b/apps/mobile-shell/scripts/check-config.mjs @@ -2286,8 +2286,7 @@ for (const snippet of [ 'describe(\'QrScannerOverlay\'', 'scanQrCode()', 'requestCameraPermissionsAsync', - "message: 'camera permission denied'", - "message: 'camera permission unavailable'", + "message: 'qr scanner unavailable'", "message: 'qr scan cancelled'", "test('logs and rejects the active scan when camera permission request fails'", "'mobile QR scanner permission request failed'", @@ -2344,6 +2343,7 @@ for (const scannerSnippet of [ 'ok(request, await scanQrCode())', 'normalizeHostBridgeQrCodeValue', "hostBridgeError('cancelled', 'qr scan cancelled')", + "hostBridgeError('host_error', 'qr scanner unavailable')", ]) { if (!scannerSource.includes(scannerSnippet)) { throw new Error(`mobile shell QR scanner module missing ${scannerSnippet}`); @@ -2357,7 +2357,7 @@ for (const scannerTestSnippet of [ 'cancelQrCodeScan', 'failQrCodeScan', 'qr scanner already active', - 'camera permission denied', + 'qr scanner unavailable', 'qr scan cancelled', 'PZ-00000001', ]) { diff --git a/apps/mobile-shell/src/host-bridge/bridge.test.ts b/apps/mobile-shell/src/host-bridge/bridge.test.ts index 2bcce7d4a..506357b0b 100644 --- a/apps/mobile-shell/src/host-bridge/bridge.test.ts +++ b/apps/mobile-shell/src/host-bridge/bridge.test.ts @@ -1782,7 +1782,7 @@ describe('handleMobileHostBridgeMessage', () => { }); }); - test('scanner.scanQrCode 取消和权限拒绝返回明确错误', async () => { + test('scanner.scanQrCode 取消和扫描失败返回明确错误', async () => { const cancelledResponse = send(request('scanner.scanQrCode')); cancelQrCodeScan(); @@ -1792,11 +1792,11 @@ describe('handleMobileHostBridgeMessage', () => { }); const deniedResponse = send(request('scanner.scanQrCode')); - failQrCodeScan('camera permission denied'); + failQrCodeScan(); expect(expectFailed(await deniedResponse).error).toEqual({ code: 'host_error', - message: 'camera permission denied', + message: 'qr scanner unavailable', }); }); diff --git a/apps/mobile-shell/src/host-bridge/scanner.test.ts b/apps/mobile-shell/src/host-bridge/scanner.test.ts index 828e0f3f2..fb41352eb 100644 --- a/apps/mobile-shell/src/host-bridge/scanner.test.ts +++ b/apps/mobile-shell/src/host-bridge/scanner.test.ts @@ -113,21 +113,21 @@ describe('mobile QR scanner helpers', () => { }); }); - test('fails the pending scan with a host_error message', async () => { + test('fails the pending scan with a stable host_error message', async () => { const pendingScan = scanQrCode(); - failQrCodeScan('camera permission denied'); + failQrCodeScan(); await expect(pendingScan).rejects.toEqual({ code: 'host_error', - message: 'camera permission denied', + message: 'qr scanner unavailable', }); }); test('ignores completion, cancellation and failure without a pending scan', () => { expect(completeQrCodeScan('PZ-1')).toBe(false); expect(() => cancelQrCodeScan()).not.toThrow(); - expect(() => failQrCodeScan('camera permission denied')).not.toThrow(); + expect(() => failQrCodeScan()).not.toThrow(); }); test('wraps the scanner result in the HostBridge response shape', async () => { diff --git a/apps/mobile-shell/src/host-bridge/scanner.ts b/apps/mobile-shell/src/host-bridge/scanner.ts index df3ed4ff8..313bfb8e7 100644 --- a/apps/mobile-shell/src/host-bridge/scanner.ts +++ b/apps/mobile-shell/src/host-bridge/scanner.ts @@ -101,12 +101,12 @@ export function cancelQrCodeScan() { clearPendingQrScan(); } -export function failQrCodeScan(message: string) { +export function failQrCodeScan() { if (!pendingQrScan) { return; } - pendingQrScan.reject(hostBridgeError('host_error', message)); + pendingQrScan.reject(hostBridgeError('host_error', 'qr scanner unavailable')); clearPendingQrScan(); } diff --git a/apps/mobile-shell/src/shell/QrScannerOverlay.test.tsx b/apps/mobile-shell/src/shell/QrScannerOverlay.test.tsx index 435e08316..274c99437 100644 --- a/apps/mobile-shell/src/shell/QrScannerOverlay.test.tsx +++ b/apps/mobile-shell/src/shell/QrScannerOverlay.test.tsx @@ -113,7 +113,7 @@ describe('QrScannerOverlay', () => { await expect(scanPromise).rejects.toMatchObject({ code: 'host_error', - message: 'camera permission denied', + message: 'qr scanner unavailable', }); expect(overlayHarness.cameraViewProps.current).toBeNull(); }); @@ -128,7 +128,7 @@ describe('QrScannerOverlay', () => { await expect(scanPromise).rejects.toMatchObject({ code: 'host_error', - message: 'camera permission unavailable', + message: 'qr scanner unavailable', }); expect(warnSpy).toHaveBeenCalledWith( 'mobile QR scanner permission request failed', diff --git a/apps/mobile-shell/src/shell/QrScannerOverlay.tsx b/apps/mobile-shell/src/shell/QrScannerOverlay.tsx index 600913e07..74bee3bf6 100644 --- a/apps/mobile-shell/src/shell/QrScannerOverlay.tsx +++ b/apps/mobile-shell/src/shell/QrScannerOverlay.tsx @@ -44,7 +44,7 @@ export function QrScannerOverlay() { return; } if (!permission.granted) { - failQrCodeScan('camera permission denied'); + failQrCodeScan(); return; } setHasPermission(true); @@ -52,7 +52,7 @@ export function QrScannerOverlay() { .catch((error: unknown) => { if (!disposed) { logQrScannerPermissionFailure(error); - failQrCodeScan('camera permission unavailable'); + failQrCodeScan(); } });