バーコードとQRコードスキャンのAVFoundationの理解

AppleのAVFoundationフレームワークは、iOSデバイス上でオーディオビジュアルメディアと連携するためのフル機能の低レベルインターフェイスを提供します。バーコードとQRコードスキャンの場合、フレームワークはクラスを露出し、カメラフィードからリアルタイムで広範囲の機械読み取り可能なコードを検出することができます。 これには、QRコード、EAN-8/13、コード128、PDF417、Aztec、その他多くのフォーマットが含まれています。 このフレームワークは、アプリケーションをスキャンするのではなく、開発者がコードをカスタム化できるようにする重いリフトを処理します。

AVFoundationスキャンは、現代のデバイスでハードウェアを加速し、照明条件の難しさを素早く、信頼できる検出を提供します。 フロントカメラとリアカメラの両方で機能し、検出エリアは、パフォーマンスとユーザーエクスペリエンスを向上させるために、特定の関心領域に制約されることがあります。

カメラキャプチャセッションの設定

AVFoundation ベースのスキャナーのコアは です。このオブジェクトは、カメラの入力からメタデータ出力までのデータフローをオーケストします。セッションを設定するには、専用のビューコントローラーやマネージャークラスで実装されているいくつかのボイラープレートの手順が必要です。

カメラの許可を要求する

カメラにアクセスする前に、ユーザ権限を要求する必要があります。 iOS 10 で始まると、アプリがカメラを必要とする理由を説明する文字列で [] キーをインフォリストファイルに含める必要があります。 許可は ] を使用して要求されます。 両方のケースを処理します - 付与され、拒否 - これにより、UIを更新します。

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

カメラ入力を追加する

デフォルトのビデオデバイス(リアカメラ)を取得し、[を作成します。入力がセッションに追加できない場合(例えば、デバイスは忙しい)、エラーをキャッチし、ユーザーにフィードバックを提示します。

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)")
}

メタデータ出力の追加

インスタンスを作成し、そのデレゲート(専用のシリアルキュー)を設定し、セッションに追加します。デレゲートは検出されたメタデータオブジェクトを受け取ります。

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]

重要:]は、出力がセッションに追加された後に設定する必要があります。 設定すると、クラッシュが発生します。

セッションの開始

バックグラウンドスレッドでセッションを実行して、UI の応答性を維持します。 をバックグラウンドディスパッチキューまたは専用のシリアルキューで呼び出します。

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

デリゲート法の実装

スキャナーが1つ以上のコードを検出するたびに、delegateメソッド[が呼び出されます。このメソッドは、デコードされた文字列にアクセスするためににキャストする必要がある[]の配列を受け取ります。

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)
}

繰り返し検出を防ぐためのスキャンが成功した後にセッションを停止するのは一般的です。コードを扱う後、[に電話をかけ、ユーザーがスキャナをリセットしたときに再起動します。

検出されたコードの処理

文字列の値がある場合、コードタイプとコンテンツに基づいて、どのようなアクションを取ろうかを判断します。 一般的なシナリオには、次のものが含まれます。

各コードタイプでは、処理前に文字列を検証します。 変形または悪意のあるコードは無視するか、または優雅に報告する必要があります。

スキャン性能のベストプラクティス

スムーズで効率的なスキャンを確保するため、以下のガイドラインに従ってください。

  • [メタデータオブジェクトタイプ[を制限] - 実際にアプリが必要とするコードフォーマットのみを有効にします。 追加のフォーマットは、処理オーバーヘッドを追加します。
  • [] 関心のある領域を設定 – [を使用して、コードが期待されるビデオフィードの小さな部分を定義します。 これは、検出速度を劇的に向上し、偽陽性を低下させます。
  • 正しいビデオ重力 - []は、カメラのプレビューの比例を維持し、スキャンエリアガイドをオーバーレイするのに理想的です。
  • [] コールバックを解除するためのシリアルキューをレバレッジ - 重処理(ネットワークの検索)をメインスレッドから実行して、UIの応答性を維持します。
  • コンサイダートーチサポート - ユーザーが低照度シナリオのためにカメラのトーチを切り替えることを可能にします。 トーグリングする前に[をチェックしてください。
  • [] 処理後のスキャンをリセット] - スキャンが成功した後、セッションを短時間(例、1〜2秒)で再起動して、同じコードの即時再検出を防止します。

ユーザーフィードバックの提供

スキャン体験には、視覚的および聴覚的なキューが含まれています。これらのフィードバックメカニズムを実装して、ユーザーに誘導します。

  • []仮想オーバーレイ] - []]を使用して検出されたコードの周りのハイライト矩形を描画します。 ]]のプロパティ。 これは、メタデータ座標をを介して座標を表示するように変換する必要があります。
  • Animation] - コードが認識されると、微妙なアニメーション(例えば、縮小境界)を再生します。
  • Sound – 短時間で[]を使用してシステムサウンドを再生する, 正の音は、のように聞こえます (「メール送信」音).
  • ]Haptic response] – ] または を微微微振動に使用してください。
  • []スキャンエリアガイド[] - ユーザーがコードを集中するのに役立ちますコーナーガイドで半透明長方形を表示。

エラー処理とエッジケース

誤り処理により、スキャナーが正常に動作しなくなると、スキャナーが劣化します。

  • [カメラが使えなくなった – と]をデバイスでチェックします。 iPod touchまたはカメラなしでシミュレータに、意味のあるメッセージが表示されます。
  • []権限が拒否された[] - を介して設定を開くボタンでアラートを表示します。
  • ] セッション構成障害] – または ] のときにログエラーが返されます。 別のアプリがバックグラウンド(レイ)のカメラを使用している場合に発生します。
  • []低光または空撮画像[ - 関心の検出領域を減らし、カメラの自動焦点が有効になっていることを確認します。 ユーザーが光を増加させるか、デバイスを着実にするためにプロンプトを出力します。
  • []無効なコードやサポートされていないコードタイプ[ – [プロパティは、すべてのデバイス上のすべてのフォーマットをサポートしていない場合があります。 []]を使用して、設定前に互換性をクエリします。

デバイス間でのテスト

AVFoundation バーコードスキャン パフォーマンスは、iPhone と iPad の世代間で大幅に変化します。 実装をテストします。

  • 古いデバイス(iPhone 6s、iPad Air 2) - これらは遅いプロセッサを持ち、高解像度プリセットに苦労する可能性があります。 古いハードウェアの最適なバランスのためにを使用します。
  • 異なるカメラ光学デバイス - 望遠カメラまたは超ワイドカメラを備えたiPhoneは、異なる焦点を合わせる場合があります。 バーコードスキャンのデフォルト広角カメラを常に使用してください。
  • 低照度環境 – スキャンのオーバーレイが見えることとトーチトグルの動作を保証するために、薄暗い条件でテストします。
  • さまざまなコードサイズと向き – 1 cm × 1 cm のステッカーから大きなポスターにコードを試す, 景観をテストします。 対. ポートレートスキャン.

高度な検討

プロダクションアプリでは、連続スキャン(複数のコードを1つのセッションで許可)、ズームコントロール、拡張現実のオーバーレイのためのARKitとの統合などの機能を追加検討してください。静止画像(例、フォトライブラリ)からコードを処理する必要がある場合は、Visionフレームワークからまたは[を使用しますが、AVFoundationは一般的にリアルタイムビデオのために高速です。

AVFoundation の設定に深くダイブするには、Apple の [] の ] を参照します。 ]] の ]] で完全なサンプルプロジェクトを見つけることもできます。 AVCMetadataOutput のバーコードをキャプチャします。

これらのガイドラインに従って、徹底的に実装をテストすることで、iOSアプリのユーザビリティと信頼性を高める、洗練された高性能バーコードとQRコードスキャナーを配信できます。