프로그래밍/모바일2012. 12. 3. 13:08

본 포스팅은 java 서버 기반으로 apns, gcm을 활용해 모바일 기기로 PUSH 메세지를 전송하는 방법에 대해 설명합니다.

모바일 기기 단에서 처리 코드는 포함하지 않습니다 :)


1. APNS 사용하기

애플의 아이폰 등의 기기에 PUSH 메세지를 전송하기 위해서는 다음과 같은 준비물이 필요합니다.


* javaPNS 라이브러리 : http://code.google.com/p/javapns/

* javaPNS에서 사용하는 Bouncy Castle 라이브러리 : http://www.bouncycastle.org/

* PUSH 인증서/인증서 비밀번호

* 디바이스 UDID

* 모바일앱


javaPNS는 Apple Push Notification Service(APNS)를 사용하기 쉽게 만들어진 오픈소스 라이브러리로 GNU Lesser GPL 라이선스를 따릅니다. 


본 포스팅에서 사용되는 javaPNS 버전은 2.2 입니다. 

JVM 버전은 1.5 이상을 쓰면 되지만 현재 1.7 버전에서는 SSL connection오류가 발생할 수 있음에 주의합니다. 

또한 javaPNS는 BouncyCastle에서 제공하는 암복호화 라이브러리에 의존성이 있습니다. BouncyCastle를 온전히 사용하기 위해서는 JCE Policy 파일 패치가 필요할 수 있습니다.


이상 위 준비과정을 마쳤다면, APNS는 아주 쉽게 사용할 수 있습니다.

기본 코드는 아래와 같습니다.

public boolean send(String certificate, String password, boolean production, String udid, String message, Map<String, String> extra) {
	try {
		PushNotificationPayload payload = PushNotificationPayload.complex();
		payload.addAlert(message);
		payload.addBadge(-1);
		payload.addSound("default");
			
		if( extra != null ) {
			Iterator<String> keys = extra.keySet().iterator();
			while( keys.hasNext() ) {
				String key = keys.next();
				String value = extra.get(key);
				
				payload.addCustomDictionary(key, value);
			}
		}

		PushedNotifications notifications = Push.payload(payload, 
				certificate, password, production, udid);
			
		return (notifications != null && notifications.size() > 0 && notifications.get(0).isSuccessful());
			
	} catch (Exception e) {
		logger.error(e, e);
	} 
		
	return false;
}

certificate는 인증서 경로, password는 인증서 비밀번호, udid는 디바이스 고유키 입니다.

extra는 전송 메세지 외에 커스텀 딕셔너리에 넣을 데이터를 처리합니다.


APNS 전송이 수 만건 단위로 많아질 경우 위 코드를 그대로 사용하는 것은 매우 비효율적입니다.  


APNS의 경우 한번 커넥션이 맺어질 경우 해당 커넥션을 통해 다수의 PUSH 데이터를 한번에 전송하는 방식을 사용해야 합니다. 필요에 따라 멀티쓰레드 방식을 통해 PUSH 데이터를 나누어 전송할 수도 있습니다. 


Message Broadcasting, payloadPerDevice, multithread, connection pool과 같은 고급 주제들 또한 javaPNS 문서와 소스에서 힌트를 얻을 수 있으니 반드시 참고하기를 권장합니다.



2. Google Cloud Messaging for Android(GCM) 사용하기

GCM을 사용하기 위해서는 다음과 같은 준비물이 필요합니다.


* Google API Console을 통해 프로젝트 생성

* GCM 활성화

* API Key 및 프로젝트 ID 얻기

* 디바이스 토큰

* 모바일 앱

* gmc-server 라이브러리

* json-simple 라이브러리


먼저 https://code.google.com/apis/console/ 에 처음 방문하면 다음 그림과 같이 프로젝트를 개설하기 위한 과정이 나타납니다.


프로젝트를 생성한후 좌측 메뉴의 Services에서 "Google Cloud Messaging for Android"를 활성화 해줍니다.



그 다음 좌측 메뉴의 API Access에서 아래 그림과 같이 Create New Server Key를 생성합니다.



서버 키를 생성하면서 접근 가능한 서버의 IP를 입력하는 과정이 있습니다. 

정상적으로 서버 키가 생성됬다면 아래와 같이 API키와 허용 IP목록을 확인할 수 있씁니다.



프로젝트 ID는 다음 그림과 같이 URL의 project: 다음의 일련번호를 통해 확인할 수 있습니다.



gcm-server 라이브러리는 안드로이드 SDK의 extras > google > gcm > gcm-server > dist 에서 찾을 수 있씁니다.

만약 gcm이 없다면 안드로이드 SDK 매니저를 통해 설치해야합니다.


gcm-server는 json-simple 라이브러리에 의존성이 있습니다. 

json-simple은 http://code.google.com/p/json-simple/ 에서 다운로드 받을 수 있습니다.


기본 코드는 다음과 같습니다.

public boolean send(String apiKey, String token, String message, Map<String, String> extra) {
	Sender sender = new Sender(apiKey);
		
	try { message = URLEncoder.encode(message, "UTF-8"); } 
	catch (UnsupportedEncodingException ignore) {}
		
	Message.Builder messageBuilder = new Message.Builder();	
	messageBuilder.delayWhileIdle(false);
	messageBuilder.timeToLive(1800); // 30min
	messageBuilder.addData("msg", message);
		
	if( extra != null ) {
		Iterator<String> keys = extra.keySet().iterator();
		while( keys.hasNext() ) {
			String key = keys.next();
			String value = extra.get(key);
				
			messageBuilder.addData(key, value);
		}
	}
		
	try {
		Result result = sender.send(messageBuilder.build(), token, 5);
		String messageId = result.getMessageId();
			
		return (messageId!=null);
	} catch(Exception e) {
		logger.error(e, e);
	}			
		
	return false;
}

APNS와 마찬가지로 많은 양의 PUSH 메세지를 위 코드를 통해 처리하는 것은 매우 비효율 적입니다.


C2DM에서 GCM으로 넘어오며 얻을 수 있는 큰 장점중의 하나는 Message Broadcasting이 가능해졌다는 것입니다.

아직 경험적/통계적으로 GCM 에서의 적절한 connection과 multithread 갯수는 파악하지 못했지만, Message Broadcasting 기술과 delayWhileIdle, timeToLive의 설정값을 통해 PUSH 메세지 도달율을 C2DM보다 높힐 수 있을것이라 기대합니다. 


Posted by devop

댓글을 달아 주세요

프로그래밍/모바일2012. 3. 19. 11:23
요즘 널리 쓰이는 구글 안드로이드 스마트폰.
다들 잘 알고 있다시피 안드로이드 앱 개발은 자바(JAVA)로 합니다.

JAVA로 개발된 프로그램은 C와 같은 언어와 달리 바이트 형태의 class파일을 생성하는데 'Write Once, Run Anywhere"라는 Java의 패러다임에서 알수 있듯이, JavaVM이 존재하는 모든 시스템에서 실행될수 있는 시스템 독립적인 코드입니다.
따라서, 바이트 코드와 같은 경우는 바이너리 코드와 달리 손쉽게 역컴파일이 가능합니다.

* 참고 : http://lyb1495.tistory.com/entry/Java-Decompiler-jad

안드로이드 앱 역시 여기서 예외일 수 없는데, apk 파일만 가지고 있으면 손쉽게 디컴파일을 통해 소스코드를 확인할 수 있습니다.

준비물

1. dex2Jar
apk파일의 압축을 해제하면 classes.dex 라는 파일을 발견할 수 있는데, 이 파일은 안드로이드 가상 머신인 dalvik이 인식할 수 있도록 class파일을 바이트 코드로 변환 된 파일입니다.

  
dex2jar는 dex파일로부터 class 파일을 추출하는 도구 입니다.
dex2jar로부터 추출된 class파일은 JAVA 디컴파일러를 통해 소스코드로 복원해 낼 수 있습니다.

다운로드 : http://code.google.com/p/dex2jar/downloads/list

2. jad
class 파일을 java파일로 복원하는 툴

다운로드 : http://www.varaneckas.com/jad


준비물이 갖추어졌으니 본격적으로 apk 파일을 디컴파일 해보겠습니다.

먼저 아래 그림과 같이 apk파일을 압집을 통해 압축을 해제합니다. 


 apk파일의 압축을 해제하면 classes.dex파일을 확인할 수 있는데 이 파일을 dex2jar를 통해 다시 한번 압축을 해제하게 됩니다. 사용법은 다음과 같이 간단합니다.

 (dex2jar가 설치된 폴더에서) dex2jar 대상dex파일 


dex2jar를 통해 dex파일 압축을 해제하면 다음 그림과 같이 classes_dex2jar.jar 파일을 확인할 수 있습니다.

 
이 파일은 class파일을 압축하고 있는 파일로 압집등을 통해 간단히 압축을 해제하면 class파일들을 확인할 수 있습니다.


이제 jad를 통해 class파일들을 java파일로 복원합니다.
아래 명령은 -dsrc 로 지정한 디렉토리(C:\android\decompiler\parceltrace-2\classes_dex2jar)의 모든 class파일을 디컴파일하는 명령입니다.


위 명령을 수행한뒤 jad가 설치된 폴더를 보면 다음 그림과 같이 java파일들이 생성된 것을 확인할 수 있습니다.
(jad의 -d 옵션을 통해 소스가 생성되는 디렉토리 위치를 변경할 수 있습니다. 자세한 사용법은 다운로드 받은 jad 에 첨부된 readme.txt 파일을 참조)

  

Posted by devop

댓글을 달아 주세요

  1. 문의

    디컴파일 하나만 해주시면 안될까요 ㅠㅠ?

    2012.05.25 00:54 [ ADDR : EDIT/ DEL : REPLY ]

프로그래밍/모바일2010. 3. 30. 10:27
출처: http://blog.sopt.org/category/동아리이야기/개발파트


AVD(Android Virtual Device)를 하나 만듭니다. Virtual Devices탭에서 New버튼을 클릭하세요.


아래와 같은 창을 볼 수 있는데 Name에 자신이 원하는 아무 이름이나 입력하고 Target에는 Android 2.1이나 Google APIs 둘 중에 하나를 선택합니다. (Google APIs는 지도를 이용한 어플리케이션을 개발할때 필수) 

Create AVD 클릭~~!!!!


아래와 같이 하나의 AVD(Android Vritual Device)가 생성된 것을 볼 수 있습니다. 
Start버튼을 클릭해 에뮬레이터를 구동시킵니다.


에뮬레이터가 구동되면 아래와 같은 부팅화면을 볼 수 있습니다.
아직 에뮬레이터가 최적화가 많이 안 되어있는지 많이 느리네요 ㅠ.ㅠ


아래와 같은 초기화면이 나올때까지 기다리다가 초기화면이 나오면 아래에 탭을 클릭합니다.



다음과 같은 아이콘들을 볼 수 있는데 여기서 Settings를 클릭합니다.


다음과 같은 리스트가 나오는데 리스트를 약간 아래로 내려서 Language&keyboard를 클릭합니다.



다음과 같은 화면이 나오는데 여기서 Select locale을 클릭한 후 나오는 목록중에서 한국어를 선택합니다.



다음과 같이 메뉴가 한글로 변경된 것을 볼 수 있습니다. 
여기까지하면 안드로이드 에뮬레이터의 언어가 한글로 변경됩니다.


다음으로는 현재 에뮬레이터에 있는 키보드로는 한글을 입력할 수 없으니 한글키보드를 추가로 설치하셔야 합니다.

첨부된 HangulKeyboard.apk 파일을 다운로드 받고 커맨드창을 실행하여 다운로드받은 폴더에서 "adb install HangulKeyboard.apk"라고 입력한 후 실행하면 에뮬레이터안에 한글키보드가 설치됩니다.

★ 주의 : 이 명령을 수행할때는 에뮬레이터가 실행되어 있는 상태에서 수행해야 한글키보드가 설치됩니다.


위와 같은 명령을 수행하면 아래와 같이 한글 키보드가 설치된 것을 확인할 수 있습니다.
여기까지하면 우리가 사용하는 한글환경으로 에뮬레이터 설정이 끝나게 됩니다.


Posted by devop

댓글을 달아 주세요

프로그래밍/모바일2010. 3. 29. 11:26



1. 아래 주소에 접속하여  android-sdk_r05-windows.zip 파일을 다운로드합니다.



2. 다운받은 sdk파일을 원하는 폴더에 압축해제합니다.


3. 아래 링크를 통해 Eclipse를 다운로드합니다.


4. 다운받은 Eclipse를 원하는 폴더에 압축해제하고 실행합니다.


5. Help 메뉴에서 Install New Software...을 클릭합니다.



6. Work with 입력필드에 https://dl-ssl.google.com/android/eclipse라고 입력한 후 아래 체크박스에 체크하고 Next를 클릭하여 ADT 설치를 완료합니다.



7. 설치를 완료하면 이클립스를 재시작하라는 창이 나오게 됩니다. Yes를 클릭하여 이클립스를 재시작합니다.



8. 재시작하고 나면 위의 툴바에 4가지 아이콘이 추가된 것을 볼 수 있습니다. 



9. 다음으로 Android SDK 설치된 폴더를 설정합니다. Windows메뉴에서 Preferences를 클릭합니다. 


Android를 클릭한 후 SDK Location의 Browse버튼을 클릭하여 Android SDK가 설치된 폴더를 지정하고 OK를 클릭합니다.



10. 마지막으로 개발 관련 패키지를 설치합니다. 위의 툴바 아이콘 중에서 4번째 아이콘을 클릭합니다.


그러면 아래와 같은 창을 볼 수 있는데 Available Packages를 클릭한 후에 (Android SDK Tools, revision5),(Documentation for Android SDK, API 7, revision 1), (SDK Platform Android 2.1, API 7, revision 1), (Samples for SDK API 7, revision 1), (Google APIs by Google Inc., Android API 7, revision 1), (Usb Driver package, revision 3)를 체크하고 Install Selected를 클릭합니다.


아래와 같은 창이 나오면 Accept All을 클릭하고 Install을 클릭합니다.


※ 다운로드와 설치시간이 조금 걸리므로 약간 기다려야 합니다~~~~

설치가 완료되면 Installed Packages를 클릭하여 설치완료된 패키지를 확인합니다.


※ 참고 : SDK폴더안에 tools폴더를 환경변수 path에 등록합니다!!!! 아래 화면은 Windows 7 기준입니다!!!!

내컴퓨터에서 오른쪽 마우스버튼을 클릭하여 속성을 선택합니다.


고급 시스템 설정을 클릭합니다.


환경변수를 클릭!!!


시스템 변수 탭에서 Path라는 변수를 선택하고 편집버튼을 클릭합니다~~~


변수 값의 끝에 아래와 같이 SDK폴더의 tools폴더를 입력합니다.(제 경우에는 C:\android-sdk-windows가 SDK설치 폴더이므로 C:\android-sdk-windows\tools로 입력하였습니다.) 
폴더입력할때 앞에 세미콜론 입력해주세요~


입력후에 확인을 누르게되면 환경변수 등록이 완료됩니다. 이렇게 하면 어느폴더에서나 tools폴더에 있는 실행파일들을 실행할 수 있어요!!!!!!~~
Posted by devop

댓글을 달아 주세요

프로그래밍/모바일2010. 2. 8. 16:24
 안드로이드 어플리케이션은 자신의 프로세스 수명을 직접 제어하지 않으며, 안드로이드 런타임이 각 어플리케이션의 프로세스와 그 안에 있는 각 activity를 관리한다.
 런타임이 프로세스와 activity의 종료와 관리를 다루는 동안, activity의 상태는 자신의 부모 어플리케이션 프로세스의 우선순위를 결정하는데 사용된다. 어플리케이션 우선순위는 런타임이 어플리케이션과 그 안에 실행중인 activity를 종료시킬 가능성에 영향을 미치게된다.
 
1. activity stack
 각 activity의 상태는 현재 실행 중인 모든 activity의 stack구조에서 activity가 차지하는 위치에 의해 결정된다. 새로운 activity가 시작되면 현재 foreground화면이 stack의 맨 꼭대기로 옮겨진다. 사용자가 뒤로 가기 버튼을 사용해 뒤쪽을 탐색하거나 foreground activity가 종료될 경우에는 이 stack의 최상위에 있는 activity가 활성상태가 된다.


 어플리케이션의 우선순위는 어플리케이션이 가진 activity가운데 가장 높은 우선순위를 가진 것에 의해 영향을 받는다. 안드로이드 런타임이 자원 해제를 위해 어떤 어플리케이션을 종료시켜야 하는지 결정할 때, 어플리케이션의 우선순위를 그들이 가진 activity에 기반을 두고 결정하기 위해 위 stack이 사용된다.


2. activity 생명주기
activity가 생성되고 종료되는 과정 동안 activity는 4가지의 상태를 전이한다.

활성(Active)
activity가 stack의 최상위에 있을 경우 이 activity는 현재 화면에 보이고 사용자 입력을 받는다. 안드로이드는 무슨 일이 있어도 활성 상태에 있는 activity가 살아있도록 노력하며, 이 activity가 필요로 하는 리소스를 확보하기 위해 필요에 따라 stack의 아래쪽에 있는 activity들을 종료시킬 수 있다. 다른 activity가 활성화되면 기존의 활성 activity는 일시 중지(Pause)된다.

일지 중지(Pause)
경우에 따라 activity는 화면에는 보이지만 포커스를 지니지 않을 수 있다. 이 상태는 투명한 activity나 화면 전체를 사용하지 않는 activity가 그 앞에 활성화되어 있는 경우이다. 일시 중지 상태가 되는 경우 activity는 활성 상태인것처럼 다뤄지지만 사용자 입력을 받지 않는다. 극단적인 경우, 안드로이드는 활성 activity를 위한 리소스 확보를 위해 일시 중지 상태의 activity를 종료시킬 수 있을것이다. 만약 activity가 완전이 가려지게 되면 그 activity는 중지상태가 된다.

중지(Stop)
activity는 화면에 보이지 않는다. 이 activity는 모든 상태 및 멤버 정보를 메모리에 남기지만, 만약 시스템이 활성 activity를 위해 메모리를 요청할 경우 리소스 확보를 위한 정리 후보 1순위가 된다. activity가 중지될 때는 데이터와 현재 UI상태를 저장하는 것이 중요하다. activity가 화면 밖으로 나가거나 닫히고 나면 그 activity는 비활성 상태가 된다.

비활성(Inactive)
activity는 종료되고 난 이후와 시작되기 이전 비활성 상태에 머문다. 비활성 activity는 activity stack에서 제거되며, 화면에 다시 나타내기 위해서는 재시작되어야 한다.


 activity가 시작되고 실행중일 때 다른 activity가 시작되면 그때까지 실행중이던 activity는 pause 상태로 전이된다. pause 상태로 존재하다 다른 어플리케이션에서 메모리를 요구할 경우 pause상태의 activity는 종료될 수 있다.
 만약 pause상태에 있던 activity를 사용자가 선택해서 다시 foreground로 되돌아가면 resume상태가 된다. 또 pause 상태에 있던 activity가 더이상 보이지 않게 되면 stop상태로 전이된다.
 stop상태에 있던 activity가 다시 foreground로 되면 restart에 의해 start상태로 돌아간다. stop상태에 있는 activity 역시 다른 어플리케이션이 메모리를 요구할 경우 종료되며 destroy로 전이될수도 있다.

다음은 activity에서 사용할 수 있는 각 상태변화에 대한 핸들러 메소드이다.


 activity의 상태전이는 비결정적이며 전적으로 안드로이드 런타임에 의해 다루어 진다. 안드로이드는 비활성 activity를 가진 어플리케이션을 종료하는 것으로 시작해, 이어서 중지된 것들, 그리고 극단적인 경우 일시 중지된 것들을 제거할 것이다.
 심리스한 사용자 인터페이스를 보장하기 위해서는 이들 상태 간의 전이가 사용자의 눈에 보여서는 안된다. 일시 중지나 중지 혹은 종료된 상태에서 다시 활성 상태로 이동하는 activity 간에는 차이점이 없어야 하므로, activity가 일시 중지 되거나 중지될 때는 모든 UI상태 변화를 저장하고 모든 데이터를 지속시키는 것이 중요하다. 만약 중지되거나 비활성된 activity가 다시 활성화되고나면 저장된 이들 값을 이용해 activity를 복구해야 하기 때문이다.
Posted by devop

댓글을 달아 주세요

프로그래밍/모바일2010. 2. 8. 11:44
 안드로이드 어플리케이션은 자신의 생명 주기를 제어할 수 없다. 대신, 어플리케이션 컴포넌트는 반드시 어플리케이션의 상태변화에 귀기울여 그에 따라 적절히 반응해야 하며, 불시 종료에 대비하도록 신경 써야 한다.
 각 안드로이드 어플리케이션은 기본적으로 별도의 Dalvik 인스턴스를 실행하고 있는 자기 자신만의 프로세스 내에서 실행된다. 각 어플리케이션의 메모리와 프로세스 관리는 런타임에 의해 배타적으로 처리된다.
 안드로이드는 자신의 리소스를 공격적으로 관리하며, 장치가 좋은 반응성을 가진 상태로 남아있도록 보장하기 위한 것이라면 무엇이든 한다. 이는 우선순위가 높은 어플리케이션을 위해 리소스 확보가 필요한 경우, 우선순위가 낮은 프로세스가 경고없이 종료될 수 있음을 뜻한다.

1. 활성 프로세스(foreground activity)
 활성 프로세스는 사용자가 현재 상호작용하고 있는 컴포넌트를 가진 어플리케이션이다. 안드로이드가 리소스 회수를 통해 좋은 반응성을 가진 채로 유지하려는 프로세스가 바로 이 프로세스다. 이들 프로세스는 일반적으로 매우 적은 수가 존재하며, 최후의 수단으로서만 종료될 것이다.

  • 활성상태에 있는 Activity. 즉, 이들은 foreground 에 있으면서 사용자 이벤트에 반응한다.
  • 현재 onReceive 이벤트 핸들러를 실행 중인 Activity나 서비스 또는 broadcast 수신자.
  • onStart나 onCreate 또는 onDestroy 이벤트 핸들러를 실행 중인 서비스

2. 화면에 보이는 프로세스(visible activity)
 화면에 보이지만 비활성 프로세스는 화면에 보이는 Activity를 가지고 있는 것들이다. 화면에 보이는 Activity는 눈에 보이긴 하지만 foreground에 있지 않거나 사용자 이벤트에 반응하지 않는다. 이는 Activity가 부분적으로 가려지는 경우 발생한다. 이러한 프로세스는 일반적으로 매우 적은 수가 존재하며, 활성 프로세스가 계속 진행되도록 허용하기 위한 극한 상황에서만 종료될 것이다.

3. 시작된 서비스 프로세스
 서비스는 화면에  보이는 인터페이스 없이 계속실행되어야 하는 처리를 지원한다. 서비스는 사용자와 직접 상호작용하지 않기 때문에, 화면에 보이는 Activity에 비해 낮은 우선순위를 부여 받는다. 하지만 시작된 서비스 프로세스는 foreground 프로세스로 간주되며, 활성 프로세스나 화면에 보이는 프로세스를 위해 리소스가 필요한 경우가 아니라면 종료되지 않을 것이다.

4. Background 프로세스
 화면에 보이지 않는 Activity를 가지고 있으며 시작된 서비스를 가지지 않는 프로세스이다. 안드로이드가 foreground 프로세스를 위한 리소를 얻기 위하여 last-seen-first-killed pattern을 이용해 종료시킨다. 일반적으로 많은 수가 존재한다.
 만약 background 프로세스를 제거한 후 사용자가 그 activity로 다시 돌아가길 원한다면 해당 화면을 다시 보여주어야 하는데, 이때는 activity의 onCreate(Bundle saveInstanceState) 메소드의 saveInstanceState 파라미터를 이용한다.
 background activity를 제거할때 onSaveInstanceState(Bundle saveInstanceState)메소드가 호출되는데, 이 때 중요한 데이터를 saveInstanceState에 저장할 수 있다. saveInstanceState 파라미터에 저장한 내용은 onCreate() 매소드의 파라미터로 전달된다. 따라서 이 파라미터를 이용하면 background activity가 제거되기 전의 상태로 다시 시작할 수 있다.

5. 빈(Empty) 프로세스
안드로이드는 전체적인 시스템 성능 향상을 위해, 어플리케이션이 수명을 다한 뒤에도 종종 이들을 메모리에 존속시킨다. 안드로이드는 이들이 다시 띄어질때 어플리케이션 구동 시간을 향상 시키기  위하여 이 Cache를 이용한다. 이들 프로세스는 메모리가 부족해지면 시스템에 의해 즉시 제거된다.

Posted by devop

댓글을 달아 주세요

프로그래밍/모바일2009. 9. 11. 14:45
얼마전 Snow Leopard가 출시되며 Xcode도 3.2로 업데이트 되었습니다.


오랫만에 iPhone 개발 연습을 위해 Xcode를 실행하니 iPhone 개발 메뉴가 Xcode에서 사라져있어서 깜짝 놀랐습니다.
애플 개발자 센터에 들어가 iPhone SDK를 확인해보니 Xcode 3.2용 SDK가 새로 추가되 있는것 확인할 수 있었습니다.


(빨간 네모 상자 안에 Xcode3.2용 iPhone SDK가 있습니다.)

Xcode3.2로 업데이트 되며 코드의 정적 분석 기능이 추가되었는데, app를 수행하지 않은 상태에서 코드 분석을 통해 문제점을 보고해주는 기능입니다. 한 가지 주의해야 할점은 Xcode3.1, iPhone SDK가 깔린 상태 Xcode3.2를 깔면 iPhone OS 2.x을 사용할 수 잇지만, Xcode3.2를 clean install 한다면 iPhone OS 2.x은 사용할 수 없습니다.
Posted by devop

댓글을 달아 주세요

프로그래밍/모바일2009. 8. 21. 16:59
Xcode의 기본 폰트가 작아서 코딩하는데 어려움이 있습니다.
나눔고딕코딩체로 폰트를 변경하는 방법은 다음과 같습니다.


Xcode>Preferences 를 선택합니다.


Fonts & Colors 를 선택하고 Color Theme에서 default theme를 Duplicate 하고 위 그림과 같이 폰트를 나눔고딕코딩 크기 14로 변경합니다.


 Xcode의 폰트가 변경되는것을 확인합니다.

Posted by devop

댓글을 달아 주세요

  1. 기린

    잘보고갑니다~

    2010.08.25 18:24 [ ADDR : EDIT/ DEL : REPLY ]

프로그래밍/모바일2009. 8. 11. 15:29
아이폰 어플리케이션 개발을 위해선 그에 맞는 SDK설치가 요구된다.

참고로 여타 모바일 기기의 SDK와 비교해 본다면 다음과 같다.


아이폰 어플리케이션을 위해 준비해야될 소프트웨어는 Xcode와 iPhone SDK가 있다. ADC 맴버쉽 프로그램에 가입 후에 Xcode와 iPhone SDK를 다운로드 받아 설치한다. 맴버쉽 프로그램 등록, 개발 툴 모두 무료이다.


Xcode와 iPhone SDK는 모두 무료로 제공된다. 하지만 다운로드 받기 위해서는 ADC(Apple Developer Connection) 멤버쉽 프로그램에 가입하여야 한다. (Xcode는 MAC OS 설치CD에 포함되어 있지만, 최신버젼을 얻기 위해서는 다운로드 받아서 설치하시는 것을 권장한다.)  ADC는 애플이 제공하는 개발에 관련된 각종 툴, 문서, 샘플코드등을 제공하는 서비스이다. 현재는 아래와 같이 아이폰과 맥, 두개의 색션으로 분리되어 있다.


ADC 회원은 지원범위에 따른 여러 유료회원도 있지만, 무료인 온라인 회원으로 가입하여도 개발툴과 관련 문서, 샘플코드를 사용할 수 있다. ADC회원가입과 Xcode, iPhone SDK 설치에 관한 자세한 여기[http://www.cocoadev.co.kr/159]를 참고한다.

Xcode는 애플에서 제공하는 OS X에서 맥/아이폰 어플리케이션 개발을 위한 대표적인 개발툴(IDE)이다. GCC를 컴파일러로 사용하는 Xcode는 Objective-C, C/C++, Java, Ruby, Python등의 언어를 지원하며, GUI 어플리케이션뿐만 각종 커멘드라인 유틸리티, 프레임워크, 라이브러리, 드라이버등 맥과 아이폰에서 사용하는 다양한 실행 바이너리를 만들 수 있다.


Xcode에는 인터페이스 빌더와 디바이스 없이도 어플리케이션을 테스트해볼수 있는 아이폰 시뮬레이터가 포함되어 있다.
인터페이스 빌더는 맥과 아이폰의 GUI 디자인을 위한 툴로 OS X 어플리케이션에서 사용하는 nib(또는 xib) 파일을 생성해준다.



Posted by devop

댓글을 달아 주세요

프로그래밍/모바일2009. 7. 10. 14:27
지난 7월 31일에 iPhons의 Push Notification Service(PNS) 의 API가 일부 개발자에게 공개되었다. PNS는 iPhone 3G 발표로 전세계가 주목했던 지난 WWDC 2008 키노트에서  애플의 Senior VP인 Forstall이 소개한 새로운 서비스이다.  키노트를 본 사람 중에는 PNS를 눈여겨 본 사람들도 많겠지만, 일반 언론에서는 거의 다뤄지지 않았기 때문인지 알지 못하는 사람들도 많다.
 

1. PNS는 무엇인가?
간단히 말해서 PNS는 iPhone의 어플리케이션에게 Notification을 Push 방식으로 보낼 수 있는 서비스이다.  이 서비스는 애플이 운영하는 전용 서버를 통해 제공되며, Push 기능이 필요한 어플리케이션들의  3'rd party 서버들은  PNS가 제공하는 API를 통해서  이 서비스를 이용할 수 있다.
 
 
 

2. PNS는 어떤 경우에 사용하나?
PNS를 사용할 수 있는 대표적인 서비스 중에 하나는 인스턴트 메시징이다. 보통 IM 어플리케이션은 사용자가 대화를 하지 않는 상태에서도 계속해서 (백그라운드로) 수행되면서 네트워크 연결을 열고 있어야 한다. 누가 언제 메시지를 보내올지 모르기 때문이다.
 
그런데 애플의 PNS를 사용하면 그럴 필요가 없다. iPhone 은 PNS로 부터 메시지를 수신하기 위해 하나의 공통 IP연결을 유지하고 있다가, PNS로부터 메시지를 받으면 그 메시지를 받아야 할 해당 어플리케이션을 깨워서 전달해준다.
 
사용자 삽입 이미지 사용자 삽입 이미지

(위 그림은 어플리케이션이 새로 수신한 메시지가 하나 있다는 것을 아이콘 상에 표시하고 있는 모습.)
 

3. PNS는 반드시 사용해야 하나?
물론 아니다. 아니 사실은 그렇다.  더 자세히 말하면 일반적인 개발환경에서는 아니고, iPhone 개발환경에서는 그렇다.
 
Windows 나 Linux와 같은 보통의 개발환경에서는  PNS와 같은 서비스가 없더라도 각 어플리케이션이 백그라운드로 수행되면서 자신의 서버로부터 데이터를 대기하도록 만들면 된다. 하지만 iPhone에서는 어플리케이션을 백그라운드로 수행되도록 개발할 수 없게 되어있다. 즉, 모든 외부 개발 어플리케이션은 User-Mode로 동작한다.(http://gizmodo.com/365327/iphone-sdk-limitation-only-one-user+made-app-running-concurrently-no-background-processes) 그래서 IM같은 어플리케이션을 만들려면 반드시 PNS를 사용해야 한다.
 

4. 애플은 왜 이런 방식을 선택했나?
먼저 애플의 주장은 이렇다.
iPhone과 같은 모바일 단말에서 소프트웨어를 개발할 때 고려해야할 아주 중요한 두 가지 요소는 바로 성능과 배터리 소모이다. 그런데 AppStore를 통해서 누구가 개발해서 배포할 수 있는 환경에서 IM이나 이메일 클라이언트와 같은 종류의 어플리케이션들이 기존과 같은 방식으로 동작한다면(즉, 제각기 자신의 서버와 connection을 유지하면서 백그라운드로 수행된다면) CPU 점유와 배터리 소모가 불가피하게 많아질 것이다. 이것은 매우 나쁜 상황이다. 따라서 애플은 PNS 서비스를 제공하여 사용자들이 쉽게 서버의 Push기능을 개발할 수 있게 하면서도 단말의 CPU 리소스와 배터리를 최대한 절약할 수 있도록 해준다.
 
물론 이 주장은 틀린 얘기가 아니며 분명히 PNS는 좋은 점이 많은 방식이다. 하지만 모든 일에는 장단점이 있기 마련인 법. PNS에 반대하는 사람들은 보통 다음의 두 가지 점을 지적한다.
 
첫 번째는 Push기능을 사용하는 모든 응용 서비스들이 반드시 애플의 PNS서비스를 사용해야만 한다는 점이다. 이것은 어떤 의미에서 서비스들이 애플의 통제하에 놓이게 되는 것을 의미한다.  
 
두 번째는 장애 가능성이다. 모든 Push 또는 Notification 메시지는 애플의 PNS를 거쳐야만 하므로 만약 애플의 PNS서비스에 장애가 발생하면 해당하는 모든 응용 서비스들이 영향을 받게된다.
 
(반대하는 사람들의 생생한 의견들이 댓글로 달려있는 PNS 관련 게시물: http://www.iphonehacks.com/2008/08/push-notificatn.html)
 
끝으로 내가 생각하는 또 하나의 문제점은 사용료이다.
현재는 PNS가 무료인 것으로 알려져 있다 하지만  정식 서비스 오픈이 9월로 예정되어 있기 때문에 구체적인 서비스 조건은 아직 알 수 없고, 원래부터 뭐든지 제대로 만들고 값도 제대로 받는 애플의 특성상  어떤 식으로든 돈 벌 수 있는 방식으로 서비스를 운용할 것으로 예상된다. 
 
이 경우 어플리케이션들은 어떤 형태로든 이용료를 지불해야 한다.(또는 애플이 개별 애플리케이션에게 직접 이용료를 받지않고 뭔가 광고와 연계하여 수익을 창출할 지도 모르겠다.)  이 것은 오픈소스나 무료 어플리케이션 만들려고 할 때 커다란 장애 요소가 될 수 있다.
 

5. PNS는 새로운 시대의 SMS?
나는 키노트에서 PNS 얘기를 듣자마자 기존 이동전화 서비스의 SMS를 떠올렸다. 오늘날 이동전화 서비스에 있어 SMS는  단순히 사용자간에 짧은 메시지를 교환하는 원래의 목적 외에도 많은 중요한 역할들을 하고 있다.

이동전화에서 물건 구매를 위한 인증에 사용되며,  어떤 서비스나 웹 사이트에 가입기 위한 인증에도 사용된다. 그리고 PNS처럼 특정 어플리케이션으로 어떤 정보를 push할 때도 SMS를 사용한다. 그리고  마지막으로 매우 규모가 큰  광고 채널로 사용되고 있다.
 
SMS의 이러한 다양한 활용성 때문에 이동통신 사업자에게 있어 SMS는 수익적으로 매우 중요한 존재인 것은 물론이고 외부의 여러 응용 서비스들에 대한 가입과 과금, 광고 등을 제어할 수 있게 해주는 존재이기도 하다.
 
"애플은 어쩌면 PNS로 SMS와 비슷한 그 무엇을 가지려고 하는 것이 아닐까?"라는 나의 경계는 너무 지나친 것일까?
 
나는 맥북프로와 아이팟 셔플을 사용하고 있는 사용자로서 애플의 제품과 서비스를 매우 좋아한다. 그 기술력과 디자인은 정말 최고 수준이다. 하지만 MP3, 노트북에 이어 이동전화기, 그리고 온라인 콘텐츠와 서비스에까지 매우 빠른 속도로 세력을 넓히고 있는 애플이 조금씩 두려워지는 것도 사실이다.


Posted by devop
TAG iPhone, PNS

댓글을 달아 주세요