uni.scanCode 不支持实时摄像头扫描,仅调起系统扫码界面;App需启用Barcode模块而非Camera权限,iOS/Android须分别配置隐私描述与运行时授权,小程序需补全desc字段,H5端不支持须换方案。

uni.scanCode 不能直接“调用摄像头”做实时扫描——它只拉起系统级扫码界面,不暴露摄像头控制权,也不支持连续识别或自定义 UI。
App 端必须启用 Barcode 模块,不是 Camera
很多开发者在 manifest.json 里只勾了 Camera 权限,结果 uni.scanCode 在 App 上静默 fallback 到相册选图,根本没打开摄像头。
- 打开
manifest.json→「App 模块配置」→ 手动勾选Barcode(扫码)(不是 Camera) - iOS:在
plus → distribute → apple下加NSCameraUsageDescription,值不能为空,例如"用于扫描商品条形码" - Android:6.0+ 必须运行时调用
uni.authorize({ scope: 'scope.camera' }),仅permissions声明无效 - 调用时务必传
scanType: ['barCode'],别写['qrCode', 'barCode'],华为等机型会跳过条形码 - 加
onlyFromCamera: true,禁用相册入口,避免用户误点中断流程
小程序端权限描述缺一不可
微信小程序里 uni.scanCode 静默失败,90% 是因为 desc 字段缺失或 scanType 过宽。
- 在
manifest.json的mp-weixin节点下写死权限:{"permission": {"scope.userCamera": {"desc": "用于扫码识别条形码"}}} -
desc字段漏掉就无回调,不是“可选”,是强制要求 -
scanType按需指定:扫 EAN-13 就只传['barCode'],别贪全 - 基础库版本必须 ≥ 1.7.0,低版本直接不响应
H5 端必须放弃 uni.scanCode,换真实路径
uni.scanCode 在浏览器里固定走 fail 回调,错误信息是 not supported,这不是 bug,是浏览器策略限制。
- 对接扫码枪:放一个
<input type="text" autofocus>,监听input和keyup.enter,扫码枪本质是 HID 键盘 - 自建视频流识别:用
@zxing/library+navigator.mediaDevices.getUserMedia,但注意——必须 HTTPS(本地开发用@vitejs/plugin-basic-ssl启 HTTPS) -
@zxing/library对 EAN-13/UPC-A 支持好,但对反光、模糊、低对比度条码识别率明显低于原生 SDK,得加提示语“请保持条码平整、光线充足” - 别用
uni.createCameraContext:它在 H5 不可用,在 iOS App 中 canvas 截帧大概率为空,不是代码问题,是 WebKit 限制
结果解析必须按 scanType 分支处理
不同平台返回结构差异极大,直接取 res.result 容易报错或逻辑错乱。
-
res.scanType === 'bar'时,res.result是纯数字字符串(如"6923450654321"),不含校验位,业务层得自己做模 10 校验 -
res.scanType === 'qr'时,内容可能是 URL、JSON 字符串甚至 base64,直接JSON.parse(res.result)会炸 - 微信小程序还可能返回
weapp类型,此时res.result是对象,要取res.result.path和res.result.extraData - App 端返回带
scanType和result的对象,H5 返回纯字符串,小程序多一层charSet—— 不能统一处理
真正需要实时预览、连续识别、自定义框线的场景,uni.scanCode 从设计上就不适用。最容易被忽略的点是:你以为在调摄像头,其实只是在调系统弹窗;你以为一次配置能跨端,其实每个平台的权限、模块、返回值都在悄悄打架。


















