uni-app中App端生物识别需原生封装,不可用小程序API;须配权限、分平台放插件、加存在性判断与二次确认,iOS需开启Touch ID支持,Android注意ROM限制。

uni-app里调不到uni.navigateBack?先确认你是不是在App端误用了微信API
App端指纹支付不等于微信小程序的wx.checkIsSupportSoterAuthentication,那是小程序专属接口。uni-app在App端做生物识别,必须走原生能力封装路线——要么用插件市场现成的指纹/人脸模块,要么自己桥接iOS的LAContext和Android的FingerprintManagerCompat。直接写uni.getProvider查biometric返回undefined?大概率是没配原生依赖或manifest权限没开。
- App端
uni.getProvider({service: 'biometric'})只在5+App(即打包为原生App)下生效,H5和小程序环境永远返回空数组 - Android需在
manifest.json里手动加权限:<uses-permission android:name="android.permission.USE_FINGERPRINT"></uses-permission>(Android 9+还建议加android.permission.AUTHENTICATE_ACCOUNTS) - iOS要进Xcode开启
Face ID/Lockdown ModeCapability,并在Info.plist补NSFaceIDUsageDescription描述字段,否则运行时直接崩溃
uni.requireNativePlugin('fingerprint')报错“plugin not found”?检查插件路径和平台编译目标
很多开发者把从插件市场下载的fingerprint插件直接扔进nativePlugins根目录,结果iOS能跑Android炸——因为插件包结构是分平台的。uni-app要求Android插件放nativePlugins/android/xxx,iOS插件放nativePlugins/ios/xxx,且文件名必须和requireNativePlugin里传的字符串完全一致(大小写敏感)。
- 插件市场下载的zip解压后,看内部是否有
android和ios子目录;没有的话说明它只支持单端,别硬套 - 运行前确认HBuilderX的“运行到手机或模拟器”选的是“Android App”或“iOS App”,不是“微信开发者工具”——后者根本不会加载原生插件
- 调用前加个存在性判断:
const fp = uni.requireNativePlugin('fingerprint'); if (!fp) { console.error('指纹插件未加载'); return; }
指纹校验通过后怎么安全传参?别把token塞进uni.navigateTo的url里
常见错误:指纹验证成功回调里直接uni.navigateTo({url: '/pages/pay/success?token=xxx'}),token明文暴露在路由参数中,被history API或系统最近任务栏截获。App端生物识别只是“用户本人操作确认”,不代表身份已认证完毕——它只该触发一次性的、带签名的后端校验请求。
- 指纹插件返回的通常是
{success: true, authResult: 'xxx'},这个authResult是设备级加密凭证,必须连同时间戳、随机nonce一起发给后端做联合验签 - 前端收到后端返回的支付授权码(非token)后,再跳转;跳转时用
uni.setStorageSync存临时凭证,页面onLoad里取,用完立即uni.removeStorageSync清除 - 敏感操作务必加二次确认弹窗,哪怕刚做完指纹——防止用户误触或被诱导点击
为什么iOS指纹偶尔失败,但Face ID总成功?得关掉disableIosTouchID配置
部分指纹插件默认禁用iOS的Touch ID(老款iPhone),只启用Face ID,导致iPhone 6s/7用户点不动。这不是bug,是插件作者为兼容性做的保守设置。你得翻插件文档找初始化参数,通常叫allowTouchID或enableLegacyBiometric,设为true才行。
- Android端注意:部分国产ROM(如MIUI、EMUI)会拦截指纹回调,需引导用户去系统设置里打开“应用使用指纹”开关
- 测试时别只用自己手机——找台Android 6.0的老机,再找台iOS 12的iPhone 6s,这两类设备最容易暴露兼容问题
- 上线前必须实测“锁屏状态下触发指纹”场景,有些插件在App后台切前台时会丢失上下文,导致回调不触发


















