SMS

SMS 소개

SMS(Short Message Service)는 모바일 장치에서 문자메시지를 처리하고 관리하는 기능을 수행하는 오브젝트입니다. 목록보기, 보내기, 받기, 삭제하기와 같은 기본 기능과 수신 이벤트 처리 기능을 수행할 수 있습니다.

iOS에서는 환경의 제약으로 문자 보내기 기능만 사용이 가능합니다.

문자메시지 보기/삭제하기

모바일 장치에 저장되어 있는 문자 메시지 목록을을 가져오는 방법과 삭제하는 방법에 대해 설명합니다.

문자 메시지 삭제 기능은 안드로이드 v4.4(KitKat) 미만의 장치에서만 사용할 수 있습니다.

예제

다음은 모바일 장치에 저장된 문자 메시지 목록을 받아와서 ListView 컴포넌트를 사용해 화면에 출력하는 예제입니다. 예제를 실행하면 메시지를 받아온 후 가장 최근의 8개 메시지만 화면에 출력해줍니다.

문자 메시지를 삭제하려면 삭제하려는 항목을 약 1초 정도 터치합니다.

sample_sms_01_01

예제에서 사용한 핵심 기능

Sms > readMessageList 메소드

모바일 장치에 저장되어 있는 문자 메시지 목록을 가져오는 메소드입니다. 받아온 메시지는 onreadmessagelist 이벤트의 e.smsmessages 속성에서 확인할 수 있습니다. 저장된 문자 메시지가 많으면 조회에 시간이 걸릴 수 있습니다.

Sms > deleteMessage 메소드

모바일 장치에 저장되어 있는 문자 메시지를 삭제하는 메소드입니다. 환경의 제약으로 iOS는 지원하지 않으며 안드로이드에서는 v4.4 미만 버전에서만 동작합니다.

SmsMessageListEventInfo > smsmessages 속성

조회한 문자 메시지 목록을 갖는 속성입니다. 문자 메시지 목록은 SmsMessage 오브젝트 배열로 저장됩니다. 조회된 목록의 총 개수는 e.smsmessages.length로 확인할 수 있습니다.

SmsMessage 오브젝트

문자 메시지 목록을 저장하는 오브젝트입니다. date, message, phonenumber, smsid, type 속성을 갖습니다. 각 속성에 대한 자세한 설명은 넥사크로 스튜디오 Help의 [EventInfo Objects > SmsMessageListEventInfo > SmsMessage] 항목을 참조하십시오.

예제 구현 방법

1

화면 구성하기

Sms 오브젝트를 추가합니다. 추가된 오브젝트는 Invisible Object 창에서 확인할 수 있습니다.

조회한 문자 메시지를 저장하기 위한 Dataset과 화면에 출력하기 위한 ListView 컴포넌트, Static 컴포넌트를 추가한 후 예제의 그림과 같이 적절히 배치합니다.

화면 구성을 위해 사용한 컴포넌트 및 오브젝트는 다음과 같습니다.

컴포넌트/오브젝트

ID

SMS

Sms00

ListView

lstv_msg

Static

stt_msg

Dataset

Dataset00

2

Dataset 오브젝트 설정하기

조회한 문자 메시지를 저장할 Dataset 오브젝트를 설정합니다. Invisible Object 창에서 Dataset 오브젝트를 오픈하여 다음과 같이 컬럼을 생성합니다.

sample_sms_01_02

3

ListView 컴포넌트 설정과 데이터셋 바인딩하기

Dataset에 저장한 문자 메시지를 ListView 컴포넌트를 사용해 화면에 출력합니다. ListView 컴포넌트의 속성을 다음과 같이 설정하고 Dataset을 바인딩합니다.

속성

bandexpandtype

accordion

bandinitstatus

collapse

visible

false

binddataset

Dataset00

4

ListView 아이템 구성하기

ListView에서 아이템 목록을 표현하려면 Band와 Detail 밴드를 생성하고 화면 요소인 Cell을 추가해 준 후 각 Cell과 Dataset을 바인딩 시켜주는 작업이 필요합니다.

우선 ListView를 더블 클릭하여 ListView 편집기를 오픈합니다. 앞 과정에서 이미 Dataset을 바인딩시켜놨기 때문에 Body 밴드와 각 항목이 Cell로 추가되어 있음을 확인할 수 있습니다. 문자 메시지의 전체 내용은 Detail 밴드 영역에 출력할 것이므로 [Append Detail] 버튼으로 Detail 밴드를 생성합니다.

sample_sms_01_03

Body 밴드에는 전화번호(Phonenumber), 일부 문자 내용(Message), 날짜 정보(Date)를 출력하고 Detail 밴드에는 문자 메시지(Message)를 출력하도록 Cell을 구성합니다.

Body 밴드를 더블 클릭하여 다음과 같이 Cell을 배치합니다. 화면에 출력할 필요가 없는 smsid, type Cell은 삭제하고 새로 두 개의 Cell을 추가합니다.

sample_sms_01_04

Body 밴드의 각 Cell의 속성을 다음과 같이 설정합니다.

Cell id

속성

Cell00

displaytype

checkboxcontrol

edittype

checkbox

Cell01

text

bind:Phonenumber

Cell02

displaytype

imagecontrol

expr

EXPR:dataset.getColumn(currow, "type")=="receive"?"imagerc::ico_call-received-arrow_32_blue.png":"imagerc::ico_call-made-right-arrow_32_red.png"

imagestretch

fixaspectratio

Cell03

text

bind:Message

Cell04

text

bind:Date

Detail 밴드를 더블 클릭하여 다음과 같이 Cell을 배치한 후 Cell을 하나 추가합니다. 추가한 Cell은 문자 메시지 내용을 출력할 수 있도록 TextArea로 설정합니다.

sample_sms_01_05

Detail 밴드의 Cell 속성을 다음과 같이 설정합니다.

Cell id

속성

Cell00

displaytype

textareacontrol

text

bind:Message

5

Form 이벤트 함수 작성하기

Form을 로딩한 후 바로 모바일 장치의 문자 메시지를 조회합니다.

/* Form onload 이벤트 함수 */
this.sample_sms_01_onload = function(obj:nexacro.Form,e:nexacro.LoadEventInfo)
{
	this.stt_msg.set_text("Loading message.");
	this.stt_msg.set_visible(true);	
	this.lstv_msg.set_visible(false);		

	// 문자 메시지를 조회
	this.Sms00.readMessageList();	
};

ListView의 아이템을 일정 시간 터치했을 때 아이템을 삭제할 수 있도록 ontimer 이벤트 함수를 작성합니다. 그리고 다른 함수에서 타이머를 종료시킬 수 있도록 타이머 ID를 저장할 전역 변수를 선언합니다.

// 타이머 ID를 저장할 전역 변수
var numTimerID = 17;

/* Form ontimer 이벤트 함수 */
this.sample_sms_01_ontimer = function(obj:nexacro.Form,e:nexacro.TimerEventInfo)
{
	var arrRowIdx = this.lstv_msg.getSelectedRows();
	
	var bReturn = this.confirm("Are you sure delete message?")
	
	if(bReturn)
	{
		var numSmsID = this.Dataset00.getColumn(arrRowIdx[0], "smsid");
			
		this.Sms00.deleteMessage(numSmsID);
	}
	
	this.killTimer(numTimerID);
};

6

Sms 오브젝트 이벤트 함수 작성하기

Form이 로딩된 후 readMessageList 메소드가 수행되면 onreadmessagelist 이벤트가 발생합니다. onreadmessagelist 이벤트 함수에서는 조회된 문자 메시지를 Dataset에 저장하는 기능을 합니다.

/* Sms 오브젝트 onreadmessagelist 이벤트 함수 */
this.Sms00_onreadmessagelist = function(obj:nexacro.Sms,e:nexacro.SmsMessageListEventInfo)
{
	var numSMS, curRow, strImage;

	if(e.smsmessages.length > 0)
	{
		this.stt_msg.set_visible(false);
		this.lstv_msg.set_visible(true);

		this.Dataset00.clearData();
		this.lstv_msg.set_enableevent(false);

		for(numSMS=0; numSMS < 8; numSMS++)
		{		
			curRow = this.Dataset00.addRow();
			
			this.Dataset00.setColumn(curRow, "smsid", e.smsmessages[numSMS].smsid);
			this.Dataset00.setColumn(curRow, "Phonenumber", e.smsmessages[numSMS].phonenumber);
			this.Dataset00.setColumn(curRow, "Message", e.smsmessages[numSMS].message);
			this.Dataset00.setColumn(curRow, "Date", e.smsmessages[numSMS].date);
			this.Dataset00.setColumn(curRow, "Type", e.smsmessages[numSMS].type);		
		}		

		this.lstv_msg.set_enableevent(true);

		this.resetScroll();	
	}
	else
	{
		this.stt_msg.set_text("No messages.");
		this.stt_msg.set_visible(true);
		
		this.lstv_msg.set_visible(false);		
	}
};

ondeletemessage 이벤트는 사용자가 문자 메시지를 삭제할 때 발생합니다. 삭제된 문자 메시지에 해당하는 Dataset 항목을 삭제합니다.

/* Sms 오브젝트 ondeletemessage 이벤트 함수 */
this.Sms00_ondeletemessage = function(obj:nexacro.Sms,e:nexacro.SmsEventInfo)
{	
	var numRow = this.Dataset00.findRow("smsid", e.smsid)
	this.Dataset00.deleteRow(numRow);
};

Sms 오브젝트의 onerror 이벤트 함수를 다음과 같이 작성합니다. Sms 오브젝트의 메소드 호출에 오류가 발생했을 때 사용자에게 어떤 오류인지 알려줍니다.

/* Sms 오브젝트 onerror 이벤트 함수 */
this.Sms00_onerror = function(obj:nexacro.Sms,e:nexacro.SmsErrorEventInfo)
{
	var strResult = "["+ e.errortype +" "+ e.statuscode +"] "+ e.errormsg;
	strResult += "\n"+ "smsid = "+ e.smsid;
	strResult += "\n"+ "phonenumber = "+ e.phonenumber;
	strResult += "\n"+ "message = "+ e.message;
	
	alert(strResult);	
};

7

ListView 컴포넌트 이벤트 함수 작성하기

ListView 컴포넌트의 Band 영역이나 Cell 영역을 클릭하면 Detail 밴드를 화면에 표시합니다.

/* ListView 컴포넌트의 onbandclick 이벤트 함수 */
this.lstv_msg_onbandclick = function(obj:nexacro.ListView,e:nexacro.ListViewClickEventInfo)
{
	this.lstv_msg.showDetailBand(e.row);
};

/* ListView 컴포넌트의 oncellclick 이벤트 함수 */
this.lstv_msg_oncellclick = function(obj:nexacro.ListView,e:nexacro.ListViewClickEventInfo)
{
	this.lstv_msg.showDetailBand(e.row);
};

ListView 컴포넌트를 사용자가 터치했을 때 발생하는 ontouchstart, ontouchend, ontouchmove 이벤트 함수를 작성합니다. 이 이벤트 함수는 문자 메시지 삭제 기능에 사용됩니다. 사용자가 터치를 시작할 때 타이머를 동작시키고 터치를 떼거나 터치 후 드래그 동작을 하면 타이머를 종료시킵니다.

/* ListView 컴포넌트 ontouchstart 이벤트 함수 */
this.lstv_msg_ontouchstart = function(obj:nexacro.ListView,e:nexacro.TouchEventInfo)
{
	this.setTimer(numTimerID, 1000);
};

/* ListView 컴포넌트 ontouchend 이벤트 함수 */
this.lstv_msg_ontouchend = function(obj:nexacro.ListView,e:nexacro.TouchEventInfo)
{
	this.killTimer(numTimerID);
};

/* ListView 컴포넌트 ontouchmove 이벤트 함수 */
this.lstv_msg_ontouchmove = function(obj:nexacro.ListView,e:nexacro.TouchEventInfo)
{
	this.killTimer(numTimerID);
};

8

모바일 장치에서 확인하기

Form을 로딩하면 자동으로 모바일 장치에 저장된 문자 메시지를 조회합니다. 문자 메시지를 조회하는 동안에는 "Loading message."라고 표시되며 조회할 문자 메시지가 없으면 "No messages."라고 표시됩니다.

조회가 완료되면 문자 메시지가 화면에 출력됩니다. 각 항목을 터치하면 항목 하단에 문자 메시지 전체가 보여집니다.

문자 메시지 항목을 1초 정도 터치하여 문자 메시지가 삭제되는지 확인합니다. 삭제에 실패하면 오류 메시지 창이 오픈됩니다.

문자메시지 보내기

Sms 오브젝트를 사용해 문자 메시지를 작성하고 보내는 방법에 대해 설명합니다.

예제

다음은 문자 메시지를 작성하고 전송하는 예제입니다. 예제를 실행한 후 전화 번호와 문자 메시지를 입력한 후 Send 버튼을 터치하면 문자를 전송할 수 있습니다. Clear 버튼을 터치하면 작성한 문자 메시지를 삭제합니다.

sample_sms_02_01

예제에서 사용한 핵심 기능

phonenumber 속성

문자 메시지를 전송할 상대의 전화 번호를 설정하는 속성입니다.

message 속성

전송할 문자 메시지 내용을 설정하는 속성입니다.

sendMessage 메소드

문자 메시지를 전송을 위해 모바일 장치의 기본 SMS 앱을 오픈하는 메소드입니다. 메소드 자체 기능으로 전송하지 않고 기본 SMS 앱에 전달해주는 역할을 합니다.

예제 구현 방법

1

화면 구성하기

Sms 오브젝트를 추가합니다. 추가된 오브젝트는 Invisible Object 창에서 확인할 수 있습니다.

전화 번호를 입력할 Edit 컴포넌트와 문자 메시지를 작성할 TextArea 컴포넌트를 추가합니다. 그리고 작성 완료 후 전송할 Send 버튼과 Clear 버튼을 추가한 후 예제의 그림과 같이 적절히 배치합니다.

화면 구성을 위해 사용한 컴포넌트 및 오브젝트는 다음과 같습니다.

컴포넌트/오브젝트

ID

SMS

Sms00

Edit

edt_phonenumber

TextArea

ta_message

Button

btn_send

btn_clear

2

Sms 오브젝트 이벤트 함수 작성하기

Sms 오브젝트의 onerror 이벤트 함수를 다음과 같이 작성합니다. Sms 오브젝트의 메소드 호출에 오류가 발생했을 때 사용자에게 어떤 오류인지 알려줍니다.

/* Sms 오브젝트 onerror 이벤트 함수 */
this.Sms00_onerror = function(obj:nexacro.Sms,e:nexacro.SmsErrorEventInfo)
{
	var strResult = "["+ e.errortype +" "+ e.statuscode +"] "+ e.errormsg;
	strResult += "\n"+ "smsid = "+ e.smsid;
	strResult += "\n"+ "phonenumber = "+ e.phonenumber;
	strResult += "\n"+ "message = "+ e.message;
	
	alert(strResult);		
};

3

Send 버튼 이벤트 함수 작성하기

Send 버튼을 터치하면 전화번호와 문자 메시지가 정상적으로 작성되었는지 확인 후 문자 메시지를 전송합니다.

/* Send 버튼 onclick 이벤트 함수 */
this.btn_send_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
	var strNumber = this.edt_phonenumber.value;
	var strMsg = this.ta_message.value;
	
	if(nexacro._isNull(strNumber) || strNumber == "")
	{
		this.edt_phonenumber.setFocus();
	}
	else if(nexacro._isNull(strMsg) || strMsg == "")
	{
		this.ta_message.setFocus();
	}
	else
	{	
		this.Sms00.set_phonenumber(strNumber);
		this.Sms00.set_message(strMsg);	
		this.Sms00.sendMessage();
	}
};

4

Clear 버튼 이벤트 함수 작성하기

Clear 버튼을 터치하면 작성중이던 문자 메시지가 삭제됩니다.

/* Clear 버튼 onclick 이벤트 함수 */
this.btn_clear_onclick = function(obj:nexacro.Button,e:nexacro.ClickEventInfo)
{
	this.ta_message.deleteText();
};

5

Edit, TextArea 컴포넌트 이벤트 함수 작성하기

/* Edit 컴포넌트 canchange 이벤트 함수 */
this.edt_phonenumber_canchange = function(obj:nexacro.Edit,e:nexacro.ChangeEventInfo)
{
	if(this.edt_phonenumber.value == "")
	{
		this.edt_phonenumber.value = null;
	}
};

/* TextArea 컴포넌트 canchange 이벤트 함수 */
this.ta_message_canchange = function(obj:nexacro.TextArea,e:nexacro.ChangeEventInfo)
{
	if(this.ta_message.value == "")
	{
		this.ta_message.value = null;
	}
};

6

모바일 장치에서 확인하기

전화번호와 문자 메시지를 작성한 후 Send 버튼을 터치하여 모바일 장치의 기본 SMS 앱에 작성한 내용이 반영되어 오픈되는지 확인합니다.

문자 메시지 작성중 Clear 버튼을 터치하면 내용이 모두 삭제됩니다.