uni.scanCode 并非跨端通用,H5端完全不可用,App端需启用Barcode模块并配置对应权限,小程序端须配置权限描述且scanType需精确限定。

uni.scanCode 不是万能的,它在 H5 端完全不可用,在 App 端依赖 Barcode 模块启用,在小程序端必须配权限描述且 scanType 不能写宽泛——直接调用大概率失败或静默无响应。
App 端扫码必须启用 Barcode 模块并补全权限
很多开发者只在 manifest.json 勾了 Camera 权限,但 uni.scanCode 在 App 端实际走的是原生 Barcode SDK,不是 Camera API。不勾选「Barcode」模块,它会 fallback 到相册选择,根本不会拉起摄像头。
- 打开
manifest.json→「App 模块配置」→ 手动勾选Barcode(扫码) - Android:在
permissions下声明android.permission.CAMERA,且运行时必须调用uni.authorize({ scope: 'scope.camera' }),仅声明无效 - iOS:在
plus → distribute → apple节点下添加NSCameraUsageDescription字段,值不能为空字符串(如"用于扫描商品条码"),否则上架被拒
小程序端必须显式配 permission + 限定 scanType
微信小程序里 uni.scanCode 静默失败,90% 是因为 desc 字段缺失或 scanType 过于宽松。华为等安卓机型默认只识别二维码,传 ['qrCode', 'barCode'] 反而可能跳过条形码。
- 在
mp-weixin节点下写死权限:{"permission": {"scope.userCamera": {"desc": "用于扫码识别条形码"}}},漏掉desc就无回调 -
scanType按需指定,不要写全:扫条码就只传['barCode'],扫二维码就只传['qrCode'] - 加
onlyFromCamera: true,禁用相册选图,避免用户误操作中断流程
H5 端只能放弃 uni.scanCode,换真实可行路径
uni.scanCode 在浏览器里固定返回 not supported 错误,这不是 bug,是浏览器策略限制。别折腾 polyfill 或 mock,直接换方案。
- 对接扫码枪:放一个
<input type="text" autofocus />,监听input和keyup.enter,扫码枪本质是 HID 键盘,输入完自动回车 - 自建视频流识别:用
@zxing/library+navigator.mediaDevices.getUserMedia,但注意——必须 HTTPS(本地开发用@vitejs/plugin-basic-ssl启 HTTPS);识别率对反光、模糊条码较差,得加提示语“请保持条码平整、光线充足” - 结果结构不统一:H5 返回的是纯字符串,App 返回带
scanType和result的对象,小程序还多一层charSet,业务层必须按平台分支解析,不能直接取res.result
需要实时预览/连续识别?uni.scanCode 不适用
它只拉起一次系统级扫码界面,不暴露摄像头控制权,也不支持自定义 UI、动态框线或连续识别。真要实时扫码(比如核销场景反复扫),必须换路子:
- 用
<camera>组件 +jsqr库:仅支持 QR Code,不支持条形码;iOS App 上canvas截图大概率为空,因 WebKit 限制无法直接绘入 camera 流 - 原生插件更稳:如
uni-plugin-qrcode-scanner,封装了各端摄像头控制与解码逻辑,但需额外引入和配置 - RFID/批量扫描另起一套:PDA 设备通常走串口或蓝牙通信,需调用
plus.ble或厂商 SDK,和uni.scanCode完全无关
uni.scanCode 都是浪费时间,以及 iOS App 上那个永远截不到图的 canvas。


















