@unif/react-native-hms-scan 0.5.2 → 0.5.4

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.
package/README.md CHANGED
@@ -10,7 +10,8 @@
10
10
  ## 特性
11
11
 
12
12
  - **三种用法** — 成品 `<Scanner>` 扫一扫页(自带权限流 / 状态机 / 主题)、headless `<HmsScanView>` 相机组件(自定义 UI)、`decodeImage(uri)` 从本地图片识别。
13
- - **Android 内置引擎** — 用 Scan SDK-Plus,**非华为机型可用**,不依赖设备装 HMS Core APK;华为 maven 与依赖已内置在库里,宿主无需改 gradle。
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,7 +23,19 @@ yarn add @unif/react-native-hms-scan react-native-svg
22
23
  cd ios && pod install
23
24
  ```
24
25
 
25
- `react-native-svg` 是 peer 依赖(`<Scanner>` 图标用它绘制);`<Scanner>` 还依赖 peer `@unif/react-native-design`。宿主需开启新架构。Android 权限、iOS `NSCameraUsageDescription` 等见[文档站 · 安装](https://unif-design.github.io/react-native-hms-scan/docs/getting-started/installation)。
26
+ CocoaPods 会直接安装官方 `ScanKitFrameWork 1.1.2.305`;`pod install` 不会在 `node_modules` 中生成 XCFramework。iOS Simulator 不属于支持目标。
27
+
28
+ Android 宿主还必须在实际参与依赖解析的仓库列表中加入 Huawei Maven;库模块自己的 `repositories` 不会传播给 consumer:
29
+
30
+ ```gradle
31
+ allprojects {
32
+ repositories {
33
+ maven { url 'https://developer.huawei.com/repo/' }
34
+ }
35
+ }
36
+ ```
37
+
38
+ `react-native-svg` 是 peer 依赖(`<Scanner>` 图标用它绘制);`<Scanner>` 还依赖 peer `@unif/react-native-design`。宿主需开启新架构。完整 peer dependencies、Android 权限、iOS `NSCameraUsageDescription` 等见[文档站 · 安装](https://unif-design.github.io/react-native-hms-scan/docs/getting-started/installation)。
26
39
 
27
40
  ## 快速开始
28
41
 
@@ -52,13 +65,16 @@ headless `<HmsScanView>`(完全自定义 UI)、图片识别 `decodeImage`、权
52
65
 
53
66
  - **完整文档**(安装 · 平台配置 · API · 平台差异 · 故障排查):https://unif-design.github.io/react-native-hms-scan/
54
67
  - **AI / Agent**(按需 fetch,别凭记忆猜 API):[llms.txt](https://unif-design.github.io/react-native-hms-scan/llms.txt) · [llms-full.txt](https://unif-design.github.io/react-native-hms-scan/llms-full.txt)
55
- - **Agent Skill** `unif-hms-scan`(`unif` plugin):`/plugin marketplace add unif-design/skills` → `/plugin install unif@unif-skills`
68
+ - **Agent Skill** `hms-scan`(`unif` plugin):`/plugin marketplace add unif-design/skills` → `/plugin install unif@skills`
56
69
 
57
70
  ## 兼容性
58
71
 
59
- - **React Native** 新架构(Fabric + TurboModule)**必须开启**;在 RN 0.85 上开发与验证。
60
- - **Android** minSdkVersion ≥ 24(Android 7.0)。
61
- - **iOS** `ScanKitFrameWork` 扫码功能**仅真机**(模拟器可编译,相机要真机)。
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 |
62
78
 
63
79
  ## 许可
64
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)
@@ -4,7 +4,7 @@ import { forwardRef } from 'react';
4
4
  import NativeHmsScanView from './HmsScanViewNativeComponent';
5
5
  import { formatsToCsv, parseResultsJson } from "./format.js";
6
6
 
7
- /** 暗光提示 / 手电状态。 */
7
+ /** 平台相关的暗光提示 / 手电状态。 */
8
8
  import { jsx as _jsx } from "react/jsx-runtime";
9
9
  /**
10
10
  * 底层 headless 扫码相机组件:只渲染相机预览并发出扫码结果事件。
@@ -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
  // ── 类型与常量 ──
@@ -1 +1 @@
1
- {"version":3,"names":["ALL_BARCODE_FORMATS","HmsScanError","coerceFormat","coerceContentType","formatsToCsv","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","Scanner"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA;AACA,SACEA,mBAAmB,EACnBC,YAAY,QACP,YAAS;AAYhB;AACA,SAASC,YAAY,EAAEC,iBAAiB,EAAEC,YAAY,QAAQ,aAAU;;AAExE;AACA,SAASC,WAAW,QAAQ,kBAAe;AAG3C;AACA,SAASC,WAAW,QAAQ,kBAAe;;AAE3C;AACA,SAASC,yBAAyB,EAAEC,uBAAuB,QAAQ,kBAAe;;AAElF;AACA,SAASC,OAAO,QAAQ,sBAAmB","ignoreList":[]}
1
+ {"version":3,"names":["ALL_BARCODE_FORMATS","HmsScanError","coerceFormat","coerceContentType","formatsToCsv","HmsScanView","decodeImage","getCameraPermissionStatus","requestCameraPermission","Scanner"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA;AACA;AACA;;AAEA;AACA,SACEA,mBAAmB,EACnBC,YAAY,QACP,YAAS;AAYhB;AACA,SAASC,YAAY,EAAEC,iBAAiB,EAAEC,YAAY,QAAQ,aAAU;;AAExE;AACA,SAASC,WAAW,QAAQ,kBAAe;AAG3C;AACA,SAASC,WAAW,QAAQ,kBAAe;;AAE3C;AACA,SAASC,yBAAyB,EAAEC,uBAAuB,QAAQ,kBAAe;;AAElF;AACA,SAASC,OAAO,QAAQ,sBAAmB","ignoreList":[]}
@@ -1,8 +1,8 @@
1
1
  import type { ViewProps } from 'react-native';
2
2
  import type { BarcodeFormat, ScanResult } from './types';
3
- /** 暗光提示 / 手电状态。 */
3
+ /** 平台相关的暗光提示 / 手电状态。 */
4
4
  export interface TorchStatus {
5
- /** 环境暗到建议显示手电按钮(仅 Android 上报)。 */
5
+ /** Android:环境暗光提示;iOS:设备是否有手电硬件。 */
6
6
  available: boolean;
7
7
  /** 手电当前是否点亮。 */
8
8
  on: boolean;
@@ -23,7 +23,7 @@ export interface HmsScanViewProps extends ViewProps {
23
23
  code: string;
24
24
  message: string;
25
25
  }) => void;
26
- /** 暗光提示 / 手电状态变化时回调。 */
26
+ /** Android 暗光提示或 iOS 手电硬件 / 点亮状态变化时回调。 */
27
27
  onTorchStatus?: (status: TorchStatus) => void;
28
28
  }
29
29
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"HmsScanView.d.ts","sourceRoot":"","sources":["../../../src/HmsScanView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzD,mBAAmB;AACnB,MAAM,WAAW,WAAW;IAC1B,kCAAkC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,oBAAoB;IACpB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,oBAAoB;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC/C,kBAAkB;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACjE,wBAAwB;IACxB,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,iOAiDtB,CAAC"}
1
+ {"version":3,"file":"HmsScanView.d.ts","sourceRoot":"","sources":["../../../src/HmsScanView.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEzD,wBAAwB;AACxB,MAAM,WAAW,WAAW;IAC1B,oCAAoC;IACpC,SAAS,EAAE,OAAO,CAAC;IACnB,gBAAgB;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED,MAAM,WAAW,gBAAiB,SAAQ,SAAS;IACjD,oBAAoB;IACpB,OAAO,CAAC,EAAE,aAAa,EAAE,CAAC;IAC1B,oBAAoB;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4BAA4B;IAC5B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC/C,kBAAkB;IAClB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACjE,0CAA0C;IAC1C,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;CAC/C;AAED;;;;;GAKG;AACH,eAAO,MAAM,WAAW,iOAiDtB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAMA,OAAO,EACL,mBAAmB,EACnB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGnF,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.tsx"],"names":[],"mappings":"AAKA,OAAO,EACL,mBAAmB,EACnB,YAAY,GACb,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGzE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAGnE,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,eAAe,CAAC;AAGnF,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@unif/react-native-hms-scan",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "华为 HMS 统一扫码服务 React Native bridge:定制视图扫码 + 图片识别 (Scan SDK-Plus / ScanKitFrameWork,@unif 私有)",
5
5
  "main": "./lib/module/index.js",
6
6
  "types": "./lib/typescript/src/index.d.ts",
@@ -24,7 +24,6 @@
24
24
  "ios",
25
25
  "*.podspec",
26
26
  "react-native.config.js",
27
- "scripts",
28
27
  "!ios/build",
29
28
  "!android/build",
30
29
  "!android/gradle",
@@ -41,7 +40,8 @@
41
40
  "clean": "del-cli android/build example/android/build example/android/app/build example/ios/build lib",
42
41
  "prepare": "bob build",
43
42
  "typecheck": "tsc",
44
- "test": "jest",
43
+ "test": "yarn verify:ios-integration && jest",
44
+ "verify:ios-integration": "node scripts/verify-ios-integration.mjs",
45
45
  "lint": "eslint \"**/*.{js,ts,tsx}\""
46
46
  },
47
47
  "keywords": [
@@ -4,9 +4,9 @@ import NativeHmsScanView from './HmsScanViewNativeComponent';
4
4
  import { formatsToCsv, parseResultsJson } from './format';
5
5
  import type { BarcodeFormat, ScanResult } from './types';
6
6
 
7
- /** 暗光提示 / 手电状态。 */
7
+ /** 平台相关的暗光提示 / 手电状态。 */
8
8
  export interface TorchStatus {
9
- /** 环境暗到建议显示手电按钮(仅 Android 上报)。 */
9
+ /** Android:环境暗光提示;iOS:设备是否有手电硬件。 */
10
10
  available: boolean;
11
11
  /** 手电当前是否点亮。 */
12
12
  on: boolean;
@@ -25,7 +25,7 @@ export interface HmsScanViewProps extends ViewProps {
25
25
  onScanResult?: (results: ScanResult[]) => void;
26
26
  /** 相机/解码出错时回调。 */
27
27
  onScanError?: (error: { code: string; message: string }) => void;
28
- /** 暗光提示 / 手电状态变化时回调。 */
28
+ /** Android 暗光提示或 iOS 手电硬件 / 点亮状态变化时回调。 */
29
29
  onTorchStatus?: (status: TorchStatus) => void;
30
30
  }
31
31
 
package/src/index.tsx CHANGED
@@ -1,6 +1,5 @@
1
1
  // @unif/react-native-hms-scan —— 华为 HMS 统一扫码服务 RN bridge(Fabric 新架构)
2
2
  // 能力:定制视图扫码(底层 <HmsScanView> + 成品 <Scanner> 扫一扫页)+ 图片识别(decodeImage)+ 相机权限。
3
- // 0.2.1:package.json#files 补 scripts/,修 pod install 缺 prepare-scankit-xcframework.sh(podspec prepare_command 调用)。
4
3
  // 文档站:https://unif-design.github.io/react-native-hms-scan/(版本随发版自动部署)。
5
4
 
6
5
  // ── 类型与常量 ──
@@ -1,83 +0,0 @@
1
- #!/usr/bin/env bash
2
- #
3
- # 生成含 arm64-simulator 切片的 ScanKitFrameWork.xcframework(+ 资源 bundle)。
4
- #
5
- # 背景:华为官方 ScanKitFrameWork 1.1.2 是 2020 年前的老式 fat framework
6
- # (arm64 = 真机 / x86_64 = Intel 模拟器,LC_VERSION_MIN_IPHONEOS 标记),
7
- # 不含 arm64-simulator 切片。Apple Silicon(M 芯片)的 iOS 模拟器是 arm64-sim,
8
- # 会因缺这一片而链接失败(旧 podspec 只能 EXCLUDED_ARCHS 排掉、导致模拟器编不过)。
9
- #
10
- # 这里用 Apple 官方 vtool 把真机 arm64 改写成 simulator 平台、补出 arm64-sim,
11
- # 再 lipo 合并 x86_64,最后 xcodebuild -create-xcframework 打成 xcframework
12
- # (device 片 / simulator 片分目录,fat binary 不允许同 arch 共存)。
13
- #
14
- # vtool 转出来的 sim 片仅用于编译/链接(CI、模拟器跑通);真机仍走 device 片。
15
- # 模拟器上真去调摄像头硬件会崩,但模拟器本无扫码硬件场景,不影响。
16
- #
17
- # 由 ReactNativeHmsScan.podspec 的 prepare_command 在 pod install 时调用。
18
- # 产物 ios/vendor/ 不入 git —— 按需生成(已生成则跳过)。
19
- #
20
- set -euo pipefail
21
-
22
- OUT_DIR="ios/vendor"
23
- XCFW="$OUT_DIR/ScanKitFrameWork.xcframework"
24
- BUNDLE="$OUT_DIR/ScanKitFrameWorkBundle.bundle"
25
-
26
- # 华为官方 Scan SDK-Plus iOS 工具包(scansdk-ios-tool 1.1.0.305)。
27
- # URL 取自 ScanKitFrameWork 的 CocoaPods spec(source.http),带 10 年签名有效期。
28
- ZIP_URL="https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_package_901_9/eb/v3/FoQltlwsS0Ge-TitlHPL3A/scansdk-ios-tool-1.1.0.305.zip?HW-CC-KV=V1&HW-CC-Date=20230321T064901Z&HW-CC-Expire=315360000&HW-CC-Sign=C23A0122B070535FDFA38C56BA62E25E6BE66582D963B8C7F5DDF4FCA5C34CFF"
29
-
30
- # 只在 macOS 生成(需 lipo / vtool / xcodebuild);Android 等平台的 pod install 直接跳过。
31
- if [ "$(uname)" != "Darwin" ]; then
32
- echo "[scankit] 非 macOS,跳过 xcframework 生成"
33
- exit 0
34
- fi
35
-
36
- # 已生成且两个平台切片齐全 → 跳过(避免每次 pod install 重复下载几十 MB)。
37
- if [ -d "$XCFW/ios-arm64" ] && [ -d "$XCFW/ios-arm64_x86_64-simulator" ] && [ -d "$BUNDLE" ]; then
38
- echo "[scankit] xcframework 已存在,跳过"
39
- exit 0
40
- fi
41
-
42
- echo "[scankit] 下载华为 Scan SDK ..."
43
- TMP="$(mktemp -d)"
44
- trap 'rm -rf "$TMP"' EXIT
45
- curl -fsSL "$ZIP_URL" -o "$TMP/sdk.zip"
46
- unzip -q "$TMP/sdk.zip" -d "$TMP/sdk"
47
-
48
- SRC_FW="$(find "$TMP/sdk" -type d -name 'ScanKitFrameWork.framework' | head -1)"
49
- SRC_BUNDLE="$(find "$TMP/sdk" -type d -name 'ScanKitFrameWorkBundle.bundle' | head -1)"
50
- if [ -z "$SRC_FW" ]; then
51
- echo "[scankit] ✗ 解压后未找到 ScanKitFrameWork.framework" >&2
52
- exit 1
53
- fi
54
- BIN="$SRC_FW/ScanKitFrameWork"
55
-
56
- echo "[scankit] 拆片 + vtool 补 arm64-simulator + 组 xcframework ..."
57
- mkdir -p "$TMP/device" "$TMP/sim"
58
-
59
- # device:真机 arm64
60
- cp -R "$SRC_FW" "$TMP/device/ScanKitFrameWork.framework"
61
- lipo "$BIN" -thin arm64 -output "$TMP/device/ScanKitFrameWork.framework/ScanKitFrameWork"
62
-
63
- # simulator:arm64(真机片经 vtool 改写成 simulator 平台 7)+ x86_64(原 Intel 模拟器片)
64
- cp -R "$SRC_FW" "$TMP/sim/ScanKitFrameWork.framework"
65
- lipo "$BIN" -thin arm64 -output "$TMP/a64d"
66
- vtool -arch arm64 -set-build-version 7 13.5 13.5 -replace -output "$TMP/a64s" "$TMP/a64d"
67
- lipo "$BIN" -thin x86_64 -output "$TMP/x86"
68
- lipo -create "$TMP/a64s" "$TMP/x86" -output "$TMP/sim/ScanKitFrameWork.framework/ScanKitFrameWork"
69
-
70
- mkdir -p "$OUT_DIR"
71
- rm -rf "$XCFW"
72
- xcodebuild -create-xcframework \
73
- -framework "$TMP/device/ScanKitFrameWork.framework" \
74
- -framework "$TMP/sim/ScanKitFrameWork.framework" \
75
- -output "$XCFW"
76
-
77
- # 资源 bundle(扫码 UI 资源),原由 ScanKitFrameWork pod 带,现随 vendored 一起放。
78
- if [ -n "$SRC_BUNDLE" ]; then
79
- rm -rf "$BUNDLE"
80
- cp -R "$SRC_BUNDLE" "$BUNDLE"
81
- fi
82
-
83
- echo "[scankit] ✓ 生成 $XCFW(+ bundle)"