ちょっと話題の記事

iOSアプリ開発でZXingObjCを使ってQRコードを読み取る

2013.03.11

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

今回は、iOSアプリ開発で ZXingObjC ライブラリを使い、URLの QRコード を読み取り、ブラウザで表示するサンプルを作ってみたいと思います。

実は、先日書いたZXing 2.1のブログ とほぼ同じ動きをするサンプルになりますが、 今回は ZXingObjective-C に移植した ZXingObjC ライブラリを使用します。 ZXing で手間のかかった環境設定周りの作業が、ZXingObjC ではほとんどなくなるので、非常に使いやすくなっています。

環境構築

今回は、以下の環境を使用します。

  • ZXingObjC 2.1.0
  • Xcode 4.6
  • iOS SDK 6.1
  • iPod touch 5th

まず、サンプル用のプロジェクト「SampleZXingObjC」を作成します
(「Single View Application」テンプレート、ストーリーボード使用、ARC使用)。

次にライブラリをダウンロードします。
https://github.com/TheLevelUp/ZXingObjC/tags から ZXingObjC-2.1.0.zip をダウンロードしましょう。

ダウンロードしたら、ZXingObjC.xcodeproj をドラッグ&ドロップでSampleZXingObjCプロジェクトに追加します。

ios_zxingobjc_decode_01

次に、libZXingObjC-iOS.a のリンクを追加します。

ios_zxingobjc_decode_02

つづけて、ZXingObjC-iOS(ZXingObjC)Target Dependencies に追加します。

ios_zxingobjc_decode_03

最後に、以下のフレームワークを追加します。

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

ios_zxingobjc_decode_04

これで環境構築完了です。エラーもありません。ZXing より簡単です。

サンプルの実装

サンプルの画面を作っていきます。
シンプルに読み取り画面を表示するボタンだけ配置します。

ios_zxingobjc_decode_05

次に、ヘッダーファイルを作成します。

ViewController.h

#import <UIKit/UIKit.h>
#import <ZXingObjC/ZXingObjC.h>

@interface ViewController : UIViewController
<ZXCaptureDelegate>

- (IBAction)showReadViewPressed:(id)sender;

@end

最後に、実装ファイルを作成します。

ViewController.m

#import "ViewController.h"

@interface ViewController ()
@property(nonatomic,retain) ZXCapture* zxcapture;
@end

@implementation ViewController
@synthesize zxcapture;

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (IBAction)showReadViewPressed:(id)sender {
    self.zxcapture = [[ZXCapture alloc] init];
    zxcapture.delegate = self;
    
    // 背面カメラを使います。
    zxcapture.camera = zxcapture.back;
    
    UIViewController* vc = [[UIViewController alloc] init];
    zxcapture.layer.frame = vc.view.bounds;
    [vc.view.layer addSublayer:zxcapture.layer];
    [zxcapture start];
    
    // 読み取り画面を表示します。
    [self presentViewController:vc animated:NO completion:nil];
}

- (void)captureResult:(ZXCapture *)capture result:(ZXResult *)result
{
    if (result.barcodeFormat != kBarcodeFormatQRCode){
        return;
    }
    // ブラウザを起動します。
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:result.text]];
    
    // 読み取り画面を閉じます。
    [self dismissViewControllerAnimated:NO completion:nil];
    [zxcapture stop];
    self.zxcapture = nil;
}

@end

これでサンプルの実装は完了です。

動作確認

まず、QRコードを用意します。このコードは文字列にすると http://classmethod.jp になります。

ios_zxing_18

では、アプリを起動します。

ios_zxingobjc_decode_06

「読み取り画面表示」ボタンをタップして、読み取り画面を表示して、QRコードを認識させます。

ios_zxingobjc_decode_07

ios_zxingobjc_decode_08

QRコードを認識した直後に、ブラウザが起動しました!

ちなみに、環境設定や使い方については、
https://github.com/TheLevelUp/ZXingObjC#readme はもちろん、
付属のサンプル( ZXingObjC-2.1.0/examples/BarcodeScanner/BarcodeScanner.xcodeproj )も参考になります。
次回は、ZXingObjC を使って QRコード を生成(エンコード)してみたいと思います。

ではでは。