この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
今回は、iOSアプリ開発で ZXing ライブラリを使い、URLの QRコード を読み取り、ブラウザで表示するサンプルを作ってみたいと思います。
ちなみに ZXing の概要とAndroid版については、「Android Tips #41 ZXing ライブラリ (2.1) を使って QR コードを読み取る」 を参考にしてください。
環境構築
今回は、以下の環境を使用します。
- ZXing 2.1
- Xcode 4.6
- iOS SDK 6.1
- iPod touch 5th
まず、サンプル用のプロジェクトを作成します。
「MyProject」フォルダを作成し、その中に「SampleZXing」プロジェクトを作成します
(「Single View Application」テンプレート、ストーリーボード使用、ARC使用)。
次にライブラリをダウンロードします。
http://code.google.com/p/zxing/downloads/list から ZXing-2.1.zip をダウンロードしましょう。
ダウンロードしたら、同じく「MyProject」フォルダに入れておきます。
この中の「iphone」フォルダに「README」ファイルがあり、詳しく構築手順が載っているので(英語ですが、、)、
これに沿って構築していきます。
Xcodeのバージョンの違いからか、はまったところがいくつかあったので、スクリーンショットを多めに載せていこうと思います。
1. プロジェクトにZXingWidgetを追加する
ドラッグ&ドロップで ZXingWidget.xcodeproj をSampleZXingプロジェクトに追加します。
2. ZXingWidgetライブラリをリンクする
下の画面の順に操作していき、ライブラリ追加ウィンドウを表示します。
ライブラリ追加ウィンドウが表示されたら、libZXingWidget.a を追加します。
3. Target DependenciesにZXingWidgetを追加する
これも下の画面の順に操作していき、追加ウィンドウを表示します。
追加ウィンドウが表示されたら、ZXingWidget を追加します。
4. Header search path を追加する その1
下の画面の順に操作していき、Header search paths に ../zxing-2.1/iphone/ZXingWidget/Classes を recursive で追加します。
5. Header search path を追加する その2
同じように Header search paths に ../zxing-2.1/cpp/core/src を non-recursive で追加します。
6. フレームワークを追加する
以下のフレームワークを追加します。
- AVFoundation
- AudioToolbox
- CoreVideo
- CoreMedia
- libiconv
- AddressBook
- AddressBookUI
追加後は以下の画面のようになります。
7. 環境構築完了
これで実装する準備がほぼ整いました。(原文は、7. You're almost ready to go ..)
とありますが、ビルドするとこんな感じに。。。
エラーをなくすために、Other Warning Flags から -Werror を削除します。
今度こそ、ほぼ構築完了です。
サンプルの実装
サンプルの画面を作っていきます。シンプルに読み取り画面を表示するボタンだけ配置します。
次にヘッダーファイルを作成します。
ViewController.h
#import <UIKit/UIKit.h>
#import <ZXingWidgetController.h>
#import <QRCodeReader.h>
@interface ViewController : UIViewController
<ZXingDelegate>
- (IBAction)showReadViewPressed:(id)sender;
@end
インポート文、デリゲート、ハンドラを追加しましたが、ビルドするとエラーが出ました。。。
これを直すには、ViewController.mファイルの拡張子を mm に変更し、
ViewController.mm にしてあげる必要があるようです(C++を使用しているため)。
拡張子を変更したら、処理を実装します。
ViewController.mm
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (IBAction)showReadViewPressed:(id)sender
{
// 読み取り画面を生成します。
ZXingWidgetController *zxingWidgetController = [[ZXingWidgetController alloc]
initWithDelegate:self
showCancel:YES
OneDMode:NO];
QRCodeReader *qrcodeReader = [[QRCodeReader alloc] init];
zxingWidgetController.readers = [[NSSet alloc] initWithObjects:qrcodeReader, nil];
// 読み取り画面を表示します。
[self presentViewController:zxingWidgetController animated:NO completion:nil];
}
- (void)zxingController:(ZXingWidgetController*)controller
didScanResult:(NSString *)result
{
// 読み取り画面を閉じます。
[self dismissViewControllerAnimated:NO completion:nil];
// ブラウザを起動します。
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:result]];
}
- (void)zxingControllerDidCancel:(ZXingWidgetController*)controller
{
// 読み取り画面を閉じます。
[self dismissViewControllerAnimated:NO completion:nil];
}
@end
「読み取り画面表示」ボタンタップ時には読み取り画面を表示します。
読み取り画面で、読み取り成功時には読み取り画面を閉じて、ブザウザを起動させ、
「キャンセル」ボタンタップ時には読み取り画面を閉じています。
これで、サンプル完成! と思いきや、そうはいきませんでした。
ビルドすると、またしてもエラーが出ました。今度は31個。。。
これを直すには、Apple LLVM compiler 4.2 - Language の C++ Language Dialect と C++ Standard Library を Compiler Default にしてあげる必要があります。
下の画面の順に操作していき、修正します。
修正するとこのようになります。
今度こそ、サンプルの実装は完了です。
動作確認
まず、QRコードを用意します。このコードは文字列にすると http://classmethod.jp になります。
アプリを起動します。
「読み取り画面表示」ボタンをタップして、読み取り画面を表示して、QRコードを認識させます。
QRコードを認識した直後に、ブラウザが起動しました!
少し設定に手間がかかりましたが、なんとかできました。
ちなみに、設定周りについては、付属のサンプル(zxing-2.1/iphone/Barcodes/Barcodes.xcodeproj)が参考になります。
ZXingWidget.xcodeproj の Other Warning Flags から -Werror を削除するだけで動きました。
ではでは。