y***@sina.com
y***@sina.com
  • 发布:2026-09-14 09:30
  • 更新:47 分钟前
  • 阅读:47

【报Bug】真机调用uni.scanCode报this.$refs.barcode.cancel is not a function错误

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: Mac 26.6.2

HBuilderX类型: 正式

HBuilderX版本号: 5.24

手机系统: iOS

手机系统版本号: iOS 18

手机厂商: 苹果

手机机型: iPhone11

页面类型: vue

vue版本: vue3

打包方式: 离线

项目创建方式: HBuilderX

示例代码:
uni.scanCode({  
        scanType: ['qrCode'], // 只支持二维码  
        success: (res) => {  
            if (!res?.result) {  
                uni.showToast({ title: '扫描二维码失败', icon: 'none' });  
                return;  
            }  
            uni.showToast({ title: `扫描二维码成功:${ res.result }`, icon: 'none' });  
        },  
    });

操作步骤:

使用按钮点击事件调用uni.scanCode(方法

<template>  
<button @tap="qrcode">扫码</button>  
</template>  

<script setup>  
function qrcode() {  
    uni.scanCode({  
        scanType: ['qrCode'], // 只支持二维码  
        success: (res) => {  
            if (!res?.result) {  
                uni.showToast({ title: '扫描二维码失败', icon: 'none' });  
                return;  
            }  
            uni.showToast({ title: `扫描二维码成功:${ res.result }`, icon: 'none' });  
        },  
    });  
}  
</script>

预期结果:

可以正常拍照,并得到二维码数据

实际结果:

黑屏

bug描述:

升级到最新的HBuilderX5.24正式版+离线打包SDK5.24后,重新打包,调用uni.scanCode后出现黑屏,在Xcode中报错。

使用HBuilderX5.05+离线打包SDK5.05就可以正常使用!!

<Weex>[error]WXMonitor.m:289, [WX_KEY_EXCEPTION_WXBRIDGE] exception: TypeError: this.$refs.barcode.cancel is not a function. (In 'this.$refs.barcode.cancel()', 'this.$refs.barcode.cancel' is undefined)
stack:cancel@file:///var/mobile/Containers/Data/Application/1510EF55-DE47-4114-8799-97E181EBF29F/Library/Pandora/apps/UNIAE0A4F4/www/uniappscan.js:32:5675
onUnload@file:///var/mobile/Containers/Data/Application/1510EF55-DE47-4114-8799-97E181EBF29F/Library/Pandora/apps/
UNIAE0A4F4/www/uniappscan.js:32:5367
fn@weex-main-jsfm.js:7:2167
wn@weex-main-jsfm.js:7:2247
@weex-main-jsfm.js:7:24052
bo@weex-main-jsfm.js:8:1247
P@weex-main-jsfm.js:4:4111
@weex-main-jsfm.js:4:4639
fn@weex-main-jsfm.js:7:2167
wn@weex-main-jsfm.js:7:2247
@weex-main-jsfm.js:7:24052
qk@weex-main-jsfm.js:7:81469
nt@weex-main-jsfm.js:7:53295
we@weex-main-jsfm.js:7:52539
Ie@weex-main-jsfm.js:7:53903
unmount@weex-main-jsfm.js:7:33841
wv@weex-main-jsfm.js:4:6682
P1@weex-main-jsfm.js:31:235
@weex-main-jsfm.js:31:2882

2026-09-14 09:30 负责人:无 分享
已邀请:
Ask小助手

Ask小助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

感谢您的反馈。针对您提交的 Bug 报告,以下是基于官方视角的评审与分析意见:

1. Bug 反馈内容完整性评审

  • BUG 描述:描述非常清晰。您明确指出了触发场景(升级至 HBuilderX5.24 正式版及对应离线 SDK 后重新打包)、核心现象(调用 uni.scanCode 后黑屏)、以及具体的底层报错信息(this.$refs.barcode.cancel is not a function),并提供了对比信息(5.05 版本正常),这有助于官方快速定位问题。
  • 代码示例:代码示例基本完整。但需要提醒您,示例代码中的模板字符串存在一处语法错误:`扫描二维码成功:${.res.result }` 中的 .res 应为 res,建议修正为 `${res.result}`,以免在运行测试时被其他报错干扰。
  • 复现步骤:复现步骤描述清晰,结合您提供的代码示例,官方人员可以直接进行复现验证。
  • 预期与实际结果:预期结果(正常拍照并得到数据)合理,实际结果(黑屏及抛出异常)符合报错日志描述,非误报。
  • 分类信息:分类信息非常完整,包含了 HBuilderX 版本、手机 OS 平台及版本、Vue 版本、设备机型等关键信息。
  • 附件说明:由于系统限制,我无法识别和查看附件内容,后续如有需要补充日志或截图,请直接以文本形式提供。

2. Bug 是否成立及分析

根据知识库中的相关信息,该 Bug 现象是成立的。

DCloud问答社区的相关反馈 中,有开发者遇到了完全一致的问题:在 iOS 环境下调用 uni.scanCode 时出现黑屏,并报出 this.$refs.barcode.cancel is not a function 错误。根据该问答记录,此问题通常与 iOS 端的相机权限处理有关,即使在系统设置中看到权限已开启,也可能因为权限状态同步或初始化时机问题导致底层扫码组件(Barcode)未能正确挂载,从而在执行 cancel 方法时抛出 undefined 异常。

建议的排查与替代方案:

  1. 权限前置判断与请求:建议在调用 uni.scanCode 之前,主动通过代码检查并请求相机权限,确保权限状态完全就绪后再唤起扫码界面。您可以参考使用权限请求插件(如 App权限判断和提示插件)来规范处理权限逻辑。
  2. 尝试结束进程重置状态:如果是在开发调试过程中遇到黑屏,可以尝试将应用退到后台并结束进程,然后重新打开应用测试,这有助于清除因权限状态卡住导致的底层组件异常。
  3. 使用原生插件或 UTS 插件替代:由于 uni.scanCode 在 App 端使用的是开源扫码引擎,识别效率和稳定性在某些复杂场景下可能存在局限。官方推荐使用性能更强的 UTS 扫码插件,您可以前往 插件市场搜索相关扫码插件 进行替代集成。

我们会持续关注该问题在后续版本中的表现,感谢您对 DCloud 产品的支持与反馈。

内容为 AI 生成,仅供参考
DOMI_

DOMI_

你试试把barCode模块勾选上重新打包自定义基座

  • y***@sina.com (作者)

    已经勾选上了,并且在Android上是没有问题的

    34 分钟前

要回复问题请先登录注册