Android界隈でQRコードを読み込むライブラリといえばZXingがデファクトの様ですが、 iOS でもいけるらしいです。
zxing – Multi-format 1D/2D barcode image processing library with clients for Android, Java
サンプルコードは多岐に渡り、なにやら Google Appengine とかのも。
とりあえずメモ。
ライブラリのインストール
ここからZXing (現時点の最新は ZXing-2.1.zip) をダウンロードして解凍。後で自分のプロジェクトからヘッダファイルを参照したりするので動かしにくくなるんで、解凍する場所はちゃんと。
XCodeで自分のプロジェクトを開く
解凍したフォルダの下の
/iphone/ZXingWidget/ZXingWidget.xcodeproj
を、自分が開発してる XCodeのプロジェクト・ナビゲーター (左のペイン)上のプロジェクト直下にドラッグ&ドロップ
XCodeで 自プロジェクトの TAGETS の Build Phases設定
XCodeのプロジェクト・ナビゲーター (左のペイン)上のプロジェクトを選択し、真ん中の[TARGETS]の下のプロジェクト名をクリック
[Link Binary With Libraries]をクリックして展開
+をクリックして以下を追加
libZXingWidget.a
真ん中のタブ?の[Build Phases]をクリック
[Target Dependencies]をクリックして展開
+をクリックして[ZXingWidget]を追加
[Link Binary With Libraries]をクリックして展開
+をクリックして以下を追加
libiconv.dylib
CoreMedia.framework
CoreVideo.framework
AVFoundation.framework
AudioToolbox.framework
AddressBook.framework
AddressBookUI.framework
CoreGraphics.framework
XCodeで 自プロジェクト の TAGETS の Build Settings設定
XCodeのプロジェクト・ナビゲーター (左のペイン)上の自プロジェクトを選択し、真ん中の[TARGETS]の下の自プロジェクト名をクリック
真ん中のタブ?の[Build Settings]をクリック
[Search Paths]の[Header Search Paths]をダブルクリック
+をクリックして下記を追加する。(recursiveにセット)
/Users/yourname/workspace/zxing/iphone/ZXingWidget/Classes
+をクリックして下記を追加する。(non-recursiveにセット)
/Users/yourname/workspace/zxing/cpp/core/src/
[Always Search User Paths] を YESにセット
※プロジェクトのREADMEには書いていなかったが、ドラッグしたZXingWidget.xcodeproj を選択し、 TARGETS の下の [ZXingWidget] と [ZXingTests] の両方にもこれらと同じ設定にしないとビルド出来なかった。
ViewController.h
サンプルやら何やらをこねくり回したものを晒しときます。
現時点の XCode のバージョンは 4.5.2 です。
#import
#import “ZXingWidgetController.h”
@interface QRViewViewController : UIViewController
{ UITextView *textView;
NSString *resStr;
}
@property (nonatomic, retain) UITextView *textView;
@property (nonatomic, copy) NSString *resStr;
– (void)scanPressed:(id)sender;
@end
ViewController.mm
※拡張子注意!mm にしないとコンパイル通りません
#import “QRViewViewController.h”
#import “QRCodeReader.h”
@interface QRViewViewController ()
@end
@implementation QRViewViewController
@synthesize textView;
@synthesize resStr;
– (void)scanPressed:(id)sender
{
ZXingWidgetController *zxController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];
QRCodeReader* qrcodeReader = [[QRCodeReader alloc] init];
NSSet *readers = [[NSSet alloc ] initWithObjects:qrcodeReader,nil];
zxController.readers = readers;
[self presentModalViewController:zxController animated:YES];
}
– (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
}
return self;
}
– (void)loadView
{
[super loadView];
UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn1 setFrame:CGRectMake(40, 220, 240, 50)];
[btn1 setTitle:@”QRコードを読み取る” forState:UIControlStateNormal];
[btn1 setTag:1];
[btn1 addTarget:self action:@selector(scanPressed:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn1];
textView = [[UITextView alloc] initWithFrame:CGRectMake(40 , 280, 240, 50)];
[self.view addSubview:textView];
}
– (void)viewDidUnload
{
[super viewDidUnload];
}
– (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
– (void)zxingController:(ZXingWidgetController*)controller didScanResult:(NSString *)result {
self.resStr = result;
if (self.isViewLoaded) {
[textView setText:resStr];
[textView setNeedsDisplay];
}
[self dismissModalViewControllerAnimated:NO];
}
– (void)zxingControllerDidCancel:(ZXingWidgetController*)controller {
[self dismissModalViewControllerAnimated:YES];
}
@end
参考にさせて頂いたサイト
ZXingをXcodeプロジェクトに組み込む-@blog.justoneplanet.info
iOSでQRコードを読み込む(ZXing 2.0) : てるてる坊主
2013-03-23 追記
この記事よりも下記の方が判りやすいです。
iOSアプリ開発でZXing2.1を使ってQRコードを読み取る | Developers.IO
Apple LLVM compiler 4.2 – Language の C++ Language Dialect と C++ Standard Library を Compiler Default にしてあげる必要があります。