uni.checkFaceID总返回false是因设备当前不满足生物识别可用性条件:iOS需开启Face ID开关、未锁屏且非重启后首次解锁;Android因厂商支持不一、权限未授或targetSdkVersion问题普遍返回false。

uni.checkFaceID 为什么总返回 false?
这不是代码写错了,而是设备当前不满足生物识别的“可用性”条件。它不是查“有没有指纹模块”,而是查“此刻能不能用”。
-
uni.checkFaceID在 iOS 上只对 Face ID / Touch ID 生效,且要求用户已开启「iPhone 上的 Face ID」开关、未锁屏、未重启后未首次解锁 - Android 上绝大多数机型返回
false是正常现象:厂商系统级支持不统一,USE_BIOMETRIC权限未在系统设置中手动授予,或 targetSdkVersion BiometricPrompt 初始化失败 - H5 环境下直接报错
not supported,这个 API 根本不可用,别试 - 微信小程序里调用
uni.checkFaceID没意义——它不走设备层,必须用wx.requestPayment唤起微信自己的生物验证链路
APP端该用 SOTER 还是 checkFaceID?
APP(iOS/Android)必须用 uni.checkIsSupportSoterAuthentication + uni.startSoterAuthentication,而不是 uni.checkFaceID。
-
uni.checkFaceID是 iOS 原生封装,Android 兼容性极差,2026 年仍无法稳定落地 -
uni.checkIsSupportSoterAuthentication是 uni-app 官方推荐的跨平台生物认证入口,返回supportMode: ['fingerPrint']或['fingerPrint', 'facial'],明确告诉你设备支持什么 - 调用前必须先确认是否已录入:
uni.checkIsSoterEnrolledInDevice({ checkAuthMode: 'fingerPrint' }),否则startSoterAuthentication会静默失败或弹出“未录入指纹”提示 - 注意
challenge参数不是随便填的字符串,它是服务端验签的关键随机值,需和服务端约定好加解密方式
manifest.json 和权限配置漏哪一项都会白忙
APP 打包时权限和模块没配全,API 调用直接被系统拦截,连错误都不抛。
- iOS:必须在
manifest.json的app-plus → distribute → ios下添加NSFaceIDUsageDescription描述字段,否则真机直接 crash - Android:除了
manifest.json中app-plus → modules → Fingerprint要勾选,还必须在distribute → android → permissions加上 - 模拟器调试无效:Android 模拟器默认无生物识别能力,所有判断都为 false;iOS 模拟器不支持 Face ID,必须真机测试
- 自定义调试基座必须重打:改完 manifest 后不重新生成调试基座,旧基座不会自动更新权限
生物识别 ≠ 支付,别试图绕过支付通道
有人想用 uni.startSoterAuthentication 成功就直接扣款,这是安全红线,也根本走不通。
- 生物识别只是身份确认环节,不能替代签名、加密、风控、支付网关等完整链路
- 正确流程是:
startSoterAuthentication成功 → 拿到authCode或业务凭证 → 发给后端 → 后端调用微信/支付宝统一下单接口 → 前端用uni.requestPayment唤起 SDK → SDK 内部自动触发生物验证 - 你控制不了支付 SDK 里的生物验证界面,也不该控制;它的 UI、活体检测、超时策略、降级逻辑(如密码备用)均由支付平台保障
- 如果业务需要活体人脸识别(非设备原生),得集成第三方 SDK(如百度、顶象),和
uni.startSoterAuthentication完全是两套体系
最常被跳过的一步是:每次调用前都应重新执行 checkIsSupportSoterAuthentication 和 checkIsSoterEnrolledInDevice。缓存结果会导致用户换手机、删指纹、关权限后功能突然失效,而且毫无提示。










