turboModule.ts使用promise.reject抛出异常对象。
checkDeviceSupportLocalAuthenticationWithBiometricsOnly(bool: boolean): Promise<{
code?: number | undefined;
errorCode?: string | undefined;
note?: string | undefined
}> {
try {
userAuth.getAvailableStatus(userAuth.UserAuthType.FINGERPRINT, userAuth.AuthTrustLevel.ATL2);
return Promise.resolve({})
} catch (error) {
try {
userAuth.getAvailableStatus(userAuth.UserAuthType.FACE, userAuth.AuthTrustLevel.ATL2);
return Promise.resolve({})
} catch (error) {
// 如果仅支持生物方式,则不考虑密码
if (bool) {
return Promise.reject({code: 0, message: '该设备暂不支持生物认证'})
}else {
try {
userAuth.getAvailableStatus(userAuth.UserAuthType.PIN, userAuth.AuthTrustLevel.ATL2);
return Promise.resolve({})
}catch (error) {
return Promise.reject({code: 0, message: '该设备暂不支持生物认证'})
}
}
}
}
}
在rn catch接收参数时只能拿到message参数:
static checkDeviceSupportLocalAuthenticationWithBiometricsOnly = (biometricsOnly: boolean, callback: (obj: {
code?: number,
errorCode?: string,
note?: string
}) => void) => {
RNLocalAuthentication?.checkDeviceSupportLocalAuthenticationWithBiometricsOnly(biometricsOnly)
.then(() => {
callback({ code: 1 })
}).catch(({ code, message }) => {
console.log(`====>>>>指纹认证失败,code:${code},message:${message}`)
callback({ code, note: message })
});
}
这个问题是RN内部的规范,当前RN版本规定只能返回字符串,或者返回的对象中包含“message: string”字段。可以通过以下方法进行规避:在原生侧将结果对象转换为JSON字符串返回,JS侧再通过解析JSON,将对象解析出来。