본문 바로가기
Android

GCM (Google Cloud Message) 구축하기2 (클라이언트)

by 전재훈 2014. 5. 14.
반응형

이번엔 구글 안드로이드 단말에서 구현하는 부분을 설명드릴께요


gcm.jar을 GCM을 구현하기위해서

android-support-v4.jar은 Notification을 구현하기위해서 

gcm.jar과 android-support-v4.jar 파일이 필요해요


필요한 파일은 첨부파일에 예제 프로젝트와 함께 첨부해 놀께요


android-support-v4.jar


gcm.jar



GCMSample.zip




1. 매니페스트에 GCM 사용 관련 permission과 receiver, service를 등록

*GCM 관련 퍼미션 (패키지는 자신의 앱 패키지 명으로 대체 한다.)

<!-- GCM 관련 퍼미션 -->
<permission android:name="패키지.permission.C2D_MESSAGE" android:protectionLevel="signature" />

<uses-permission android:name="패키지.permission.C2D_MESSAGE" /> 
<!-- GCM 받기 -->
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- GCM을 받으려면 구글 계정 필요 -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<!-- 메시지 받을 때 wake up 하기 위해 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />

<!-- 네트워크 접속 권한 -->
<uses-permission android:name="android.permission.INTERNET" />


*GCM 사용 관련해서 안드로이드 버전 제한 (2.2 이상)

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="개발할 api 버전" />


*GCM 리시버 및 서비스 등록

리시버는 코드 상에서 등록하지 말고 메니페스트에 적어서 등록하도록 권장한다.

리시버는 gcm.jar 라이브러리에 포함되어 있다. 구현할 필요 없다.


서비스는 반드시 자신의 기본 패키지에 속해야 하며 이름은 GCMIntentService로 해야 한다.

서비스는 GCMBaseIntentService를 상속받아 구현해야 한다.



<application>

....

<!-- GCM 리시버 -->
<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="패키지" /> <!-- 젤리빈 부터는 category 빼도 된다 -->
   </intent-filter>
</receiver>


<!-- GCM 리시버에서 돌리는 서비스 -->
<service android:name=".GCMIntentService" /><!-- 서비스명 변경하면 안됨 -->

....

</application>


리시버에 다른 intent filter를 등록하지 않아도 앱이 죽어 있어도 푸시를 잘 받아온다.



2. GCMIntentService 구현하기

GCMIntentService는 자신의 앱 기본 패지키에 존재해야 하며 이름을 변경하면 안된다. 또한 public 기본 생성자를 만들어야 한다.

GCMBroadcastReceiver 에서 푸시를 받으면 정해진 이름으로 서비스를 객체를 실행하기 때문에 위의 조건을 만족해야 한다.


GCMIntentService는 GCMBaseIntentService를 상속받아야 한다.


public class GCMIntentService extends GCMBaseIntentService {
    private static final String tag = "GCMIntentService";
    private static final String PROJECT_ID = "구글 api 홈페이지에서 만든 프젝트 ID";

    //구글 api 페이지 주소 [https://code.google.com/apis/console/#project:긴 번호]

   //#project: 이후의 숫자가 위의 PROJECT_ID 값에 해당한다
   

    //public 기본 생성자를 무조건 만들어야 한다.

    public GCMIntentService(){ this(PROJECT_ID); }

   

    public GCMIntentService(String project_id) { super(project_id); }

 

    /** 푸시로 받은 메시지 */
    @Override
    protected void onMessage(Context context, Intent intent) {
        Bundle b = intent.getExtras();

        Iterator<String> iterator = b.keySet().iterator();
        while(iterator.hasNext()) {
            String key = iterator.next();
            String value = b.get(key).toString();
            Log.d(tag, "onMessage. "+key+" : "+value);
        }
    }


    /**에러 발생시*/
    @Override
    protected void onError(Context context, String errorId) {
        Log.d(tag, "onError. errorId : "+errorId);
    }

 

    /**단말에서 GCM 서비스 등록 했을 때 등록 id를 받는다*/
    @Override
    protected void onRegistered(Context context, String regId) {
        Log.d(tag, "onRegistered. regId : "+regId);
    }


    /**단말에서 GCM 서비스 등록 해지를 하면 해지된 등록 id를 받는다*/
    @Override
    protected void onUnregistered(Context context, String regId) {
        Log.d(tag, "onUnregistered. regId : "+regId);
    }
}



3. 앱의 메인 액티비티에 GCM서비스 등록 하는 코드 추가하기

자신의 앱의 메인 액티비티 onCreate 메소드에 gcm 서비스 등록 코드를 추가하자.


GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
final String regId = GCMRegistrar.getRegistrationId(this);
if("".equals(regId))   //구글 가이드에는 regId.equals("")로 되어 있는데 Exception을 피하기 위해 수정
      GCMRegistrar.register(this, "534641675187");        // 여기에 숫자는 project number
else
      Log.d("==============", regId);




IntentReceiver com.google.android.gcm.GCMBroadcastReceiver@40233b88 that was originally registered here. Are you missing a call to unregisterReceiver()?


혹시 앱이 죽지 않지만 로그캣에 위와 같은 에러 로그가 출력된다면 gcm 서비스 등록 코드를 자신의 앱 application 클래스의 onCreate로 옮겨주면 된다.




여기까지 작성하면 단말쪽에서는 GCM을 이요한 푸시를 받을 준비가 되었다. 앱을 실행하고 로그를 보면 단말에서 GCM 서비스를 등록한 후 등록 id가 출력 될 것이다. 등록 id를 잘 적어놓자. 나중에 서버 구현시 테스트에 필요하다.

*등록 id는 앱을 삭제 후 다시 설치하고 다시 gcm 서비스를 등록해도 같은 등록 id가 나온다.


실제 앱을 개발할때는 등록 id가 발급되면 자신들의 서비스 서버에 등록 id를 전송 해야 한다.

서버에서는 단말의 등록 id를 가지고 각각의 단말에 푸시 데이터를 구글 푸시 서버에 전송한다.



아래 두 블로그에서 참고해서 작성한 글이에요


GCM 관련

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0NADc&articleno=31&categoryId=3&regdt=20120719190849


Notification 관련 

http://makerj.tistory.com/118

반응형

댓글