uni-app ios18.0.1 调用uni.checkIsSupportSoterAuthentication方法会直接闪退

发布于 1周前 作者 ionicwang 来自 Uni-App

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()  
})

3 回复

这个问题和 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给开发者团队,以获取更具体的帮助。同时,考虑在测试环境中复现问题,并收集详细的崩溃日志以便进一步分析。

回到顶部