ZXingObjC を Framework として Xcode プロジェクトに追加して QR コードを読み取る

iOS 開発で QR コードの読み取りが処理が必要になったので、ZXingObjC を使ってみることにしました。

クラスメソッドさんが紹介している「ZXingObjC.xcodeproj をプロジェクトにドロップする方法」でも目的は達成できるのですが、
クリーンビルドすると ZXingObjC 関連ファイルがコンパイルし直されたり、静的解析を走らせたときに ZXingObjC 関連のファイルが引っかかったりするので、Framework としてプロジェクトにリンクすれば解決しそうなのでこの方法を試してみます。

幸い、ZXingObjC は Framework ビルドに対応しているので単にビルドするだけなのですが・・・。

環境

ビルド手順

Github からコードをまるごと取ってきます。執筆時点では 2.1.0 が最新のバージョンとしてタグに登録されているので、そちらを使った方が良いかもしれません。
今回は 2.1.0 以降のコミットを含むリポジトリ全体を取ってくることにしました。

ターミナルで以下のコマンドを入力します。

$ git clone https://github.com/TheLevelUp/ZXingObjC.git
$ cd ZXingObjC

さて、この状態で以下のコマンドを利用してビルドします。-target を指定して iOS Framework としてビルドします。
ちなみにここで xcodebuild -list とすると、ターゲット一覧やビルド構成が表示されます。

$ xcodebuild -list
$ xcodebuild -configuration Release -sdk iphoneos -target "iOS Framework" clean build

ビルドが完了したら ZXingObjC.framework が生成されていることを確認します。

$ ls build/Release-iphoneos/
ZXingObjC.framework ZXingObjCHeaders    libZXingObjC-iOS.a

この中で必要なのは ZXingObjC.framework のみです。

自分のプロジェクトに追加してみる。

さて、Framework の準備ができたので、プロジェクトにリンクしてみます。
Single View Application として新規プロジェクトを作成します。
今回はプロジェクト名を QRReader としました。

プロジェクトを作成したら、先ほどの ZXingObjC.framework をプロジェクトディレクトリにコピーします。

コピーした ZXingObjC.framework をプロジェクトの Frameworks グループにドラッグ&ドロップします。

すると、以下のように「Link Binary With Libraries」セクションに ZXingObjC.framework が追加されました。

念のため、ビルド設定の「Framework Search Paths」も確認しておきます。

最後に、以下の依存 Framework を追加します (公式の README を参照)。

  • AVFoundation.framework
  • CoreGraphics.framework
  • CoreMedia.framework
  • CoreVideo.framework
  • ImageIO.framework
  • QuartzCore.framework


QR の読み取り

以下のようなビューコントローラを作成して実機でテストします。

#import <ZXingObjC/ZXCapture.h>
#import <ZXingObjC/ZXResult.h>
#import "ViewController.h"

@interface ViewController () <ZXCaptureDelegate>
@property (nonatomic, strong) ZXCapture *capture;
@end

@implementation ViewController

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    self.capture = [[ZXCapture alloc] init];
    
    // delegate を設定すると start される
    self.capture.delegate = self;
    self.capture.camera = self.capture.back;
    self.capture.layer.frame = self.view.bounds;
    [self.view.layer addSublayer:self.capture.layer];
}

- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result {
    NSLog(@"%@", result.text);
}

@end

実機で動かしてみてログに読み取った QR コードが表示されれば成功です。