From b6581adc51697c15d0ef6e40fef9817b2e886e94 Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Tue, 16 Jun 2026 14:48:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E6=B8=85=E7=90=86=20=E2=80=94=20XWebView=20Pressable/Clipboard?= =?UTF-8?q?=E3=80=81configCrypto=20=E6=B6=88=E9=99=A4=20any=E3=80=81Update?= =?UTF-8?q?SDK=20AsyncStorage=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - XWebViewView/XWebViewScreen: TouchableOpacity → Pressable - XWebViewView/XWebViewScreen: Clipboard 改用 @react-native-clipboard/clipboard - configCrypto.ts: 6 处 any 替换为 SubtleCryptoLike 接口 - UpdateSDK: CachedRnBundle 移除 source 字段,AsyncStorage 仅存版本元数据 - xwebview 添加 @react-native-clipboard/clipboard peerDependency --- packages/common/package.json | 1 + packages/common/src/configCrypto.ts | 20 +++++++++++--------- packages/update/src/UpdateSDK.ts | 4 +--- packages/xwebview/package.json | 2 ++ packages/xwebview/src/XWebViewScreen.tsx | 24 ++++++++++++------------ packages/xwebview/src/XWebViewView.tsx | 17 +++++++---------- 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/packages/common/package.json b/packages/common/package.json index 9a13f5a..26cad39 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -28,6 +28,7 @@ "@react-native-async-storage/async-storage": "^2.1.2", "axios": "^1.7.0", "react": "^19.0.0", + "react-native": "^0.85.0", "zod": "^3.23.0" } } diff --git a/packages/common/src/configCrypto.ts b/packages/common/src/configCrypto.ts index 07b96be..3e9c394 100644 --- a/packages/common/src/configCrypto.ts +++ b/packages/common/src/configCrypto.ts @@ -28,10 +28,15 @@ export interface DecryptedConfig { expiresAt?: string } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function getSubtle(): any { +interface SubtleCryptoLike { + importKey(format: string, keyData: BufferSource, algorithm: string | Record, extractable: boolean, keyUsages: string[]): Promise + deriveKey(algorithm: string | Record, baseKey: CryptoKey, derivedKeyAlgorithm: string | Record, extractable: boolean, keyUsages: string[]): Promise + decrypt(algorithm: string | Record, key: CryptoKey, data: BufferSource): Promise +} + +function getSubtle(): SubtleCryptoLike { // eslint-disable-next-line @typescript-eslint/no-require-imports - const qc = require('react-native-quick-crypto') as any + const qc = require('react-native-quick-crypto') as { subtle?: SubtleCryptoLike; default?: { subtle?: SubtleCryptoLike } } const subtle = qc.subtle ?? qc.default?.subtle if (!subtle) throw new Error('[XuqmSDK] react-native-quick-crypto not available') return subtle @@ -43,8 +48,7 @@ function base64UrlDecode(s: string): Uint8Array { return Uint8Array.from({ length: binary.length }, (_, i) => binary.charCodeAt(i)) } -// eslint-disable-next-line @typescript-eslint/no-explicit-any -async function deriveKey(salt: Uint8Array, passphrase: string): Promise { +async function deriveKey(salt: Uint8Array, passphrase: string): Promise { const subtle = getSubtle() const passphraseKey = await subtle.importKey( 'raw', @@ -54,8 +58,7 @@ async function deriveKey(salt: Uint8Array, passphrase: string): Promise { ['deriveKey'], ) return subtle.deriveKey( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - { name: 'PBKDF2', salt: salt as any, iterations: PBKDF2_ITERATIONS, hash: 'SHA-256' }, + { name: 'PBKDF2', salt: salt as unknown as BufferSource, iterations: PBKDF2_ITERATIONS, hash: 'SHA-256' }, passphraseKey, { name: 'AES-GCM', length: 256 }, false, @@ -76,8 +79,7 @@ export async function decryptConfigFile(content: string): Promise {canGoBack ? ( - + - + ) : null} - + - + ) } @@ -144,20 +144,20 @@ function MenuButton({ if (config.clickMenu) { const { clickMenu } = config return ( - {clickMenu.view ?? } - + ) } return ( - + - + ) } @@ -526,7 +526,7 @@ export function XWebViewScreen() { 页面加载失败 {loadError} - { setLoadError(null) @@ -534,7 +534,7 @@ export function XWebViewScreen() { }} > 重试 - + ) : ( 页面加载失败 {loadError} - { - setLoadError(null) - webViewRef.current?.reload() - }} + webViewRef.current?.reload()} + style={({ pressed }) => [styles.retryBtn, pressed && { opacity: 0.7 }]} > - 重试 - + 点击重试 + ) : (