uni-app ios18.0.1 调用uni.checkIsSupportSoterAuthentication方法会直接闪退
uni-app ios18.0.1 调用uni.checkIsSupportSoterAuthentication方法会直接闪退
项目信息 | 详情 |
---|---|
产品分类 | uniapp/App |
PC开发环境操作系统 | Windows |
PC开发环境操作系统版本号 | windows11 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.29 |
手机系统 | iOS |
手机系统版本号 | iOS 18 |
手机厂商 | 苹果 |
手机机型 | iphone15pro |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
操作步骤:
manifest勾选faceId和Fingerprint, 使用云打包切选择打自定义调试基座, 打包完成后进入页面点击按钮会直接闪退, 注释掉uni.checkIsSupportSoterAuthentication, uni.checkIsSoterEnrolledInDevice, uni.startSoterAuthentication这些方法后就可以正常使用
预期结果:
ios正常应该调用面部识别
实际结果:
直接闪退, 唯有注释掉uni.checkIsSupportSoterAuthentication, uni.checkIsSoterEnrolledInDevice, uni.startSoterAuthentication后可以正常操作
bug描述:
uni.checkIsSupportSoterAuthentication 会导致应用闪退
不分代码如下
return new Promise((resolve, reject) => {
uni.checkIsSupportSoterAuthentication({
success ({ supportMode }) {
console.log('支持模式:', supportMode)
resolve(supportMode[0])
},
fail () {
console.log('设备不支持生物认证')
reject(new Error({ msg: '设备不支持生物认证' }))
}
})
})
// 检查是否录入
const checkEnrolled = (checkAuthMode) => {
return new Promise((resolve, reject) => {
uni.checkIsSoterEnrolledInDevice({
checkAuthMode,
success ({ isEnrolled }) {
if (isEnrolled) {
resolve()
} else {
reject(new Error({ errMsg: '设备未曾录入如指纹等生物信息' }))
}
},
fail () {
reject(new Error({ errMsg: '设备未曾录入如指纹等生物信息' }))
}
})
})
}
// 开始生物认证
const startSoter = (requestAuthModes, challenge) => {
return new Promise((resolve, reject) => {
uni.startSoterAuthentication({
requestAuthModes,
challenge,
// authContent: '',
success (res) {
resolve(res)
},
fail () {
reject(new Error({ errMsg: '认证失败' }))
}
})
})
}
// 表单值
const fingerprint = ref(false)
const switchChange = async (e) => {
try {
// const mode = await checkSupport()
// console.log('支持模式', mode)
// await checkEnrolled(mode)
const randomCode = uni.getStorageSync('TOKEN')
console.log('开始认证', randomCode)
// const vildRes = await startSoter(['facial'], randomCode)
// console.log(vildRes)
if (e.detail.value) {
request.getSpring('/api/user/open_fingerprint', {
cid: getDeviceId(),
appId: getAppId()
}).then(({ body, msg, code }) => {
fingerprint.value = code === '0'
uni.showToast({
title: msg,
icon: 'none'
})
uni.setStorageSync('fingerprint', body)
})
} else {
request.getSpring('/api/user/close_fingerprint', {}).then(({ msg, code }) => {
fingerprint.value = code === '0'
uni.showToast({
title: msg,
icon: 'none'
})
uni.setStorageSync('fingerprint', '')
})
}
} catch ({ errMsg }) {
fingerprint.value = false
uni.showToast({
title: errMsg + '抓到问题了',
icon: 'none'
})
}
}
const getDeviceId = () => {
return uni.getDeviceInfo().deviceId
}
const getAppId = () => {
return uni.getAppBaseInfo().appId
}
onMounted(() => {
fingerprint.value = !!uni.getStorageSync('fingerprint')
// checkSupport()
})
这个问题和 ios 版本有关系吗,有测试其他 ios 版本是否正常吗?补充更多信息,我转给相关同事
没有复现,你试一下不要用Promise 直接调用你那边还闪退么
针对你提到的uni-app在iOS 18.0.1系统上调用uni.checkIsSupportSoterAuthentication
方法导致应用闪退的问题,这通常是由于兼容性问题或者方法调用不当引起的。以下是一些可能的解决方案,主要通过代码示例和配置调整来尝试解决问题。需要注意的是,由于我无法直接访问你的开发环境和代码,以下解决方案仅供参考,并且需要根据实际情况进行调整。
1. 检查方法调用环境
首先,确保uni.checkIsSupportSoterAuthentication
方法是在合适的环境下调用的。这个方法通常用于检测设备是否支持SOTER生物认证(如指纹或面部识别)。如果设备或系统版本不支持该功能,直接调用可能会导致应用崩溃。
if (uni.getSystemInfoSync().platform === 'ios') {
const iosVersion = uni.getSystemInfoSync().version.split('.').map(Number);
if (iosVersion[0] >= 18 && iosVersion[1] === 0 && iosVersion[2] === 1) {
try {
uni.checkIsSupportSoterAuthentication({
success: (res) => {
console.log('支持SOTER认证:', res.support);
},
fail: (err) => {
console.error('检查SOTER认证失败:', err);
},
complete: () => {
console.log('检查SOTER认证完成');
}
});
} catch (error) {
console.error('调用checkIsSupportSoterAuthentication时发生异常:', error);
}
} else {
console.log('当前iOS版本不支持或未针对此版本进行测试');
}
} else {
console.log('非iOS平台');
}
2. 更新uni-app和依赖库
确保你的uni-app框架和所有相关依赖库都是最新版本。开发者社区可能已经修复了与iOS 18.0.1相关的bug。
# 更新uni-app CLI
npm install -g @dcloudio/uni-cli
# 更新项目依赖
cd your-uni-app-project
npm update
3. 配置原生插件
如果uni.checkIsSupportSoterAuthentication
依赖于原生插件,确保这些插件已经正确配置并兼容iOS 18.0.1。检查manifest.json
中的原生插件配置,并查阅插件文档以确认兼容性。
4. 使用try-catch捕获异常
如代码示例所示,使用try-catch
结构来捕获方法调用时可能抛出的异常,这有助于避免应用因未捕获的异常而崩溃。
结论
如果以上方法仍然无法解决问题,建议查阅uni-app的官方文档、社区论坛或提交issue给开发者团队,以获取更具体的帮助。同时,考虑在测试环境中复现问题,并收集详细的崩溃日志以便进一步分析。