以前、「【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コードリーダ機能を実装する方法についてでした。
ご参考になれば幸いです。