技術ブログ

プログラミング、IT関連の記事中心

QRコードリーダー【Swift】

◾️QRコードリーダーの実装

QRコードを読み取る方法を以下に記載します。
読み取った後の処理は各自必要な処理を記載する必要があります。

import AVFoundation
import UIKit

class CameraViewController: UIViewController, AVCaptureMetadataOutputObjectsDelegate {
    // カメラやマイクの入出力を管理するオブジェクトを生成
    let session = AVCaptureSession()

    override func viewDidLoad() {
        super.viewDidLoad()

        // カメラやマイクのデバイスオブジェクトを生成
        let devices:[AVCaptureDevice] = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back).devices

        // 該当するデバイスのうち最初に取得したもの(背面カメラ)を利用する
        if let backCamera = devices.first {
            do {
                // QRコードの読み取りに背面カメラの映像を利用するための設定
                let deviceInput = try AVCaptureDeviceInput(device: backCamera)

                if self.session.canAddInput(deviceInput) {
                    self.session.addInput(deviceInput)

                    // 背面カメラの映像からQRコードを検出するための設定
                    let metadataOutput = AVCaptureMetadataOutput()

                    if self.session.canAddOutput(metadataOutput) {
                        self.session.addOutput(metadataOutput)

                        metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
                        metadataOutput.metadataObjectTypes = [.qr]

                        // 背面カメラの映像を画面に表示するためのレイヤーを生成
                        let previewLayer = AVCaptureVideoPreviewLayer(session: self.session)
                        previewLayer.frame = self.view.bounds
                        previewLayer.videoGravity = .resizeAspectFill
                        self.view.layer.addSublayer(previewLayer)

                        // 読み取り開始
                        self.session.startRunning()
                    }
                }
            } catch {
                print("Error occured while creating video device input: \(error)")
            }
        }
    }

    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
        for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject] {
            // QRコードのデータかどうかの確認
            if metadata.type != .qr {
                continue
            }

            // QRコードの内容が空かどうかの確認
            if metadata.stringValue == nil {
                continue
            }

            // ここでQRコードから取得したデータで何らかの処理を行う
            // 取得したデータは「metadata.stringValue」で使用できる
        }
    }
}

◾️カメラの利用権限

iOS10以降では、「Info.plist」にカメラを使用する権限を明記しなければクラッシュします。
そのため、Info.plistに以下を追加する必要があります。

Key:Privacy - Camera Usage Description
型:String
Value:利用用途