[iOS] ZXingObjCを使ってQRコードを読み取る

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。モバイルアプリサービス部の平屋です。

本記事では、ZXingObjCを使ってQRコードを読み取る実装を紹介します。

検証環境

  • macOS High Sierra 10.13.5
  • Xcode Version 9.4.1
  • iPhone X, iOS 11.4
  • ZXingObjC 3.2.2

導入

CocoaPodsやCarthageなどを使用して導入できます。

// Podfileの作成例
target 'QRReader' do
  pod 'ZXingObjC', '~> 3.2.2'
end

実装

Info.plistにカメラの使用目的を追加する

Info.plistにNSCameraUsageDescriptionと値(カメラの使用目的)を追加します。

<key>NSCameraUsageDescription</key>
<string>QRコードを読み取るために使います</string>

QRコード読み取り用のレイヤーを追加する

バーコード読み取り用のクラスZXCaptureのレイヤーをviewのレイヤーに追加します。

import UIKit
import ZXingObjC
import SafariServices

class ScanViewController: UIViewController {

    private let capture = ZXCapture()

    // ...

    override func viewDidLoad() {
        super.viewDidLoad()
        capture.delegate = self
        capture.camera = capture.back()
        capture.layer.frame = view.bounds
        view.layer.addSublayer(capture.layer)
        capture.start()
    }

    // ...
}

QRコード検出時の処理を実装する

ZXCaptureDelegatecaptureResult(_:result:)内に取得結果を使用する処理を追加します。

extension ScanViewController: ZXCaptureDelegate {

    func captureResult(_ capture: ZXCapture!, result: ZXResult!) {
        // ...

        capture.stop()
        guard let urlString = result.text, let url = URL(string: urlString) else { return }

        // 取得結果を使用する処理
        present(SFSafariViewController(url: url), animated: true)
    }
}

動作確認

以下のQRコードを読み取ってみます。内容は文字列「http://classmethod.jp」です。

ボタンをタップして、読み取り画面を表示します。

読み取り画面が表示されます。

QRコードを認識すると、SFSafariViewControllerが開き、webページが表示されます。

さいごに

本記事では、ZXingObjCを使ってQRコードを読み取る実装を紹介しました。

今回解説したサンプルアプリケーションは以下のリポジトリで公開していますので参考にしてみてください!

参考資料