You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS16下二维码与条码扫描异常问题求助

iOS16 二维码与条码扫描兼容修复方案

方案1:移除重复的元数据类型

你的metadataObjectTypes数组中重复包含了.upce,先移除重复项,避免潜在的类型冲突:

captureMetadataOutput.metadataObjectTypes = [.qr, .ean13, .ean8, .aztec, .upce, .code39, .code39Mod43, .code93, .interleaved2of5, .itf14, .code128, .pdf417]

测试修改后是否恢复全区域扫描能力。

方案2:自定义扫描区域过滤(推荐)

iOS16中同时包含QR与其他条码类型时,系统对rectOfInterest的处理存在兼容性问题,可通过让系统扫描全屏,自己做区域过滤来解决:

  1. 设置扫描区域为全屏:
captureMetadataOutput.rectOfInterest = CGRect(x: 0, y: 0, width: 1, height: 1)
  1. 在代理方法中,将识别到的条码坐标转换为屏幕坐标系,判断是否在你需要的目标区域内,仅处理符合条件的结果:
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    guard let previewLayer = self.previewLayer else { return }
    // 你的目标扫描区域(屏幕坐标系,比如中间的矩形框)
    let targetScanRect = CGRect(x: ..., y: ..., width: ..., height: ...)
    
    for metadata in metadataObjects {
        guard let readableObject = metadata as? AVMetadataMachineReadableCodeObject,
              let codeString = readableObject.stringValue else { continue }
        
        // 将条码的frame转换为屏幕坐标系
        let convertedRect = previewLayer.layerRectConverted(fromMetadataOutputRect: readableObject.bounds)
        
        // 判断是否在目标区域内
        if targetScanRect.contains(convertedRect) || targetScanRect.intersects(convertedRect) {
            // 处理识别到的条码/二维码
            print("识别到有效码:\(codeString)")
            break
        }
    }
}

这个方法完全绕过系统的rectOfInterest限制,自己控制有效扫描区域,同时兼容所有条码类型。

方案3:动态切换扫描类型

如果不需要同时扫描二维码和条码,可以根据用户操作动态切换元数据类型:

  • 当用户选择扫描二维码时:
captureMetadataOutput.metadataObjectTypes = [.qr]
  • 当用户选择扫描条码时:
captureMetadataOutput.metadataObjectTypes = [.ean13, .ean8, .aztec, .upce, .code39, .code39Mod43, .code93, .interleaved2of5, .itf14, .code128, .pdf417]

内容的提问来源于stack exchange,提问作者Ananth

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 15:31:41