酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOSでZBarSDKを使ってバーコードの読み込みをおこなう

すまべん・Androidの会勉強会の時に、モノタッチの中の人がバーコードを読み取る為にこんなライブラリを使っています・・・と、ZBarSDKを使われているのを知って、ぜひうちでも使ってみようと言う事になりました。

ZBarSDKは、カメラプレビューからバーコードのスキャンニングとデコードを行ってくれるオープンソースのライブラリです。

A comprehensive software suite for reading barcodes. Supports EAN/UPC, Code 128, Code 39, Interleaved 2 of 5 and QR Code. Includes libraries and applications for decoding captured barcode images and using a video device (eg, webcam) as a barcode scanner.

ZBar bar code reader download | SourceForge.net

ExampleがSDK内に含まれているので特に説明は必要ないと思いますが、ZBarSDKを自身のプロジェクトに組み込むまでを備忘録代わりに残しておこうと思います。

  • ZBarSampleプロジェクトを新規作成
  • ZBarSampleプロジェクトのClasses等と同じ階層にZBarSDKを配置
  • プロジェクトへ「既存ファイルの追加」でZBarSDKフォルダごと追加

ZBarSDKで使用しているフレームワークを追加する

割りと多くのフレームワークを使っているので追加してあげます。

  • AVFoundation.framework
  • CoreMedia.framework
  • CoreVideo.framework
  • libiconv.dylib
  • QuartzCore.framework

ZBarSample_Prefix.pchにSDKのヘッダを追加

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>

    // for ZBarSDK
    #import "ZBarSDK.h"
#endif

ZBarSampleViewController.xibをInterfaceBuilderで編集

スキャンを開始するボタンと読み込んだバーコードデータを表示するテキストを付けます。


ZBarSampleViewControllerでZBarSDKからのdelegateを受けられるようにします。

// ZBarSampleViewController.h
@interface ZBarSampleViewController : UIViewController<ZBarReaderDelegate> {
    UITextView *resultText;
}

@property (nonatomic, retain) IBOutlet UITextView *resultText;

- (IBAction) clickButton;

@end
// ZBarSampleViewController.m
// ロードと同時にZBarSDKのViewControllerへ遷移する
- (IBAction) clickButton {
	ZBarReaderViewController *reader = [ZBarReaderViewController new];
	reader.readerDelegate = self;
	
	ZBarImageScanner *scanner = reader.scanner;
	// TODO: (optional) additional reader configuration here
	
	// EXAMPLE: disable rarely used I2/5 to improve performance
	[scanner setSymbology:ZBAR_I25 config:ZBAR_CFG_ENABLE to:0];
	
	// ZBarReaderViewをモーダルで開く
	[self presentModalViewController:reader animated: YES];
	[reader release];
}

// バーコードのデコード完了
- (void) imagePickerController: (UIImagePickerController*) reader
 didFinishPickingMediaWithInfo: (NSDictionary*) info
{
    id<NSFastEnumeration> results =
		[info objectForKey: ZBarReaderControllerResults];
    ZBarSymbol *symbol = nil;
    for(symbol in results)
	// 一度に複数のデータが取得出来るので最初のデータだけを取得する
        break;
	
    // barcode data をテキストビューに設定(表示)
    resultText.text = symbol.data;
	
    // モーダルビューを閉じる
    [reader dismissModalViewControllerAnimated: YES];
}

これで実行出来ると、スキャンしたバーコードのデータがresultTextに表示されます。