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