【Swift】「QRCodeReader.swift」ライブラリを使ってQRコードリーダ機能を実装する

  • 2021年11月10日
  • 2021年11月10日
  • Swift, iOS

以前、「【Android】「zxing-android-embedded」という記事で、Android アプリで QR コードリーダを実装する方法についての記事を投稿したので、今回は Swift での実装方法についてです。
使用したライブラリは「QRCodeReader.swift」です。

GitHub のページはこちらから。

GitHub – yannickl/QRCodeReader.swift: Simple QRCode reader in Swift
https://github.com/yannickl/QRCodeReader.swift

 

まず、ライブラリを CocoaPods を使ってインストールします。
Podfile に下記を追加します。

pod 'QRCodeReader.swift', '~> 10.1.0'

上記を追加したら、プロジェクト直下で pod install コマンドを実行してください。
準備は以上です。

次に、QR コードリーダを実装したい ViewController にコードを追加していきます。
サンプルコードは下記の通りです。

import UIKit
import QRCodeReader

class exampleViewController: UIViewController, QRCodeReaderViewControllerDelegate {
    lazy var readerVC: QRCodeReaderViewController = {
        let builder = QRCodeReaderViewControllerBuilder {
            $0.reader = QRCodeReader(metadataObjectTypes: [.qr], captureDevicePosition: .back)
            
            // Configure the view controller (optional)
            $0.showTorchButton        = false
            $0.showSwitchCameraButton = false
            $0.showCancelButton       = true
            $0.showOverlayView        = true
            $0.rectOfInterest         = CGRect(x: 0.2, y: 0.2, width: 0.6, height: 0.6)
            $0.cancelButtonTitle      = "キャンセル"
        }
        return QRCodeReaderViewController(builder: builder)
    }()

    @IBOutlet weak var qrcodeButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        ......
    }

    // アラートを表示
    func showAlert(title: String, message: String, action: UIAlertAction) {
        let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
        alert.addAction(action)
        present(alert, animated: true, completion: nil)
    }

    // QR コードリーダ起動ボタンをタップ
    @IBAction func scanQRcode(_ sender: Any) {
        if QRCodeReader.isAvailable() {
            // QRCodeReader を起動
            readerVC.delegate = self
            readerVC.modalPresentationStyle = .formSheet
            present(readerVC, animated: true, completion: nil)
        } else {
            let close = UIAlertAction(title: "OK", style: .default) { (action) in
                self.dismiss(animated: true, completion: nil)
            }
            showAlert(title: "エラー", message: "この端末ではQRコードリーダを利用できません", action: close)
        }
    }
    
    // QR コードの読み取りに成功
    func reader(_ reader: QRCodeReaderViewController, didScanResult result: QRCodeReaderResult) {
        reader.stopScanning()
        dismiss(animated: true, completion: nil)

        let ok = UIAlertAction(title: "OK", style: .default) { (action) in
            self.dismiss(animated: true, completion: nil)
        }
        if !result.value.isEmpty {
            showAlert(title: "成功", message: result.value, action: ok)
        } else {
            showAlert(title: "エラー", message: "QRコードの読み取りに失敗しました", action: ok)
        }
    }
    // QR コードの読み取りをキャンセル
    func readerDidCancel(_ reader: QRCodeReaderViewController) {
        reader.stopScanning()
        dismiss(animated: true, completion: nil)
        let close = UIAlertAction(title: "OK", style: .default) { (action) in
            self.dismiss(animated: true, completion: nil)
        }
        showAlert(title: "エラー", message: "QRコードの読み取りをキャンセルしました", action: close)
    }
}

ボタンをタップしたら QR コードリーダを起動し、コードの読み取りに成功したらアラートで取得した結果を表示するようにしています。
もしエラーだったり、端末が対応していなかった場合は、その旨をアラートで表示します。

また、QR コードリーダの画面にはキャンセルボタンを表示し、コードの読み込みを中断できるようにしています。
なお、読み取りが中断された場合は、64行目の readerDidCancel() が呼び出されます。

ちなみに、以前は「QRScanner」という別のライブラリを使っていたのですが、こちらは端末によっては対応していない場合があったため(おそらく OS のバージョン?)、今回紹介した「QRCodeReader.swift」に切り替えました。
「QRScanner」の方が QR コード読み取り時のアニメーションがおしゃれだったのですが、動かないならしょうがない!
「QRCodeReader.swift」は今のところ問題なく動作してるとのことでしたので、これでいきたいと思います。

 

以上、Swift の「QRCodeReader.swift」ライブラリを使ってQRコードリーダ機能を実装する方法についてでした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG