理解条码和QR码的 AVFoundation 扫描

苹果公司的AVFoundation框架为iOS设备上与视听媒体合作提供了全版低级界面. 对于条码和QR代码扫描,框架暴露了类,该类可以从相机的种子中实时检测到多种机器可读代码,其中包括QR代码,EAN-8/13,代码128,PDF417,Aztec,以及许多其他格式. 框架处理图像分析和代码解码的重升,允许开发者专注于应用逻辑而不是执行自定义扫描算法.

AVFoundation扫描是硬件加速在现代设备上,即使在挑战性的照明条件下也提供快速可靠的检测,它与前后相机同时工作,检测区域可以被限制在某个特定感兴趣的区域,以改善性能和用户体验.

设置相机抓取会话

基于 AVFundation 的扫描仪的核心是 [[FLT: 1]]。此对象将数据从相机输入到元数据输出中调节。设置会话需要几个锅炉板步骤,这些步骤最好在专用视图控制器或管理器类中执行 。

请求摄像头权限

在访问相机之前, 您必须请求用户许可。 从 iOS 10 开始, 您需要将 [[FLT: 2] 密钥包含在您的 Info. plist 文件, 并用字符串解释您的应用程序需要相机的原因。 请使用 [[FLT: 3] 。 处理两个大小写 — 已批准和被拒绝 — 并相应更新您的用户界面 。

AVCaptureDevice.requestAccess(for: .video) { granted in
 if granted {
 // Configure and start the capture session
 } else {
 // Show an alert guiding the user to Settings
 }
}

创建自动会议

一旦获得许可,即刻使用一个]. 配置其会话预设以控制视频质量; 对于条码扫描,是一个很好的默认,但您也可以使用来进行更快的处理.

let session = AVCaptureSession()
session.sessionPreset = .high

添加相机输入

获取默认的视频设备( 后置相机) 并创建 [[ FLT: 9] ] 。 如果无法将输入添加到会话中( 如设备忙碌) , 则抓取错误并向用户反馈 。

guard let camera = AVCaptureDevice.default(for: .video) else { return }
do {
 let input = try AVCaptureDeviceInput(device: camera)
 guard session.canAddInput(input) else { return }
 session.addInput(input)
} catch {
 print("Camera input error: \(error.localizedDescription)")
}

添加元数据输出

创建 [[FLT: 11] ] 实例, 设置其代表( 在一个专用序列列上) , 并添加到会话中。 代表将接收检测到的元数据对象 。

let metadataOutput = AVCaptureMetadataOutput()
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
guard session.canAddOutput(metadataOutput) else { return }
session.addOutput(metadataOutput)

// Specify which code types to detect – must be done after the output is added
metadataOutput.metadataObjectTypes = [.qr, .ean13, .code128, .pdf417]

重要 : [[FLT: 13]]] 必须在会话中添加输出后设置。 设置更早将造成崩溃 。

开始会话

在背景线索上运行会话,以使 UI 响应。在背景调度队列中或在一个专用序列队列中呼叫 。

DispatchQueue.global(qos: .userInitiated).async {
 session.startRunning()
}

实施代表方法

代表方法 当扫描器检测到一个或多个代码时, 都会被调用。 此方法接收到一组 [[FLT: 17] ] 实例, 您需要将其投放到 [FLT: 18] ] 才能访问解码字符串 。

func metadataOutput(_ output: AVCaptureMetadataOutput,
 didOutput metadataObjects: [AVMetadataObject],
 from connection: AVCaptureConnection) {
 // Process only the first detected code (most common pattern)
 guard let metadataObject = metadataObjects.first,
 let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject,
 let stringValue = readableObject.stringValue else { return }

 // Use the scanned value (e.g., display, validate, or send to server)
 handleScannedCode(stringValue, type: readableObject.type)
}

通常在成功扫描后停止会话以防止重复检测。 处理代码后拨打 [[FLT: 20] ] , 当用户重置扫描器时重新启动它 。

处理检测到的代码

一旦您有字符串值,请根据代码类型和内容确定要采取的行动。常见的情况包括:

  • URLs –在Safari或使用的in app浏览器中打开.
  • Wi ⁇ Fi capital – 解析标准格式(]),并程序连接(需要额外的权利).
  • 生产代码 –通过一个API,如UPC数据库或你自己的库存系统,查找产品信息.
  • 联系信息 – 解析 vCard 或 MeCard 格式,并在地址簿中创建新的联系人.
  • 平板文字[ – 在提醒或复制中显示粘贴板.

对于每个代码类型,在处理前先验证字符串。错误或恶意代码应当被忽略或轻率地报告。

扫描性能的最佳做法

为确保扫描工作顺利高效,遵循这些准则:

  • Limit元数据对象类型 — 只允许您应用程序实际需要的代码格式。 每个额外的格式都添加处理管理费用 。
  • 选择一个感兴趣的区域[ – 使用],以定义视频种子中需要代码的一小部分。这大大改善了检测速度,减少了假阳性。
  • 使用正确的视频重力 —[]]保持相机预览比例,是覆盖扫描区域向导的理想.
  • 为代表调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调用调
  • 考虑火炬支持 — 允许用户切换相机的火炬用于低光的情景。在转动前请检查 。
  • 处理后重置扫描[ – 在成功扫描后,以短延(如1–2秒)重启会话,以防止立即重新检测同一代码.

提供用户反馈

良好的扫描经验包括视觉和听觉提示。应用这些反馈机制来引导用户:

  • Visual overlay – 使用属性 来绘制一个在检测到的代码周围的突出矩形。这需要转换元数据坐标,以通过查看坐标。
  • 动画 – 在识别代码时播放微妙动画(如缩小边框).
  • – 使用]]]的系统声音,音调短而正,如(“邮件发送”音)。
  • 高频反馈 – 使用或进行微妙的振动.
  • 扫描区域指南 – 显示带有角向导的半透明矩形,以帮助用户将代码中心化.

处理错误和边缘案例

处理强力错误可以确保扫描仪在出错时能优雅地降解.

  • Camera 无法使用 – 在设备上检查 和 。在没有相机的iPod 触摸或模拟器上,显示有意义的消息 。
  • 拒绝 – 显示一个提示,并用一个按钮通过打开设置.
  • 届会配置失败 — 或[]]返回]时日志错误。如果另一个应用程序在背景(稀有)中使用相机,则会发生这种情况。
  • Low light 或 模糊的图像 – 降低感兴趣的检测区域,并确保相机自动聚焦功能启用. 提示用户增加光或稳定设备.
  • ]无效或不支持的代码类型 — ]属性可能不支持所有设备上的所有格式。在设置前使用查询兼容性。

跨设备测试

AVFoundation条码扫描性能在iPhone和iPad的几代人之间有很大差异。测试您的执行:

  • 旧设备(iPhone 6s, iPad Air 2) – 这些设备的处理器较慢,可能与高分辨率预设有冲突。 使用 来优化旧硬件的平衡。
  • 不同相机光学设备 — — 带有远程摄影或超宽相机的iPhone可能具有不同的焦点。 总是使用默认的宽角相机进行条码扫描。
  • 低度光线环境 – 在暗处进行测试,以确保扫描覆盖仍可看见,火炬切换工作也正常.
  • 各种代码大小和方向 – 尝试从1cm×1cm贴纸到大海报的代码,测试景观对肖像扫描.

高级考虑

对于制作应用,请考虑添加连续扫描(在一个会话中允许多个代码),缩放控制,或者与ARKit合并以扩大真实覆盖。 如果您需要从静态图像(如照片库)处理代码,请使用 或 从视觉框架来,尽管AVFoundation对实时视频来说一般更快。

对于更深入的AVFoundation配置,请参考苹果公司的 设置捕获会话[ 指南和 AVCapMatadata Output文档[]. 在条中也可以找到一个完整的样本工程,用AVCaptureMataDataOutput 条扫描条码.

通过遵循这些指引并彻底测试您的执行,您可以提供一个抛光的高性能条码和QR码扫描仪,增强您的iOS应用的可用性和可靠性.