본문으로 바로가기


ZXing (Zebra Crossing) 라이브러리
는 자바로 개발된 바코드 프로세싱 오픈소스 라이브러리다. 자바로 개발되었지만 다양한 플랫폼을 위한 모듈들을 제공한다. 여기서는 ZXing 라이브러리를 이용하여 iOS 기반의 QR코드 리더 앱을 개발하는 과정을 간단하게 설명한다.

프로젝트 생성
1. Window-based Application 프로젝트를 선택하여 'ZXingTest' 프로젝트를 생성한다.



ZXingWidget 라이브러리 추가
1. 다운로드 받은 ZXing 라이브러리의 압축을 해제하고 zxing 폴더를 ZXingTest 프로젝트 폴더에 복사한다. 실제로 필요한 폴더는 zxing/cpp 폴더와 zxing/iPhone 폴더다. 두 폴더의 절대 경로만 정확하게 알고 있다면 위치는 크게 상관없다. 편의를 위해 폴더 그대로 복사한다.



2. Project Navigator (Command + 1) 에서 프로젝트 파일을 선택하고 컨텍스트 메뉴(우 클릭)에서 'Add Files to "ZXingTest"...'를 클릭한다. zxing\iPhone\ZXingWidget 폴더에 포함된 ZXingWidget.xcodeproj 파일을 선택하여 XZingWidget 프로젝트를 추가한다.




3. ZXingWidget 프로젝트 파일을 선택하고 File Inspector (Command + option + 1)를 열어 Location 속성을 'Relative to Project'로 변경한다.



4. Project Navigator에서 프로젝트 파일을 선택하고 Targets의 ZXingTest를 선택한다. Build Phases 탭의 'Link Binary With Libraries' 항목을 확장하여 'libZXingWidget.a'와 함께 다음 프레임워크들을 모두 추가한다.

- AVFoundation
- AudioToolbox
- CoreVideo
- CoreMedia
- libiconv
- AddressBook
- AddressBookUI
 


5. Build Phases 탭의 'Target Dependencies' 항목을 확장하고 ZXingWidget을 추가한다.
3번 과정으로 인해 Item이 표시되지 않습니다.



6. ZXing 라이브러리의 헤더파일을 찾을 수 있도록 헤더파일이 등록된 경로를 추가해준다. Build Settings 탭의 'Header Search Paths" 항목에 다음 두 항목을 추가한다. $(SRCROOT)는 프로젝트 파일이 위치한 폴더 경로를 나타낸다.

- $(SRCROOT)/zxing/cpp/core/src
- $(SRCROOT)/zxing/iPhone/XZingWidget/Classes (Recursive 체크)



정상적으로 빌드되는지 확인한다.




루트 뷰 컨트롤러 추가
닙(Xib) 파일을 포함하는 새 뷰 컨트롤러를 프로젝트에 추가한다. 이름은 RootViewController로 한다. 추가 후 ZXingTestAppDelegate.m 파일과 RootViewController.m 파일의 확장자를 'mm' 으로 변경한다.



* 프로퍼티 선언, 릴리즈 코드는 생략.

RootViewController.xib
QR코드 스캔 결과를 표시할 읽기 전용의 UITextField 컨트롤과 UIButton 컨트롤을 추가한다.



RootViewController.h
ZXingDelegate 프로토콜을 추가하고 아웃렛, 액션 매서드를 선언한다.
#import <UIKit/UIKit.h>
#import "ZXingWidgetController.h"
#import "QRCodeReader.h"

@interface RootViewController : UIViewController <ZXingDelegate>
{
    UITextField *results;
}

@property (retain, nonatomic) IBOutlet UITextField *results;

- (IBAction)scanPressed:(id)sender;

@end

RootViewController.mm
scanPressed: 액션 메서드와 XZingDelegate 프로토콜 메서드를 구현한다.
- (IBAction)scanPressed:(id)sender
{
    // QR코드 스캔 뷰 컨트롤러 선언
    ZXingWidgetController *controller = [[ZXingWidgetController alloc] initWithDelegate:self 
                                                                             showCancel:YES 
                                                                               OneDMode:NO];
    
    QRCodeReader *reader = [[QRCodeReader alloc] init];
    NSSet *readers= [[NSSet alloc] initWithObjects:reader, nil];
    [reader release];
    
    controller.readers = readers;
    [readers release];
    
    // 모달 뷰로 표시한다.
    [self presentModalViewController:controller animated:YES];
    [controller release];
}

#pragma mark - XZingDelegate

// QR코드 스캔 결과를 표시
- (void)zxingController:(ZXingWidgetController *)controller didScanResult:(NSString *)result
{
    NSLog(@"result : %@", result);
    self.results.text = result;    
    [self dismissModalViewControllerAnimated:NO];
}

// 스캔 취소
- (void)zxingControllerDidCancel:(ZXingWidgetController *)controller
{
    [self dismissModalViewControllerAnimated:YES];
}

 아웃렛과 액션 메서드를 닙 파일의 View에 연결한다.


ZXingTestAppDelegate.h
RootViewController 프로퍼티를 선언한다.
#import <UIKit/UIKit.h>
#import "RootViewController.h"

@interface ZXingTestAppDelegate : NSObject <UIApplicationDelegate>
{
    RootViewController *rootViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) RootViewController *rootViewController;

@end

ZXingTestAppDelegate.mm
RootViewController 객체를 생성해서 뷰로 추가한다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" 
                                                                   bundle:nil];
    
    [self.window addSubview:self.rootViewController.view];
    [self.window makeKeyAndVisible];

    return YES;
}


빌드하고 디바이스에서 실행한다.


ZXingTest.zip






출처: http://sunsideup.tistory.com/84 [Sunny Side Up]





QR 개발관련 - iOS 7 이후에는 QRCodeReaderViewController를 활용합니다