본문 바로가기

Development/Android

Android Cloud Messaging 해보기 - App으로 GCM 받는 테스트

※ 이 글은 개인 공부 및 내용 정리를 위한 용도로 사용하고 있습니다. 만약 잘못된 내용이 있을 경우에는 댓글을 남겨주시면 수정하겠습니다.


※ 테스트 환경

1. Android Studio 1.4.1

2. Taget SDK Version : 23

3. 테스트 단말기 : 갤럭시 노트4 (Android 5.1.1)


해당 포스팅은 Google Developers에 있는 문서와 예제를 참고로 작성 및 테스트를 진행하였습니다.


GCM을 사용하기 위해 기본적으로 필요한 것은 Google Play Service 이며, 8.1.0 이상의 버전이 필요합니다.

현재 작성일 기준 8.3.0 버전까지 제공하고 있네요.

Project에 다음과 같이 설정을 해주어야 합니다.


1. GCM 관련 Project 설정

1.1 Project build.gradle 파일 설정

 - 프로젝트 최상단에 있는 build.gradle 파일에 dependencies 항목에 classpath 값을 다음과 같이 추가해줍니다.


1.2. 모듈 build.gradle 파일 설정

 - 해당 모듈의 build.gradle 파일에 다음과 같이 두가지를 추가해주어야 합니다.


상단 plugin 추가


dependencies 항목 추가


1.3. google-services.json 파일 복사

 - Google GCM 설정 사이트에서 다운 받았던 google-service.json 파일을 모듈 폴더에 복사합니다.

Google Developers GCM Get Configuration File


1.4. AndroidManifest.xml 에 퍼미션 추가

 - 제가 정리한 예제는 퍼미션이 필요 없으나 관련 필요한 퍼미션은 Google Developers 에서 확인이 가능합니다.

  (Receiver에 permission을 등록하도록 하였습니다.)

 - 필요한 것만 추가하여 사용하면 될 것 같습니다.

Google Developers GCM 'Edit Your Manifest'


 - 그리고 마지막으로 필요한 설정은 GCM 관련 Service와 receiver 등록입니다.


GCM을 사용하기 위해 클라이언트에서 필요한 것은 다음과 같습니다.


- GCM Client 등록을 위한 IntentService 작성

- GCM 관련 GcmListenerService & BroadcastReceiver 등록

- GCM Client 등록

- Instance ID 생성


이제부터 GCM 등록하는 코드와 관련 Service를 작성을 합니다.


2. GCM 등록

2.1. GCM 등록 및 GCM 수신관련 Receiver 작성 및 등록

 - GCM을 등록하고 GCM 수신 처리를 하는 곳은 Service에서 기본적으로 처리가 됩니다. 따라서, Acitvity로 전달이 필요한데 여기서 사용한 것이 LocalBroadcastReceiver를 통한 이벤트 및 데이터 전달입니다.

GCM 수신 관련 BroadcastReceiver


그리고 MainActivity에서 LocalBroadcastReceiver를 등록 및 해제 처리하는 코드를 추가합니다.

MainActivity에서의 LocalBroadcastReceiver 등록 및 해제


2.2. GCM 등록 Service 작성

 - GCM을 수신하기 위한 Device 등록 및 Instance ID를 생성하기 위한 Service를 작성해야 하며, android.app.IntentService 를 상속받아 작성을 합니다.

GCM 등록 Service


 - 그리고 토큰의 변경이 되어 갱신이 필요한 경우에 대비하여 com.google.android.gms.iid.InstanceIDListenerService 를 상속 받은 InstanceIDListenerService도 함께 작성합니다.

GCM InstanceID 갱신을 위한 InstanceIDListenerService


2.3. GCM 수신 GcmListenerService 작성

 - 마지막으로 GCM을 실제로 수신하는 com.google.android.gms.gcm.GcmListenerService를 상속 받은 GcmListenerService를 작성을 해야합니다.

GCM을 수신하기 위한 GcmListenerService


3. GCM 테스트

 - 이 페이지의 예제는 다음과 같이 진행됩니다.

1) GET INSTANCE ID 버튼으로 GCM 등록 및 Instance ID 생성

2) Google에 GCM 발송 요청하여 메시지 수신

3.1. GET INSTANCE ID 버튼으로 GCM 등록 및 Instance ID 생성

다음 그림과 같이 버튼을 터치하여 GCM 등록 및 Instance ID를 생성 요청하게 되면...



다음과 같이 Instance ID를 가져오게 됩니다.



3.2.  Google에 GCM 발송 요청하여 메시지 수신

 - 이제 바뀐 GCM 발송 연동이 간편하게 https://gcm-http.googleapis.com/gcm/send 에 POST 방식으로 연동 처리를 하면 GCM을 사용할 수 있게 되었습니다.

 - 물론 다른 방식도 제공하고 있지만 저는 간단하게 POST로 전송하여 메시지를 확인 해볼수 있는 수준까지만 정리했습니다.

 - 대량 GCM이나 별도의 필요한 GCM 방식은 그에 맞게 작업을 해야합니다.

참고 : Google Developer Authentication

요청 URL : https://gcm-http.googleapis.com/gcm/send

요청 Method : POST

요청 Header 영역 : Authorization: key="서버 KEY"

요청 Param Body

{

  "to" : "보낼 타겟 Instance ID",

  "data" : {

    ...

  },

}


요청 Param Body의 형식은 JSON이 기본입니다.

그리고 Header영역에는 기본 Google Developer에서 생성한 Server KEY를 위와 같이 Authorization: key=서버 KEY 형식으로 설정해야 합니다.

to는 받을 단말기의 Instance ID(GCM 등록 및 Instance ID를 생성하여 나온 토큰 값입니다.)를 입력하고, data는 실제 단말기가 전달 받을 데이터를 JSON 형식으로 자유롭게 작성하시면 됩니다.

제가 작성한 예제는 다음과 같은 형식으로 전달하면 단말기에서 해당 형식에 맞게 Parsing하여 메시지를 표시하도록 처리하였습니다.

GCM 전달하는 Param Body 데이터


위의 요청 형식대로 요청하면 다음과 같이 GCM 을 수신하게 됩니다.



여기서 작성 및 테스트 된 프로젝트 소스는 GitHub에서 확인이 가능합니다.


GitHub - Test_GCM