# FaceAISDK人脸识别活体检测React Native 示例
[English](./README.md) | [中文](./README.zh-CN.md)
本仓库是
[`@faceaisdk/react-native-face-sdk`](https://www.npmjs.com/package/@faceaisdk/react-native-face-sdk)
的 React Native API示例,演示 iOS 和 Android 端的离线人脸录入、1:1 比对、
活体检测和人脸特征管理。
> SDK 依赖设备相机和原生人脸算法,必须使用真机;不支持模拟器。
## 功能
- 使用 SDK 相机离线录入人脸
- 人脸 1:1 比对与活体检测
- 独立活体检测
- 查询、写入和删除人脸特征
- 传入自定义 Base64 图片录入人脸
## 环境要求
| 项目 | 要求 |
| ------------ | ---------------------------------------------------------- |
| Node.js | 22.11 或更高版本 |
| React Native | 本示例使用 0.84.0 |
| Face SDK | 本示例使用 `^1.1.0` |
| iOS | 15.0 或更高版本,必须使用真机 |
| Android | `minSdkVersion` 24+、`compileSdkVersion` 34+,必须使用真机 |
## 运行本示例
安装 JavaScript 依赖:
```bash
npm install
```
### Android
在一个终端中启动 Metro:
```bash
npm start
```
连接已开启 USB 调试的 Android 真机,然后在另一个终端运行:
```bash
npm run android
```
### iOS
安装 CocoaPods 依赖:
```bash
cd ios
pod install
cd ..
```
使用 Xcode 打开 `ios/FaceAISDK_RN.xcworkspace`,然后在
**Signing & Capabilities** 中选择 Development Team。
分别在两个终端中启动 Metro 和应用:
```bash
npm start
npm run ios
```
## 在其他项目中安装 SDK
```bash
npm install @faceaisdk/react-native-face-sdk latest
```
### iOS 配置
在 `ios/Podfile` 顶部附近加载 SDK 的 post-install 脚本:
```ruby
require_relative '../node_modules/@faceaisdk/react-native-face-sdk/scripts/faceaisdk_post_install.rb'
```
在 React Native 的 post-install 步骤之后调用该脚本:
```ruby
post_install do |installer|
react_native_post_install(
installer,
config[:reactNativePath],
:mac_catalyst_enabled => false
)
faceaisdk_post_install(installer)
end
```
安装 Pods:
```bash
cd ios && pod install
```
在 `Info.plist` 中添加相机权限说明:
```xml
NSCameraUsageDescription
人脸识别和活体检测需要使用相机。
```
### Android 配置
确保 Android 工程至少使用:
```gradle
minSdkVersion = 24
compileSdkVersion = 34
```
在 `android/app/src/main/AndroidManifest.xml` 中声明相机权限:
```xml
```
Android 还必须在运行时请求相机权限。完整的 `PermissionsAndroid` 示例请参考
[`App.tsx`](./App.tsx)。
## 导入
```ts
import {
addFaceByImage,
addFaceBySDKCamera,
deleteFaceFeature,
faceVerify,
getFaceFeature,
insertFaceFeature,
isFaceAIModuleAvailable,
livenessVerify,
type FaceResult,
} from '@faceaisdk/react-native-face-sdk';
```
## API 示例
### 检查原生模块是否可用
```ts
const available = isFaceAIModuleAvailable();
```
调用其他 API 前,可以使用此方法发现原生安装或链接是否完整。
### 使用 SDK 相机录入人脸
```ts
const result = await addFaceBySDKCamera('demo-user', {
mode: 1,
showConfirm: true,
});
```
| 参数 | 类型 | 说明 |
| ------------- | --------- | ---------------- |
| `mode` | `1 \| 2` | 相机录入模式 |
| `showConfirm` | `boolean` | 是否显示确认步骤 |
### 人脸比对与活体检测
```ts
const result = await faceVerify('demo-user', {
threshold: 0.83,
livenessType: 1,
motionTypes: '1,2,3,4,5',
timeout: 7,
steps: 2,
allowMultiFaces: true,
});
```
### 独立活体检测
```ts
const result = await livenessVerify({
livenessType: 1,
motionTypes: '1,2,3,4,5',
timeout: 7,
steps: 2,
allowMultiFaces: true,
});
```
`faceVerify` 和 `livenessVerify` 共用以下活体参数:
| 参数 | 类型 | 说明 |
| ----------------- | ------------------ | -------------------------- |
| `livenessType` | `1 \| 2 \| 3 \| 4` | 活体检测模式 |
| `motionTypes` | `string` | 使用逗号分隔的动作类型 ID |
| `timeout` | `number` | 活体检测超时参数 |
| `steps` | `number` | 活体检测步骤数量 |
| `allowMultiFaces` | `boolean` | 是否允许画面中出现多张人脸 |
`faceVerify` 还支持 `threshold`,用于设置人脸相似度阈值。
### 查询人脸特征
```ts
const result = await getFaceFeature('demo-user');
```
### 写入自定义人脸特征
```ts
const customFeature = '0'.repeat(1024);
const result = await insertFaceFeature('demo-user', customFeature);
```
这里的占位值用于演示如何传入自定义特征。需要成功执行时,请替换为有效的人脸特征。
### 使用自定义 Base64 图片录入
```ts
const customBase64Image = 'demo_base64_image_string';
const result = await addFaceByImage('demo-user', customBase64Image);
```
请将占位值替换为有效的 Base64 图片。
### 删除人脸特征
```ts
const result = await deleteFaceFeature('demo-user');
```
## 返回结果
所有异步 API 都返回 `FaceResult`:
```ts
interface FaceResult {
code: number;
message: string;
faceID: string;
similarity: number;
liveness: number;
faceFeature: string;
faceBase64: string;
}
```
| 属性 | 类型 | 说明 |
| ------------- | -------- | --------------- |
| `code` | `number` | SDK 返回码 |
| `message` | `string` | SDK 返回信息 |
| `faceID` | `string` | 人脸标识 |
| `similarity` | `number` | 人脸相似度 |
| `liveness` | `number` | 活体检测分值 |
| `faceFeature` | `string` | 人脸特征数据 |
| `faceBase64` | `string` | Base64 人脸图片 |
SDK 提示文本可以直接使用 `message`。为了避免弹窗中出现过长内容,示例只展示
人脸特征和 Base64 图片的长度。
## 常见问题
### 页面显示“SDK 未连接”
- 确认 `dependencies` 中已经安装 SDK。
- iOS 执行 `pod install` 后,应打开 `.xcworkspace`,不要打开 `.xcodeproj`。
- 安装或升级 SDK 后需要重新构建原生应用。
### 自定义特征或 Base64 录入失败
`App.tsx` 中的常量是故意保留的假数据,只用于演示自定义参数传递。需要成功执行时,
请替换为有效的人脸特征或 Base64 图片。
## 其他 SDK 示例
- [iOS SDK](https://github.com/FaceAISDK/FaceAISDK_iOS)
- [Android SDK](https://github.com/FaceAISDK/FaceAISDK_Android)
- [uniApp UTS](https://github.com/FaceAISDK/FaceAISDK_uniapp_UTS)
- [Flutter](https://github.com/FaceAISDK/FaceRecognition_Flutter)
- [React Native](https://github.com/FaceAISDK/FaceRecognition_ReactNative)
## 支持与反馈
- [GitHub Issues](https://github.com/FaceAISDK/FaceRecognition_ReactNative/issues)
- Email: FaceAISDK.Service@gmail.com