@faceaisdk/react-native-face-sdk 0.1.1

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 (35) hide show
  1. package/LICENSE +1 -0
  2. package/README.md +252 -0
  3. package/android/build.gradle +53 -0
  4. package/android/libs/FaceSDKLib-release.aar +0 -0
  5. package/android/proguard-rules.pro +3 -0
  6. package/android/src/main/AndroidManifest.xml +3 -0
  7. package/android/src/main/java/com/faceaisdk/reactnative/FaceRNModule.kt +383 -0
  8. package/android/src/main/java/com/faceaisdk/reactnative/FaceRNPackage.kt +16 -0
  9. package/ios/FaceAISDK/CustomToastView.swift +34 -0
  10. package/ios/FaceAISDK/FaceAINaviView.swift +212 -0
  11. package/ios/FaceAISDK/FaceSDKCameraView.swift +40 -0
  12. package/ios/FaceAISDK/FaceSDKLocalizer.swift +21 -0
  13. package/ios/FaceAISDK/LivenessDetectView.swift +317 -0
  14. package/ios/FaceAISDK/ScreenBrightnessHelper.swift +100 -0
  15. package/ios/FaceAISDK/TTSPlayer.swift +357 -0
  16. package/ios/FaceAISDK/VerifyFaceView.swift +284 -0
  17. package/ios/FaceAISDK/addFace/AddFaceByCamera.swift +207 -0
  18. package/ios/FaceAISDK/addFace/AddFaceByImage.swift +174 -0
  19. package/ios/FaceAISDK/addFace/ImagePicker.swift +52 -0
  20. package/ios/FaceAISDK/addFace/VerifyTwoFaceSimiView.swift +210 -0
  21. package/ios/FaceColorExtensions.swift +10 -0
  22. package/ios/FaceRNModule.h +9 -0
  23. package/ios/FaceRNModule.m +197 -0
  24. package/ios/FaceSDKSwiftManager.swift +277 -0
  25. package/ios/Resources/en.lproj/Localizable.strings +51 -0
  26. package/ios/Resources/light_too_high.png +0 -0
  27. package/ios/Resources/zh-Hans.lproj/Localizable.strings +51 -0
  28. package/lib/index.d.ts +22 -0
  29. package/lib/index.js +112 -0
  30. package/lib/types.d.ts +39 -0
  31. package/lib/types.js +2 -0
  32. package/package.json +88 -0
  33. package/react-native-face-sdk.podspec +28 -0
  34. package/src/index.ts +184 -0
  35. package/src/types.ts +90 -0
@@ -0,0 +1,28 @@
1
+ require 'json'
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = 'react-native-face-sdk'
7
+ s.version = package['version']
8
+ s.summary = package['description']
9
+ s.license = package['license']
10
+ s.homepage = 'https://github.com/FaceAISDK/FaceAISDK_RN'
11
+ s.authors = { 'FaceAISDK' => 'support@faceaisdk.example' }
12
+ s.platforms = { :ios => '15.5' }
13
+ s.source = { :git => 'https://github.com/FaceAISDK/FaceAISDK_RN.git', :tag => s.version.to_s }
14
+ s.source_files = 'ios/**/*.{h,m,swift}'
15
+ s.resources = [
16
+ 'ios/Resources/**/*',
17
+ ]
18
+ s.requires_arc = true
19
+ s.swift_version = '5.0'
20
+ s.module_name = 'FaceAISDKReactNative'
21
+
22
+ s.dependency 'React-Core'
23
+ s.dependency 'FaceAISDK_Core', '2026.06.25'
24
+
25
+ #应该不需要重复依赖了
26
+ s.dependency 'TensorFlowLiteSwift', '~> 2.17.0'
27
+ end
28
+
package/src/index.ts ADDED
@@ -0,0 +1,184 @@
1
+ import {NativeModules, Platform} from 'react-native';
2
+
3
+ import type {
4
+ AddFaceBySDKCameraOptions,
5
+ FaceNativeModule,
6
+ FaceResult,
7
+ FaceVerifyOptions,
8
+ LivenessVerifyOptions,
9
+ } from './types';
10
+
11
+ const MODULE_NAME = 'FaceRNModule';
12
+
13
+ const LINKING_ERROR =
14
+ `The native module \`${MODULE_NAME}\` is not linked. Make sure that:\n\n` +
15
+ Platform.select({
16
+ ios: "- you ran 'pod install' in the iOS project\n",
17
+ default: '',
18
+ }) +
19
+ '- you rebuilt the app after installing the package\n' +
20
+ '- you are not running inside a plain Jest/Node environment without mocks';
21
+
22
+ const nativeModule = NativeModules[MODULE_NAME] as FaceNativeModule | undefined;
23
+
24
+ function getNativeModule(): FaceNativeModule {
25
+ if (!nativeModule) {
26
+ throw new Error(LINKING_ERROR);
27
+ }
28
+
29
+ return nativeModule;
30
+ }
31
+
32
+ function normalizeResult(result: Partial<FaceResult> | undefined): FaceResult {
33
+ return {
34
+ code: result?.code ?? 0,
35
+ msg: result?.msg ?? '',
36
+ faceID: result?.faceID ?? '',
37
+ similarity: result?.similarity ?? 0,
38
+ liveness: result?.liveness ?? 0,
39
+ faceFeature: result?.faceFeature ?? '',
40
+ faceBase64: result?.faceBase64 ?? '',
41
+ };
42
+ }
43
+
44
+ function invokeWithPromise(
45
+ call: (callback: (result: FaceResult) => void) => void,
46
+ ): Promise<FaceResult> {
47
+ return new Promise(resolve => {
48
+ call(result => resolve(normalizeResult(result)));
49
+ });
50
+ }
51
+
52
+ export const FACE_AI_STATUS_CODE_MAP: Record<number, string> = {
53
+ [-1]: '相机权限被拒绝',
54
+ 0: '初始化状态/用户取消',
55
+ 1: '人脸识别或录入成功',
56
+ 2: '人脸识别失败,相似度低于阈值',
57
+ 3: '动作活体检测成功',
58
+ 4: '动作活体检测超时',
59
+ 5: '多次未检测到人脸',
60
+ 6: '本地不存在对应的人脸特征',
61
+ 7: '炫彩活体检测成功',
62
+ 8: '炫彩活体检测失败',
63
+ 9: '炫彩活体检测失败,环境过亮',
64
+ 10: '活体检测流程完成',
65
+ 11: '静默活体检测失败',
66
+ 12: '未录入对应人脸',
67
+ 13: '检测到多人脸',
68
+ };
69
+
70
+ export function isFaceAIModuleAvailable(): boolean {
71
+ return Boolean(nativeModule);
72
+ }
73
+
74
+ export function addFaceBySDKCamera(
75
+ faceID: string,
76
+ options: AddFaceBySDKCameraOptions = {},
77
+ ): Promise<FaceResult> {
78
+ const {mode = 1, showConfirm = true} = options;
79
+
80
+ return invokeWithPromise(callback => {
81
+ getNativeModule().addFaceBySDKCamera(faceID, mode, showConfirm, callback);
82
+ });
83
+ }
84
+
85
+ export function faceVerify(
86
+ faceID: string,
87
+ options: FaceVerifyOptions = {},
88
+ ): Promise<FaceResult> {
89
+ const {
90
+ threshold = 0.83,
91
+ livenessType = 1,
92
+ motionTypes = '1,2,3,4,5',
93
+ timeout = 7,
94
+ steps = 2,
95
+ allowMultiFaces = true,
96
+ } = options;
97
+
98
+ return invokeWithPromise(callback => {
99
+ getNativeModule().faceVerify(
100
+ faceID,
101
+ threshold,
102
+ livenessType,
103
+ motionTypes,
104
+ timeout,
105
+ steps,
106
+ allowMultiFaces,
107
+ callback,
108
+ );
109
+ });
110
+ }
111
+
112
+ export function livenessVerify(
113
+ options: LivenessVerifyOptions = {},
114
+ ): Promise<FaceResult> {
115
+ const {
116
+ livenessType = 2,
117
+ motionTypes = '1,2,3,4,5',
118
+ timeout = 7,
119
+ steps = 2,
120
+ allowMultiFaces = true,
121
+ showResultTips = false,
122
+ } = options;
123
+
124
+ return invokeWithPromise(callback => {
125
+ getNativeModule().livenessVerify(
126
+ livenessType,
127
+ motionTypes,
128
+ timeout,
129
+ steps,
130
+ allowMultiFaces,
131
+ showResultTips,
132
+ callback,
133
+ );
134
+ });
135
+ }
136
+
137
+ export function getFaceFeature(faceID: string): Promise<FaceResult> {
138
+ return invokeWithPromise(callback => {
139
+ getNativeModule().getFaceFeature(faceID, callback);
140
+ });
141
+ }
142
+
143
+ export function insertFaceFeature(
144
+ faceID: string,
145
+ faceFeature: string,
146
+ ): Promise<FaceResult> {
147
+ return invokeWithPromise(callback => {
148
+ getNativeModule().insertFaceFeature(faceID, faceFeature, callback);
149
+ });
150
+ }
151
+
152
+ export function addFaceByImage(
153
+ faceID: string,
154
+ base64Image: string,
155
+ ): Promise<FaceResult> {
156
+ return invokeWithPromise(callback => {
157
+ getNativeModule().addFaceBySDKImage(faceID, base64Image, callback);
158
+ });
159
+ }
160
+
161
+ export function deleteFaceFeature(faceID: string): Promise<FaceResult> {
162
+ return invokeWithPromise(callback => {
163
+ getNativeModule().deleteFaceFeature(faceID, callback);
164
+ });
165
+ }
166
+
167
+ export type {
168
+ AddFaceBySDKCameraOptions,
169
+ FaceResult,
170
+ FaceVerifyOptions,
171
+ LivenessVerifyOptions,
172
+ } from './types';
173
+
174
+ export default {
175
+ addFaceBySDKCamera,
176
+ faceVerify,
177
+ livenessVerify,
178
+ getFaceFeature,
179
+ insertFaceFeature,
180
+ addFaceByImage,
181
+ deleteFaceFeature,
182
+ isFaceAIModuleAvailable,
183
+ };
184
+
package/src/types.ts ADDED
@@ -0,0 +1,90 @@
1
+ export type FaceResultCode =
2
+ | -1
3
+ | 0
4
+ | 1
5
+ | 2
6
+ | 3
7
+ | 4
8
+ | 5
9
+ | 6
10
+ | 7
11
+ | 8
12
+ | 9
13
+ | 10
14
+ | 11
15
+ | 12
16
+ | 13;
17
+
18
+ export interface FaceResult {
19
+ code: FaceResultCode | number;
20
+ msg: string;
21
+ faceID: string;
22
+ similarity: number;
23
+ liveness: number;
24
+ faceFeature: string;
25
+ faceBase64: string;
26
+ }
27
+
28
+ export interface AddFaceBySDKCameraOptions {
29
+ mode?: 1 | 2;
30
+ showConfirm?: boolean;
31
+ }
32
+
33
+ export interface FaceVerifyOptions {
34
+ threshold?: number;
35
+ livenessType?: 1 | 2 | 3 | 4;
36
+ motionTypes?: string;
37
+ timeout?: number;
38
+ steps?: number;
39
+ allowMultiFaces?: boolean;
40
+ }
41
+
42
+ export interface LivenessVerifyOptions {
43
+ livenessType?: 1 | 2 | 3 | 4;
44
+ motionTypes?: string;
45
+ timeout?: number;
46
+ steps?: number;
47
+ allowMultiFaces?: boolean;
48
+ showResultTips?: boolean;
49
+ }
50
+
51
+ export interface FaceNativeModule {
52
+ addFaceBySDKCamera(
53
+ faceID: string,
54
+ mode: number,
55
+ showConfirm: boolean,
56
+ callback: (result: FaceResult) => void,
57
+ ): void;
58
+ faceVerify(
59
+ faceID: string,
60
+ threshold: number,
61
+ livenessType: number,
62
+ motionTypes: string,
63
+ timeout: number,
64
+ steps: number,
65
+ allowMultiFaces: boolean,
66
+ callback: (result: FaceResult) => void,
67
+ ): void;
68
+ livenessVerify(
69
+ livenessType: number,
70
+ motionTypes: string,
71
+ timeout: number,
72
+ steps: number,
73
+ allowMultiFaces: boolean,
74
+ showResultTips: boolean,
75
+ callback: (result: FaceResult) => void,
76
+ ): void;
77
+ getFaceFeature(faceID: string, callback: (result: FaceResult) => void): void;
78
+ insertFaceFeature(
79
+ faceID: string,
80
+ faceFeature: string,
81
+ callback: (result: FaceResult) => void,
82
+ ): void;
83
+ addFaceBySDKImage(
84
+ faceID: string,
85
+ base64Image: string,
86
+ callback: (result: FaceResult) => void,
87
+ ): void;
88
+ deleteFaceFeature(faceID: string, callback: (result: FaceResult) => void): void;
89
+ }
90
+