React Native 바코드 스캐너

I. 목표

웹뷰 기반의 하이브리드 앱에서는 바코드를 스캔할수 있는 기능을 연구한다.

II. 연구 및 개발내용

일반적인 네이티브앱에서는 바코드 스캐너는 구현하기 쉽다. 하지만, 웹뷰 기반의 하이브리드 앱에서는 네이티브로 플러그인을 구현하여 웹으로 전달해야 한다.

1. 플러그인 모듈 프로젝트 생성

1) create-react-native-module 설치

yarn global add create-react-native-module

또는

npm install -g create-react-native-module

 

2) 모듈생성

create-react-native-module  NpcBarcode

 

3) 해당프로젝트에 모듈설치

cd ./native_modules

npm install ./react-native-npc-barcode

 

2. Urovo 스캐너 모듈 추가

해당 플러그인 모듈 프로젝트에 Urovo스캐너 SDK인 platform_sdk_vXXXXjar 파일을 다운로드하여 react-native-npc-barcode/android/libs/ 폴더에 추가한다.

https://github.com/urovosamples/SDK_ReleaseforAndroid

 

3. Urovo 스캐너 구현

private ScanManager mClsScanManager         = null;

private ReactApplicationContext mClsContext = null;

private UrovoBroadcastReceiver mClsReceiver = null;

private IntentFilter mClsIntentFilter = new. IntentFilter(ScanManager.ACTION_DECODE);

 

public UrovoScanner(ReactApplicationContext clsContext)

{

Log.d(LOGGER_TAG, “*UrovoScanner() 생성자 “);

this.mClsContext        = clsContext;

this.mClsScanManager    = new ScanManager();

this.mClsReceiver       = new UrovoBroadcastReceiver(clsContext);

this.mClsContext.registerReceiver(this.mClsReceiver,

this.mClsIntentFilter);

this.mClsContext.addLifecycleEventListener(lifecycleEventListener);

}

 

@Override

public boolean start()

{

boolean boolResult = false;

try

{

boolResult = mClsScanManager.openScanner();

Log.d(LOGGER_TAG, “*UrovoScanner.start(), Result: ” + boolResult);

}

catch (Exception e)

{

Log.d(LOGGER_TAG, “*UrovoScanner.start() Exception :”+ e.getMessage());

}

return boolResult;

}

@Override

public boolean stop()

{

boolean boolResult = false;

try

{

boolResult = mClsScanManager.closeScanner();

Log.d(LOGGER_TAG, “*UrovoScanner.stop(), Result: ” + boolResult);

}

catch (Exception e)

{

Log.d(LOGGER_TAG, “*UrovoScanner.stop() Exception :”+ e.getMessage());

}

return boolResult;

}

 

 

4. 웹어서 네이트브를 호출하기 위한 index.js파일 구현

import { NativeEventEmitter, NativeModules } from ‘react-native’;

const { NpcBarcode } = NativeModules;

const isAndroid = Platform.OS === ‘android’;

let clsEmitter = null;

if(isAndroid) clsEmitter = new NativeEventEmitter();

 

export default class NpcBarcodeScanner

{

static async init(strBrand)

{

console.log(“NpcBarcodeScanner.init(), Brand:”+ strBrand);

return await NpcBarcode.init(strBrand);

}

static addEventListener(strEventType, objHandler)

{

console.log(“NpcBarcodeScanner.addEventListener()”);

if(clsEmitter != null) return clsEmitter.addListener(strEventType, (data) => { objHandler(data); });

return null;

}

 

static removeEventListener(objListener)

{

console.log(“NpcBarcodeScanner.removeEventListener()”);

NpcBarcode.release();

if(objListener != null)

{

objListener.remove();

}

}

static async start()

{

console.log(“*NpcBarcodeScanner.start()”);

return await NpcBarcode.start();

}

static async stop()

{

console.log(“*NpcBarcodeScanner.stop()”);

return await NpcBarcode.stop();

}

};

 

5. React Native에서 바코드 스캐너 호출

import BarcodeScanner from  “react-native-npc-barcode”;

BarcodeScanner.start(), BarcodeScanner.stop() 명령등을 이용하여 바코드 스캔시작, 종료 처리

 

III. 결론

간단히 만들어보았지만 네이트브를 통해 하이브리드 웹에 전달된 바코드는 잘 읽혔고, 속도도 괜찮았다.

태그 ,