본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] GCM ( Google Cloud Messaging Service ) 에 대해 알아본다.

by 돼지왕 왕돼지 2012. 7. 4.
반응형

http://developer.android.com/guide/google/gcm/gs.html

GCM 사용을 원리부터 이해해서 하려면, 많은 작업이 필요합니다. GCMRegistrar 과 Sender class 들이 각각 client 와 server 에서 사용하기 좋게 기능들을 wrapping 해놓은 녀석입니다. 적당히 low level 에서 직접 다 control 하고 싶다면, 다음 글을 참조하시면 되겠습니다. GCM 개발 시작을 위한 준비동작은 동일하며, 구현 코드부만 다르다고 보시면 되겠습니다. ( 사실 전문적으로 하려면 아래 글을 먼저 읽으셔야 합니다. )


 


GCM 개발 시작을 위한 준비동작

1. Google API project 생성

https://code.google.com/apis/console
 



2. GCM service enable.
 

 
 





3. Server용 API key 얻기 





4. Helper library 설치.
 

 




클라이언트 사이드 앱 개발

1. library 연결
- ../android-sdks/extras/google/gcm-client/dist 에 있는 gcm.jar 를 project 의 /libs 폴더에 복사
- gcm.jar 파일을 build path 에 추가


2. Manifest 수정
- Android 2.2 ( API Level 8 ) 이상부터 지원되기 때문에 아래 문구 추가.

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="xx"/>

 
- permission 추가 ( GCM Message 를 이 앱이 받기 위해서.. )

<permission android:name="my_app_package.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="my_app_package.permission.C2D_MESSAGE" /> 
참고로, 이 permission 은 Android 4.1 Jelly Bean ( API Level 16 ) 이상부터는 필요 없다.

- 메세지를 받기 위한 추가 permission 추가

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />


 - broadcast receiver 등록 ( GCM message 가 도착하면 이 broadcast 를 부른다. )

<receiver android:name="com.google.android.gcm.GCMBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND" >
  <intent-filter>
    <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    <action android:name="com.google.android.c2dm.intent.REGISTRATION" />
    <category android:name="my_app_package" />
  </intent-filter>
</receiver>

 
- IntentService 등록

<service android:name=".GCMIntentService" />

 이 service 는 GCM library 에 잇는 GCMBroadcastReceiver 에 의해 호출된다.


3. my_app_package.GCMIntentService class 구현하기.

- onRegistered(Context context, String regId)
- onUnregistered(Context context, String regId)
- onMessage(Context context, Intent intent)
- onError(Context context, String errorId)
- onRecoverableError(Context context, String errorId)

4. Main Activity 구현하기.

 - onCreate() 에 다음의 내용이 들어가야 한다.

GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if (regId.equals("")) {
  GCMRegistrar.register(this, SENDER_ID);
} else {
  Log.v(TAG, "Already registered");
}
- checkDevice() 는 단말이 GCM 을 지원하는지를 알려준다.( 미지원시 exception )
- checkManifest() 는 manifest 에 permission 등의 설정 및 component 등록이 제대로 되어있는지를 확인한다. ( 개발시에만 필요하다. )
- SENDER_ID 는 google api project id 가 들어간다. 해당 google api project 가 보내는 message 를 수신하겠다는 의도이다.






서버 사이드 앱 개발

1. gcm-server/dist/gcm-server.jar 를 project 의 libs 폴더에 복사하고, build path 에 추가
 
2. GCM으로부터 받은 registration ID 를 전달받는 servlet 작성. registration ID 와 device 를 link 시켜야 한다.
 
3. registration ID 를 unregister 할 수 있는 servlet 생성
 
4. server 가 메세지를 보낼 때에는 com.google.android.gcm.server.Sender class 를 통해서 한다.
 

Sender sender = new Sender(myApiKey);
Message message = new Message.Builder(regId).build();
Result result = sender.send(message, 5);

Result를 통해서 결과를 얻을 수 있다.
if (result.getMessageId() != null) {
 String canonicalRegId = result.getCanonicalRegistrationId();
 if (canonicalRegId != null) {
   // same device has more than on registration ID: update database
 }
} else {
 String error = result.getErrorCodeName();
 if (error.equals(Constants.ERROR_NOT_REGISTERED)) {
   // application has been removed from device - unregister database
 }
}








 





반응형

댓글