iOSでQRコードのバイナリデータを取得する

以前書いた Android で QR コードのバイナリデータを取得するサンプルの、iOS 版です。

以前書いた記事はこちら

iOSの方もQRコードのバイナリデータを読み込む方法がなかなか見つからなかったので、サンプルコードを提示しておきます。

QRコードのバイナリデータを読み込むアプリ「QRefine」は iOS 版もあるので、アプリが必要であればこちらも是非お使いください。

今回のサンプルコードも全文は GitHub にあげてます。あわせて参照ください。

環境

  • macOS High Sierra 10.13.3
  • Xcode 9.2
  • ZXingObjC 3.2.2
  • Swift 4

準備

ZXingObjC のインストール

iOS の方も QR コードの読み込みには ZXing を使います。

ZXing は Googleが開発している、様々な1次元/2次元バーコードの読み書きができるオープンソースのライブラリで、Objective-C にもポーティングされてるので、そのライブラリを使います。

ZXing の Objecitve-C のポーティングは ZXingObjC というライブラリですので、これを使います。

Carthage、CocoaPods で提供されていますが、ここでは CocoaPods を使うことにします。

Podfile にpod 'ZXingObjC', '~> 3.2.2'を追加してpod install を実行してインストールします。

カメラを使うことを info.plist で宣言

作成した xcworkspace を開いてコードを書いていきますが、その前に今回のアプリではカメラを使うため、info.plist でカメラを使うことを宣言しておきます。

info.plist で Privacy - Camera Usage Description という項目を追加し、適当にメッセージを設定しておきます。(このメッセージはユーザにカメラの使用許可を問い合わせる時に表示されます)

コード

プレビュー用の UIView を配置

まずは、カメラでキャプチャした画面を表示するための View を配置します。Storyboard で View を配置し、レイアウトは適当に画面いっぱいに拡げておきます。

UIView を適当な名前でコードの方に紐付けます。ここでは preview という名前で紐付けました。

ZXing 制御コードを追加

QR コード読み取りコードを追加する。メインの処理を下記に書き出します。

まずはキャプチャ結果を取得するための ZXCaptureDelegate という Protocol の実装を行います。

そして、ZXing のクラス ZXCapture のインスタンスを作成し、

  • ZXCapture がカメラでキャプチャした画面を preview で表示できるように addSubLayer でつなぐ
  • delegate を指定
  • ZXCapture#start() を呼び出してキャプチャ開始

を行います。そのあたりのコードを抜き出したのが下記

これでキャプチャ開始され、QRコードを読み込んだタイミングで captureResult が呼び出され、認識結果が ZXResult という型で渡されます。

よく利用されるテキストデータは ZXResult#text というプロパティに格納されています。

バイナリデータは、ZXResult#resultMetadata (Dictionary型) の kResultMetadataTypeByteSegments.rawValue というキーの値として入っています。

バイト配列の配列として格納されているので、そこから値を取り出してきます。実際のコードは上記のとおり。

動作確認

一応、動作確認したので結果を載せておきます。Android 版の記事でも使った QR コードを読み込んでみます。

URL などのテキストデータ

テキストデータとして URL、バイナリの方にはその UTF-8 のエンコードバイナリが格納されています。

バイナリデータ

相変わらずバイナリデータの方は中身はわかりませんが、Android 版と同じようにデータが読めているようです。

さいごに

Android も iOS バイナリデータを読み込むサンプルがなかなか無かったので、ちょっと実装に苦労しました。

ZXing は QR コードの書き出しもサポートしているので、これらも使いこなせれば QR コードを使うアプリを問題なく作っていけるかと思います。


最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。



この記事をシェアする




りゅーた
フリーランスのエンジニアしてます。Android、iOS アプリの開発、対向サーバの開発、C/C++のライブラリ開発が現在のメイン。趣味はテニス。3児の父。 もっと詳しく

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA