@unif/react-native-hms-scan 0.5.3 → 0.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +9 -3
  2. package/ReactNativeHmsScan.podspec +5 -14
  3. package/android/src/main/java/com/unif/reactnativehmsscan/HmsScanView.kt +31 -15
  4. package/lib/module/NativeHmsScan.js.map +1 -1
  5. package/lib/module/Scanner/ScanErrorOverlay.js +55 -0
  6. package/lib/module/Scanner/ScanErrorOverlay.js.map +1 -0
  7. package/lib/module/Scanner/Scanner.js +176 -52
  8. package/lib/module/Scanner/Scanner.js.map +1 -1
  9. package/lib/module/decodeImage.js +3 -2
  10. package/lib/module/decodeImage.js.map +1 -1
  11. package/lib/module/index.js +0 -1
  12. package/lib/module/index.js.map +1 -1
  13. package/lib/module/types.js +2 -0
  14. package/lib/module/types.js.map +1 -1
  15. package/lib/typescript/src/HmsScanView.d.ts +3 -6
  16. package/lib/typescript/src/HmsScanView.d.ts.map +1 -1
  17. package/lib/typescript/src/NativeHmsScan.d.ts +3 -1
  18. package/lib/typescript/src/NativeHmsScan.d.ts.map +1 -1
  19. package/lib/typescript/src/Scanner/ScanErrorOverlay.d.ts +7 -0
  20. package/lib/typescript/src/Scanner/ScanErrorOverlay.d.ts.map +1 -0
  21. package/lib/typescript/src/Scanner/Scanner.d.ts +9 -6
  22. package/lib/typescript/src/Scanner/Scanner.d.ts.map +1 -1
  23. package/lib/typescript/src/decodeImage.d.ts +3 -2
  24. package/lib/typescript/src/decodeImage.d.ts.map +1 -1
  25. package/lib/typescript/src/index.d.ts +1 -1
  26. package/lib/typescript/src/index.d.ts.map +1 -1
  27. package/lib/typescript/src/types.d.ts +6 -1
  28. package/lib/typescript/src/types.d.ts.map +1 -1
  29. package/package.json +4 -3
  30. package/src/HmsScanView.tsx +3 -3
  31. package/src/NativeHmsScan.ts +3 -1
  32. package/src/Scanner/ScanErrorOverlay.tsx +51 -0
  33. package/src/Scanner/Scanner.tsx +236 -54
  34. package/src/decodeImage.ts +3 -2
  35. package/src/index.tsx +1 -1
  36. package/src/types.ts +7 -1
  37. package/scripts/prepare-scankit-xcframework.sh +0 -83
package/README.md CHANGED
@@ -11,6 +11,7 @@
11
11
 
12
12
  - **三种用法** — 成品 `<Scanner>` 扫一扫页(自带权限流 / 状态机 / 主题)、headless `<HmsScanView>` 相机组件(自定义 UI)、`decodeImage(uri)` 从本地图片识别。
13
13
  - **Android 内置引擎** — 用 Scan SDK-Plus,**非华为机型可用**,不依赖设备装 HMS Core APK;`scanplus` 由本库声明,宿主需把 Huawei Maven 加到实际参与依赖解析的 `repositories`。
14
+ - **iOS 官方 CocoaPod** — CocoaPods 安装官方 `ScanKitFrameWork 1.1.2.305`,当前只支持真机构建和运行。
14
15
  - **零云端配置** — 两端**都不需要 AppGallery Connect / agconnect / API Key**。
15
16
  - **14 种码制** — `QR_CODE` / `EAN_13` / `CODE_128` / `PDF417` / `DATA_MATRIX` 等,默认识别全部。
16
17
  - 仅支持 **RN 新架构**;`@unif/react-native-design` 风格统一。
@@ -22,6 +23,8 @@ yarn add @unif/react-native-hms-scan react-native-svg
22
23
  cd ios && pod install
23
24
  ```
24
25
 
26
+ CocoaPods 会直接安装官方 `ScanKitFrameWork 1.1.2.305`;`pod install` 不会在 `node_modules` 中生成 XCFramework。iOS Simulator 不属于支持目标。
27
+
25
28
  Android 宿主还必须在实际参与依赖解析的仓库列表中加入 Huawei Maven;库模块自己的 `repositories` 不会传播给 consumer:
26
29
 
27
30
  ```gradle
@@ -66,9 +69,12 @@ headless `<HmsScanView>`(完全自定义 UI)、图片识别 `decodeImage`、权
66
69
 
67
70
  ## 兼容性
68
71
 
69
- - **React Native** 新架构(Fabric + TurboModule)**必须开启**;在 RN 0.85 上开发与验证。
70
- - **Android** minSdkVersion ≥ 24(Android 7.0)。
71
- - **iOS** `ScanKitFrameWork` 相机扫码**仅真机**;simulator 可编译、链接并运行非相机测试。
72
+ | 平台 | 支持 |
73
+ | --- | --- |
74
+ | React Native | 新架构(Fabric + TurboModule)**必须开启**;在 RN 0.85 上开发与验证 |
75
+ | Android | ✅ minSdkVersion ≥ 24(Android 7.0) |
76
+ | iOS | ✅ 官方 CocoaPod `ScanKitFrameWork 1.1.2.305` + 真机 |
77
+ | iOS Simulator | ❌ 不支持;无硬件逻辑测试使用随包 Jest mock |
72
78
 
73
79
  ## 许可
74
80
 
@@ -16,22 +16,13 @@ Pod::Spec.new do |s|
16
16
  s.source_files = "ios/**/*.{h,m,mm,swift,cpp}"
17
17
  s.private_header_files = "ios/**/*.h"
18
18
 
19
- # hms-scan 自己用 AVFoundation(摄像头权限 + torch);UIKit / Foundation 显式声明保险。
20
- # 之前 podspec 缺这个 —— 被 EXCLUDED_ARCHS 排掉模拟器 arm64 编译掩盖了;现在去掉
21
- # EXCLUDED_ARCHS(xcframework 已补 arm64-sim 切片)、arm64 模拟器真编译就暴露了缺链接。
19
+ # hms-scan 使用 AVFoundation(摄像头权限 + torch);
20
+ # UIKit / Foundation 显式声明,避免依赖传递关系。
22
21
  s.frameworks = "AVFoundation", "UIKit", "Foundation"
23
22
 
24
- # 华为 HUAWEI Scan Kit(iOS 自包含,无需 AppGallery Connect / API Key)。
25
- # 提供 HmsCustomScanViewController(定制视图)与 HmsBitMap(图片识别)。
26
- #
27
- # 华为官方 ScanKitFrameWork 1.1.2 是老式 fat framework(arm64 真机 + x86_64 Intel 模拟器),
28
- # 不含 arm64-simulator 切片 → Apple Silicon 模拟器会链接失败(旧版只能 EXCLUDED_ARCHS 排掉、
29
- # 导致模拟器 / CI 编不过)。这里改为:prepare_command 用 Apple 官方 vtool 把真机 arm64
30
- # 改写成 simulator 平台、补出 arm64-sim,打成 xcframework(device 片 / simulator 片分目录)。
31
- # 详见 scripts/prepare-scankit-xcframework.sh。产物 ios/vendor/ 不入 git,pod install 时按需生成。
32
- s.prepare_command = "bash scripts/prepare-scankit-xcframework.sh"
33
- s.vendored_frameworks = "ios/vendor/ScanKitFrameWork.xcframework"
34
- s.resources = "ios/vendor/ScanKitFrameWorkBundle.bundle"
23
+ # Huawei Scan Kit iOS SDK(自包含,无需 AppGallery Connect / API Key)。
24
+ # 当前只支持真机;Simulator 不生成兼容切片。
25
+ s.dependency "ScanKitFrameWork", "1.1.2.305"
35
26
 
36
27
  # 接入 New Architecture(Fabric 组件 + TurboModule)的 codegen 依赖。
37
28
  install_modules_dependencies(s)
@@ -41,6 +41,8 @@ class HmsScanView(
41
41
  // Runtime props (applied to the live RemoteView; stashed until it exists).
42
42
  private var paused: Boolean = false
43
43
  private var torch: Boolean = false
44
+ private var actualTorchOn: Boolean = false
45
+ private var torchAvailable: Boolean = false
44
46
 
45
47
  // True while this view is between onAttachedToWindow and onDetachedFromWindow.
46
48
  private var attached: Boolean = false
@@ -82,10 +84,7 @@ class HmsScanView(
82
84
  if (remoteView == null) {
83
85
  buildRemoteView()
84
86
  }
85
- remoteView?.let {
86
- it.onStart()
87
- it.onResume()
88
- }
87
+ startRemoteView()
89
88
  }
90
89
 
91
90
  override fun onDetachedFromWindow() {
@@ -99,6 +98,8 @@ class HmsScanView(
99
98
  override fun onHostResume() {
100
99
  if (attached) {
101
100
  remoteView?.onResume()
101
+ applyPaused()
102
+ applyTorch()
102
103
  }
103
104
  }
104
105
 
@@ -154,12 +155,18 @@ class HmsScanView(
154
155
  )
155
156
 
156
157
  remoteView = view
158
+ } catch (e: Throwable) {
159
+ emitError("E_CAMERA_INIT", e.message ?: "Failed to initialize camera")
160
+ }
161
+ }
157
162
 
158
- // Apply runtime props that may have arrived before the view existed.
163
+ private fun startRemoteView() {
164
+ remoteView?.let {
165
+ it.onStart()
166
+ it.onResume()
167
+ // RemoteView 进入 active lifecycle 后再落实首次收到的 runtime props。
159
168
  applyPaused()
160
169
  applyTorch()
161
- } catch (e: Throwable) {
162
- emitError("E_CAMERA_INIT", e.message ?: "Failed to initialize camera")
163
170
  }
164
171
  }
165
172
 
@@ -174,6 +181,7 @@ class HmsScanView(
174
181
  }
175
182
  removeView(view)
176
183
  remoteView = null
184
+ actualTorchOn = false
177
185
  }
178
186
 
179
187
  /** Rebuild the RemoteView in place to honour a changed build-time prop. */
@@ -181,10 +189,7 @@ class HmsScanView(
181
189
  if (!attached) return
182
190
  teardownRemoteView()
183
191
  buildRemoteView()
184
- remoteView?.let {
185
- it.onStart()
186
- it.onResume()
187
- }
192
+ startRemoteView()
188
193
  }
189
194
 
190
195
  private fun applyPaused() {
@@ -210,6 +215,7 @@ class HmsScanView(
210
215
  } catch (_: Throwable) {
211
216
  // Ignore: device may have no flash.
212
217
  }
218
+ emitTorchStatus(view)
213
219
  }
214
220
 
215
221
  /** Resolve the hosting Activity required by RemoteView.Builder.setContext(). */
@@ -232,13 +238,23 @@ class HmsScanView(
232
238
  }
233
239
 
234
240
  private fun onTorchVisible(visible: Boolean) {
235
- // Keep our cached torch flag in sync with the actual hardware state.
236
- val on = remoteView?.lightStatus ?: torch
237
- torch = on
241
+ torchAvailable = visible
242
+ val view = remoteView ?: return
243
+ emitTorchStatus(view)
244
+ }
245
+
246
+ private fun emitTorchStatus(view: RemoteView) {
247
+ val on =
248
+ try {
249
+ view.lightStatus
250
+ } catch (_: Throwable) {
251
+ actualTorchOn
252
+ }
253
+ actualTorchOn = on
238
254
  emitEvent(
239
255
  "topTorchStatus",
240
256
  Arguments.createMap().apply {
241
- putBoolean("available", visible)
257
+ putBoolean("available", torchAvailable)
242
258
  putBoolean("on", on)
243
259
  },
244
260
  )
@@ -1 +1 @@
1
- {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeHmsScan.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;;AAElD;AACA;AACA;AACA;;AAiBA,eAAeA,mBAAmB,CAACC,YAAY,CAAO,SAAS,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["TurboModuleRegistry","getEnforcing"],"sourceRoot":"../../src","sources":["NativeHmsScan.ts"],"mappings":";;AACA,SAASA,mBAAmB,QAAQ,cAAc;;AAElD;AACA;AACA;AACA;;AAmBA,eAAeA,mBAAmB,CAACC,YAAY,CAAO,SAAS,CAAC","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+
3
+ import { StyleSheet, View } from 'react-native';
4
+ import { Button, Empty, useThemedStyles, r } from '@unif/react-native-design';
5
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
6
+ export function ScanErrorOverlay({
7
+ onClose,
8
+ onRetry
9
+ }) {
10
+ const s = useThemedStyles(makeStyles);
11
+ return /*#__PURE__*/_jsxs(View, {
12
+ style: s.overlay,
13
+ children: [/*#__PURE__*/_jsx(Empty, {
14
+ icon: "error-alert",
15
+ title: "\u76F8\u673A\u542F\u52A8\u5931\u8D25",
16
+ desc: "\u65E0\u6CD5\u542F\u52A8\u626B\u7801\u76F8\u673A\uFF0C\u8BF7\u786E\u8BA4\u6743\u9650\u4E0E\u8BBE\u5907\u72B6\u6001\u540E\u91CD\u8BD5\u3002"
17
+ }), /*#__PURE__*/_jsxs(View, {
18
+ style: styles.row,
19
+ children: [onClose && /*#__PURE__*/_jsx(Button, {
20
+ label: "\u53D6\u6D88",
21
+ variant: "ghost",
22
+ block: true,
23
+ onPress: onClose
24
+ }), /*#__PURE__*/_jsx(Button, {
25
+ label: "\u91CD\u8BD5",
26
+ variant: "primary",
27
+ block: true,
28
+ onPress: onRetry
29
+ })]
30
+ })]
31
+ });
32
+ }
33
+ const styles = StyleSheet.create({
34
+ row: {
35
+ flexDirection: 'row',
36
+ columnGap: r(12),
37
+ marginTop: r(8)
38
+ }
39
+ });
40
+ const makeStyles = c => StyleSheet.create({
41
+ overlay: {
42
+ position: 'absolute',
43
+ top: 0,
44
+ left: 0,
45
+ right: 0,
46
+ bottom: 0,
47
+ zIndex: 40,
48
+ backgroundColor: c.background,
49
+ alignItems: 'center',
50
+ justifyContent: 'center',
51
+ paddingHorizontal: r(40),
52
+ rowGap: r(8)
53
+ }
54
+ });
55
+ //# sourceMappingURL=ScanErrorOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["StyleSheet","View","Button","Empty","useThemedStyles","r","jsx","_jsx","jsxs","_jsxs","ScanErrorOverlay","onClose","onRetry","s","makeStyles","style","overlay","children","icon","title","desc","styles","row","label","variant","block","onPress","create","flexDirection","columnGap","marginTop","c","position","top","left","right","bottom","zIndex","backgroundColor","background","alignItems","justifyContent","paddingHorizontal","rowGap"],"sourceRoot":"../../../src","sources":["Scanner/ScanErrorOverlay.tsx"],"mappings":";;AAAA,SAASA,UAAU,EAAEC,IAAI,QAAQ,cAAc;AAC/C,SACEC,MAAM,EACNC,KAAK,EACLC,eAAe,EACfC,CAAC,QAEI,2BAA2B;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAOnC,OAAO,SAASC,gBAAgBA,CAAC;EAAEC,OAAO;EAAEC;AAA+B,CAAC,EAAE;EAC5E,MAAMC,CAAC,GAAGT,eAAe,CAACU,UAAU,CAAC;EACrC,oBACEL,KAAA,CAACR,IAAI;IAACc,KAAK,EAAEF,CAAC,CAACG,OAAQ;IAAAC,QAAA,gBACrBV,IAAA,CAACJ,KAAK;MACJe,IAAI,EAAC,aAAa;MAClBC,KAAK,EAAC,sCAAQ;MACdC,IAAI,EAAC;IAAyB,CAC/B,CAAC,eACFX,KAAA,CAACR,IAAI;MAACc,KAAK,EAAEM,MAAM,CAACC,GAAI;MAAAL,QAAA,GACrBN,OAAO,iBAAIJ,IAAA,CAACL,MAAM;QAACqB,KAAK,EAAC,cAAI;QAACC,OAAO,EAAC,OAAO;QAACC,KAAK;QAACC,OAAO,EAAEf;MAAQ,CAAE,CAAC,eACzEJ,IAAA,CAACL,MAAM;QAACqB,KAAK,EAAC,cAAI;QAACC,OAAO,EAAC,SAAS;QAACC,KAAK;QAACC,OAAO,EAAEd;MAAQ,CAAE,CAAC;IAAA,CAC3D,CAAC;EAAA,CACH,CAAC;AAEX;AAEA,MAAMS,MAAM,GAAGrB,UAAU,CAAC2B,MAAM,CAAC;EAC/BL,GAAG,EAAE;IAAEM,aAAa,EAAE,KAAK;IAAEC,SAAS,EAAExB,CAAC,CAAC,EAAE,CAAC;IAAEyB,SAAS,EAAEzB,CAAC,CAAC,CAAC;EAAE;AACjE,CAAC,CAAC;AAEF,MAAMS,UAAU,GAAIiB,CAAc,IAChC/B,UAAU,CAAC2B,MAAM,CAAC;EAChBX,OAAO,EAAE;IACPgB,QAAQ,EAAE,UAAU;IACpBC,GAAG,EAAE,CAAC;IACNC,IAAI,EAAE,CAAC;IACPC,KAAK,EAAE,CAAC;IACRC,MAAM,EAAE,CAAC;IACTC,MAAM,EAAE,EAAE;IACVC,eAAe,EAAEP,CAAC,CAACQ,UAAU;IAC7BC,UAAU,EAAE,QAAQ;IACpBC,cAAc,EAAE,QAAQ;IACxBC,iBAAiB,EAAErC,CAAC,CAAC,EAAE,CAAC;IACxBsC,MAAM,EAAEtC,CAAC,CAAC,CAAC;EACb;AACF,CAAC,CAAC","ignoreList":[]}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
 
3
3
  import { useCallback, useEffect, useRef, useState } from 'react';
4
- import { Linking, StyleSheet, View } from 'react-native';
5
- import { ThemeProvider, ToastHost } from '@unif/react-native-design';
4
+ import { AppState, Linking, StyleSheet, View } from 'react-native';
5
+ import { ThemeProvider } from '@unif/react-native-design';
6
6
  import { HmsScanView } from "../HmsScanView.js";
7
7
  import { decodeImage } from "../decodeImage.js";
8
8
  import { getCameraPermissionStatus, requestCameraPermission } from "../permissions.js";
@@ -13,21 +13,35 @@ import { ScanToolbar } from "./ScanToolbar.js";
13
13
  import { ResultFocus } from "./ResultFocus.js";
14
14
  import { ResultFail } from "./ResultFail.js";
15
15
  import { DeniedOverlay } from "./DeniedOverlay.js";
16
+ import { ScanErrorOverlay } from "./ScanErrorOverlay.js";
16
17
 
17
18
  // 'done':autoConfirm 自动回调后的终态——相机暂停、不出卡片、不自动重扫(宿主通常已导航离开)。
18
19
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
19
20
  const VF_SIZE = 256;
20
21
  const DEFAULT_HINT = '将条码 / 二维码放入框内,自动扫描';
22
+ function toScanError(error, fallbackMessage) {
23
+ if (error && typeof error === 'object') {
24
+ const native = error;
25
+ return {
26
+ code: typeof native.code === 'string' ? native.code : 'E_UNKNOWN',
27
+ message: typeof native.message === 'string' ? native.message : fallbackMessage
28
+ };
29
+ }
30
+ return {
31
+ code: 'E_UNKNOWN',
32
+ message: fallbackMessage
33
+ };
34
+ }
21
35
  /**
22
36
  * 成品「扫一扫」界面(聚焦款)。底层 <HmsScanView> 出相机画面,取景框 / 工具栏 / 结果卡
23
- * 全用 @unif/react-native-design 的主题令牌与组件绘制(统一风格)。自带 ThemeProvider +
24
- * ToastHost,可直接整屏接入;放进宿主已有的 ThemeProvider 里也兼容。
37
+ * 全用 @unif/react-native-design 的主题令牌与组件绘制(统一风格)。自带 ThemeProvider,
38
+ * 可直接整屏接入;放进宿主已有的 ThemeProvider 里也兼容。
25
39
  */
26
40
  export function Scanner(props) {
27
- return /*#__PURE__*/_jsxs(ThemeProvider, {
28
- children: [/*#__PURE__*/_jsx(ScannerInner, {
41
+ return /*#__PURE__*/_jsx(ThemeProvider, {
42
+ children: /*#__PURE__*/_jsx(ScannerInner, {
29
43
  ...props
30
- }), /*#__PURE__*/_jsx(ToastHost, {})]
44
+ })
31
45
  });
32
46
  }
33
47
  function ScannerInner({
@@ -41,59 +55,126 @@ function ScannerInner({
41
55
  resolveProduct,
42
56
  onConfirm,
43
57
  autoConfirm = false,
44
- pickImage
58
+ pickImage,
59
+ onScanError
45
60
  }) {
46
61
  const [phase, setPhase] = useState('init');
47
62
  const [torch, setTorch] = useState(false);
48
63
  const [product, setProduct] = useState(null);
49
64
  const [detectMs, setDetectMs] = useState(0);
65
+ const [scanSession, setScanSession] = useState(0);
50
66
  const handlingRef = useRef(false);
67
+ const acceptingResultsRef = useRef(false);
68
+ const scanSessionRef = useRef(0);
51
69
  const detectStartRef = useRef(0);
52
70
  const lastResultRef = useRef(null);
53
71
  const mountedRef = useRef(true);
72
+ const permissionRunRef = useRef(0);
73
+ const processingRunRef = useRef(0);
74
+ const waitingForSettingsRef = useRef(false);
75
+ const onScanErrorRef = useRef(onScanError);
76
+ onScanErrorRef.current = onScanError;
77
+ const invalidateProcessing = useCallback(() => {
78
+ ++processingRunRef.current;
79
+ }, []);
80
+ const invalidateScanSession = useCallback(() => {
81
+ ++scanSessionRef.current;
82
+ acceptingResultsRef.current = false;
83
+ }, []);
84
+ const enterScan = useCallback(() => {
85
+ invalidateProcessing();
86
+ handlingRef.current = false;
87
+ const sessionId = ++scanSessionRef.current;
88
+ acceptingResultsRef.current = true;
89
+ setScanSession(sessionId);
90
+ setProduct(null);
91
+ lastResultRef.current = null;
92
+ setPhase('scan');
93
+ }, [invalidateProcessing]);
94
+ const enterDenied = useCallback(() => {
95
+ ++permissionRunRef.current;
96
+ invalidateProcessing();
97
+ invalidateScanSession();
98
+ setProduct(null);
99
+ setPhase('denied');
100
+ }, [invalidateProcessing, invalidateScanSession]);
101
+ const reportFatalError = useCallback(error => {
102
+ // fatal 后不允许已在途的权限检查或扫码 / 相册处理链覆盖 error phase。
103
+ ++permissionRunRef.current;
104
+ invalidateProcessing();
105
+ invalidateScanSession();
106
+ setProduct(null);
107
+ setPhase('error');
108
+ onScanErrorRef.current?.(error);
109
+ }, [invalidateProcessing, invalidateScanSession]);
110
+ const runPermissionFlow = useCallback(async requestIfNeeded => {
111
+ const runId = ++permissionRunRef.current;
112
+ const isCurrent = () => mountedRef.current && permissionRunRef.current === runId;
113
+ try {
114
+ let status = await getCameraPermissionStatus();
115
+ if (!isCurrent()) return;
116
+ if (requestIfNeeded && (status === 'undetermined' || status === 'denied')) {
117
+ status = await requestCameraPermission();
118
+ if (!isCurrent()) return;
119
+ }
120
+ if (status === 'granted') {
121
+ enterScan();
122
+ } else {
123
+ enterDenied();
124
+ }
125
+ } catch (error) {
126
+ if (!isCurrent()) return;
127
+ reportFatalError(toScanError(error, '检查相机权限失败'));
128
+ }
129
+ }, [enterDenied, enterScan, reportFatalError]);
54
130
 
55
131
  // 权限流:已授权 → scan;否则请求;仍未授权 → denied。
56
132
  useEffect(() => {
57
133
  mountedRef.current = true;
58
- (async () => {
59
- try {
60
- let status = await getCameraPermissionStatus();
61
- if (status === 'undetermined' || status === 'denied') {
62
- status = await requestCameraPermission();
63
- }
64
- if (!mountedRef.current) return;
65
- setPhase(status === 'granted' ? 'scan' : 'denied');
66
- } catch {
67
- if (mountedRef.current) setPhase('scan');
68
- }
69
- })();
134
+ void runPermissionFlow(true);
70
135
  return () => {
71
136
  mountedRef.current = false;
137
+ ++permissionRunRef.current;
138
+ invalidateProcessing();
139
+ invalidateScanSession();
72
140
  };
73
- }, []);
141
+ }, [invalidateProcessing, invalidateScanSession, runPermissionFlow]);
142
+ useEffect(() => {
143
+ const subscription = AppState.addEventListener('change', nextState => {
144
+ if (nextState === 'active' && waitingForSettingsRef.current) {
145
+ waitingForSettingsRef.current = false;
146
+ void runPermissionFlow(false);
147
+ }
148
+ });
149
+ return () => subscription.remove();
150
+ }, [runPermissionFlow]);
151
+ useEffect(() => {
152
+ if (!showTorch) setTorch(false);
153
+ }, [showTorch]);
74
154
  const reset = useCallback(() => {
75
- handlingRef.current = false;
76
- setProduct(null);
77
- setPhase('scan');
78
- }, []);
79
- const finalize = useCallback(async result => {
155
+ enterScan();
156
+ }, [enterScan]);
157
+ const finalize = useCallback(async (result, runId) => {
158
+ const isCurrent = () => mountedRef.current && processingRunRef.current === runId;
159
+ if (!isCurrent()) return;
80
160
  lastResultRef.current = result;
81
161
  try {
82
162
  const resolved = resolveProduct ? await resolveProduct(result) : {
83
163
  name: result.value
84
164
  };
85
- if (!mountedRef.current) return;
165
+ if (!isCurrent()) return;
86
166
  if (!resolved) {
87
167
  setPhase('fail');
88
168
  return;
89
169
  }
90
170
  const p = {
91
- barcode: result.value,
92
- ...resolved
171
+ ...resolved,
172
+ barcode: resolved.barcode ?? result.value
93
173
  };
94
- if (autoConfirm) {
174
+ if (autoConfirm && onConfirm) {
95
175
  // 跳过结果卡:直接回调,进 'done' 终态(相机暂停、不自动重扫)。
96
- onConfirm?.(p, result);
176
+ onConfirm(p, result);
177
+ if (!isCurrent()) return;
97
178
  setPhase('done');
98
179
  return;
99
180
  }
@@ -101,46 +182,85 @@ function ScannerInner({
101
182
  setDetectMs(Date.now() - detectStartRef.current);
102
183
  setPhase('success');
103
184
  } catch {
104
- if (mountedRef.current) setPhase('fail');
185
+ if (isCurrent()) setPhase('fail');
105
186
  }
106
187
  }, [resolveProduct, autoConfirm, onConfirm]);
107
188
  const onCameraResult = useCallback(results => {
108
- if (phase !== 'scan' || handlingRef.current) return;
189
+ if (scanSession !== scanSessionRef.current || phase !== 'scan' || !acceptingResultsRef.current || handlingRef.current) {
190
+ return;
191
+ }
109
192
  const first = results[0];
110
193
  if (!first) return;
194
+ acceptingResultsRef.current = false;
111
195
  handlingRef.current = true;
196
+ const runId = ++processingRunRef.current;
112
197
  detectStartRef.current = Date.now();
113
198
  setPhase('detecting');
114
- void finalize(first);
115
- }, [phase, finalize]);
116
- const onScanError = useCallback(error => {
117
- if (error.code === 'E_NO_CAMERA_PERMISSION') setPhase('denied');
199
+ void finalize(first, runId);
200
+ }, [phase, scanSession, finalize]);
201
+ const handleViewScanError = useCallback(error => {
202
+ if (error.code === 'E_NO_CAMERA_PERMISSION') {
203
+ enterDenied();
204
+ } else if (error.code !== 'E_NO_RESULT') {
205
+ reportFatalError(error);
206
+ return;
207
+ }
208
+ onScanErrorRef.current?.(error);
209
+ }, [enterDenied, reportFatalError]);
210
+ const onTorchStatus = useCallback(status => {
211
+ setTorch(status.on);
118
212
  }, []);
213
+ const openSettings = useCallback(async () => {
214
+ waitingForSettingsRef.current = true;
215
+ try {
216
+ await Linking.openSettings();
217
+ } catch (error) {
218
+ waitingForSettingsRef.current = false;
219
+ if (mountedRef.current) {
220
+ reportFatalError(toScanError(error, '打开系统设置失败'));
221
+ }
222
+ }
223
+ }, [reportFatalError]);
224
+ const retryCamera = useCallback(() => {
225
+ invalidateProcessing();
226
+ invalidateScanSession();
227
+ handlingRef.current = false;
228
+ setProduct(null);
229
+ lastResultRef.current = null;
230
+ setPhase('init');
231
+ void runPermissionFlow(true);
232
+ }, [invalidateProcessing, invalidateScanSession, runPermissionFlow]);
119
233
  const onAlbum = useCallback(async () => {
120
- if (!pickImage || handlingRef.current) return;
234
+ if (!pickImage || !acceptingResultsRef.current || handlingRef.current) {
235
+ return;
236
+ }
237
+ acceptingResultsRef.current = false;
238
+ handlingRef.current = true;
239
+ const runId = ++processingRunRef.current;
240
+ const isCurrent = () => mountedRef.current && processingRunRef.current === runId;
241
+ setPhase('detecting');
121
242
  try {
122
243
  const uri = await pickImage();
123
- if (!uri || !mountedRef.current) return;
124
- handlingRef.current = true;
244
+ if (!isCurrent()) return;
245
+ if (!uri) {
246
+ reset();
247
+ return;
248
+ }
125
249
  detectStartRef.current = Date.now();
126
- setPhase('detecting');
127
250
  const results = await decodeImage(uri, formats ? {
128
251
  formats
129
252
  } : undefined);
130
- if (!mountedRef.current) return;
253
+ if (!isCurrent()) return;
131
254
  const first = results[0];
132
255
  if (!first) {
133
256
  setPhase('fail');
134
257
  return;
135
258
  }
136
- await finalize(first);
259
+ await finalize(first, runId);
137
260
  } catch {
138
- if (mountedRef.current) {
139
- handlingRef.current = true;
140
- setPhase('fail');
141
- }
261
+ if (isCurrent()) setPhase('fail');
142
262
  }
143
- }, [pickImage, formats, finalize]);
263
+ }, [pickImage, formats, finalize, reset]);
144
264
  const onConfirmPress = useCallback(() => {
145
265
  const r = lastResultRef.current;
146
266
  const p = product;
@@ -152,18 +272,19 @@ function ScannerInner({
152
272
  const showChrome = phase === 'scan' || phase === 'detecting';
153
273
  return /*#__PURE__*/_jsxs(View, {
154
274
  style: styles.root,
155
- children: [phase !== 'denied' && phase !== 'init' && /*#__PURE__*/_jsx(HmsScanView, {
275
+ children: [phase !== 'denied' && phase !== 'init' && phase !== 'error' && /*#__PURE__*/_jsx(HmsScanView, {
156
276
  style: StyleSheet.absoluteFill,
157
277
  formats: formats,
158
278
  paused: phase !== 'scan',
159
279
  torch: torch,
160
280
  onScanResult: onCameraResult,
161
- onScanError: onScanError
281
+ onScanError: handleViewScanError,
282
+ onTorchStatus: onTorchStatus
162
283
  }), showChrome && /*#__PURE__*/_jsx(Viewfinder, {
163
284
  size: VF_SIZE,
164
285
  detecting: phase === 'detecting',
165
286
  hintText: hintText
166
- }), phase !== 'denied' && phase !== 'init' && /*#__PURE__*/_jsx(ScanTopBar, {
287
+ }), phase !== 'denied' && phase !== 'init' && phase !== 'error' && /*#__PURE__*/_jsx(ScanTopBar, {
167
288
  title: title,
168
289
  topInset: topInset
169
290
  }), showChrome && (showTorch || !!pickImage || !!onClose) && /*#__PURE__*/_jsx(ScanToolbar, {
@@ -181,9 +302,12 @@ function ScannerInner({
181
302
  }), phase === 'fail' && /*#__PURE__*/_jsx(ResultFail, {
182
303
  bottomInset: bottomInset,
183
304
  onRescan: reset
305
+ }), phase === 'error' && /*#__PURE__*/_jsx(ScanErrorOverlay, {
306
+ onClose: onClose,
307
+ onRetry: retryCamera
184
308
  }), phase === 'denied' && /*#__PURE__*/_jsx(DeniedOverlay, {
185
309
  onClose: onClose,
186
- onSettings: () => Linking.openSettings()
310
+ onSettings: openSettings
187
311
  })]
188
312
  });
189
313
  }
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useRef","useState","Linking","StyleSheet","View","ThemeProvider","ToastHost","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","scanChrome","Viewfinder","ScanTopBar","ScanToolbar","ResultFocus","ResultFail","DeniedOverlay","jsx","_jsx","jsxs","_jsxs","VF_SIZE","DEFAULT_HINT","Scanner","props","children","ScannerInner","title","formats","hintText","topInset","bottomInset","showTorch","onClose","resolveProduct","onConfirm","autoConfirm","pickImage","phase","setPhase","torch","setTorch","product","setProduct","detectMs","setDetectMs","handlingRef","detectStartRef","lastResultRef","mountedRef","current","status","reset","finalize","result","resolved","name","value","p","barcode","Date","now","onCameraResult","results","first","onScanError","error","code","onAlbum","uri","undefined","onConfirmPress","r","showChrome","style","styles","root","absoluteFill","paused","onScanResult","size","detecting","flash","onFlash","t","onRescan","onSettings","openSettings","create","flex","backgroundColor","cameraBg"],"sourceRoot":"../../../src","sources":["Scanner/Scanner.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useRef","useState","AppState","Linking","StyleSheet","View","ThemeProvider","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","scanChrome","Viewfinder","ScanTopBar","ScanToolbar","ResultFocus","ResultFail","DeniedOverlay","ScanErrorOverlay","jsx","_jsx","jsxs","_jsxs","VF_SIZE","DEFAULT_HINT","toScanError","error","fallbackMessage","native","code","message","Scanner","props","children","ScannerInner","title","formats","hintText","topInset","bottomInset","showTorch","onClose","resolveProduct","onConfirm","autoConfirm","pickImage","onScanError","phase","setPhase","torch","setTorch","product","setProduct","detectMs","setDetectMs","scanSession","setScanSession","handlingRef","acceptingResultsRef","scanSessionRef","detectStartRef","lastResultRef","mountedRef","permissionRunRef","processingRunRef","waitingForSettingsRef","onScanErrorRef","current","invalidateProcessing","invalidateScanSession","enterScan","sessionId","enterDenied","reportFatalError","runPermissionFlow","requestIfNeeded","runId","isCurrent","status","subscription","addEventListener","nextState","remove","reset","finalize","result","resolved","name","value","p","barcode","Date","now","onCameraResult","results","first","handleViewScanError","onTorchStatus","on","openSettings","retryCamera","onAlbum","uri","undefined","onConfirmPress","r","showChrome","style","styles","root","absoluteFill","paused","onScanResult","size","detecting","flash","onFlash","t","onRescan","onRetry","onSettings","create","flex","backgroundColor","cameraBg"],"sourceRoot":"../../../src","sources":["Scanner/Scanner.tsx"],"mappings":"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","ignoreList":[]}
@@ -7,8 +7,9 @@ import { HmsScanError } from "./types.js";
7
7
  /**
8
8
  * 从本地图片解码条码 / 二维码(华为 Bitmap 模式)。
9
9
  *
10
- * @param uri 本地图片:file:// / content:// / ph:// / 绝对路径。**不下载远程 URL**,
11
- * 如需识别网络图请宿主先下载到本地再传入。
10
+ * @param uri 本地图片。iOS 支持 file://、绝对路径、data:;Android 支持
11
+ * file://、绝对路径、content://、android.resource://。
12
+ * 两端都不下载远程 URL,也不支持 ph:// / assets-library://。
12
13
  * @param options 可选;formats 限定码制,不传 = 全部。
13
14
  * @returns 命中的结果数组(可能为空)。
14
15
  * @throws HmsScanError 图片加载失败 / 读权限缺失等。
@@ -1 +1 @@
1
- {"version":3,"names":["NativeHmsScan","formatsToCsv","parseResultsJson","HmsScanError","decodeImage","uri","options","json","formats","e","err","code","message"],"sourceRoot":"../../src","sources":["decodeImage.ts"],"mappings":";;AAAA,OAAOA,aAAa,MAAM,oBAAiB;AAC3C,SAASC,YAAY,EAAEC,gBAAgB,QAAQ,aAAU;AACzD,SAASC,YAAY,QAAkD,YAAS;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,WAAWA,CAC/BC,GAAW,EACXC,OAA4B,EACL;EACvB,IAAI,CAACD,GAAG,EAAE;IACR,MAAM,IAAIF,YAAY,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;EACxE;EACA,IAAI;IACF,MAAMI,IAAI,GAAG,MAAMP,aAAa,CAACI,WAAW,CAACC,GAAG,EAAEJ,YAAY,CAACK,OAAO,EAAEE,OAAO,CAAC,CAAC;IACjF,OAAON,gBAAgB,CAACK,IAAI,CAAC;EAC/B,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV;IACA,MAAMC,GAAG,GAAGD,CAAwC;IACpD,IACEC,GAAG,CAACC,IAAI,KAAK,sBAAsB,IACnCD,GAAG,CAACC,IAAI,KAAK,qBAAqB,IAClCD,GAAG,CAACC,IAAI,KAAK,iBAAiB,EAC9B;MACA,MAAM,IAAIR,YAAY,CAACO,GAAG,CAACC,IAAI,EAAED,GAAG,CAACE,OAAO,CAAC;IAC/C;IACA,MAAM,IAAIT,YAAY,CAAC,WAAW,EAAEO,GAAG,CAACE,OAAO,IAAI,oBAAoB,CAAC;EAC1E;AACF","ignoreList":[]}
1
+ {"version":3,"names":["NativeHmsScan","formatsToCsv","parseResultsJson","HmsScanError","decodeImage","uri","options","json","formats","e","err","code","message"],"sourceRoot":"../../src","sources":["decodeImage.ts"],"mappings":";;AAAA,OAAOA,aAAa,MAAM,oBAAiB;AAC3C,SAASC,YAAY,EAAEC,gBAAgB,QAAQ,aAAU;AACzD,SAASC,YAAY,QAAkD,YAAS;;AAEhF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,WAAWA,CAC/BC,GAAW,EACXC,OAA4B,EACL;EACvB,IAAI,CAACD,GAAG,EAAE;IACR,MAAM,IAAIF,YAAY,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;EACxE;EACA,IAAI;IACF,MAAMI,IAAI,GAAG,MAAMP,aAAa,CAACI,WAAW,CAACC,GAAG,EAAEJ,YAAY,CAACK,OAAO,EAAEE,OAAO,CAAC,CAAC;IACjF,OAAON,gBAAgB,CAACK,IAAI,CAAC;EAC/B,CAAC,CAAC,OAAOE,CAAC,EAAE;IACV;IACA,MAAMC,GAAG,GAAGD,CAAwC;IACpD,IACEC,GAAG,CAACC,IAAI,KAAK,sBAAsB,IACnCD,GAAG,CAACC,IAAI,KAAK,qBAAqB,IAClCD,GAAG,CAACC,IAAI,KAAK,iBAAiB,EAC9B;MACA,MAAM,IAAIR,YAAY,CAACO,GAAG,CAACC,IAAI,EAAED,GAAG,CAACE,OAAO,CAAC;IAC/C;IACA,MAAM,IAAIT,YAAY,CAAC,WAAW,EAAEO,GAAG,CAACE,OAAO,IAAI,oBAAoB,CAAC;EAC1E;AACF","ignoreList":[]}
@@ -2,7 +2,6 @@
2
2
 
3
3
  // @unif/react-native-hms-scan —— 华为 HMS 统一扫码服务 RN bridge(Fabric 新架构)
4
4
  // 能力:定制视图扫码(底层 <HmsScanView> + 成品 <Scanner> 扫一扫页)+ 图片识别(decodeImage)+ 相机权限。
5
- // 0.2.1:package.json#files 补 scripts/,修 pod install 缺 prepare-scankit-xcframework.sh(podspec prepare_command 调用)。
6
5
  // 文档站:https://unif-design.github.io/react-native-hms-scan/(版本随发版自动部署)。
7
6
 
8
7
  // ── 类型与常量 ──