iOS16下二维码与条码扫描异常问题求助
iOS16 二维码与条码扫描兼容修复方案
方案1:移除重复的元数据类型
你的metadataObjectTypes数组中重复包含了.upce,先移除重复项,避免潜在的类型冲突:
captureMetadataOutput.metadataObjectTypes = [.qr, .ean13, .ean8, .aztec, .upce, .code39, .code39Mod43, .code93, .interleaved2of5, .itf14, .code128, .pdf417]
测试修改后是否恢复全区域扫描能力。
方案2:自定义扫描区域过滤(推荐)
iOS16中同时包含QR与其他条码类型时,系统对rectOfInterest的处理存在兼容性问题,可通过让系统扫描全屏,自己做区域过滤来解决:
- 设置扫描区域为全屏:
captureMetadataOutput.rectOfInterest = CGRect(x: 0, y: 0, width: 1, height: 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
相关产品推荐
相关产品推荐

