본문 바로가기

개발 관련 지식/안드로이드(Android)

[안드로이드] 안드로이드 푸시 알림 서비스 사용방법(GCM)

* 안드로이드 푸시 알림 서비스(GCM) 사용방법

 

* 개요

: 이번 포스팅을 하게 된 배경은 요즘 가장 많이 사용하고 있는 메신져 카톡에 대해 궁금증으로 시작되었다. 카톡을 보면 알림 메시지가 오게 되는데 이는 서버 측에서 메시지를 보내 주는 것인지 어플이 서버로 주기적으로 접속해서 확인하는 것인지 궁금하였기 때문이다.

 원천적인 질문은 메시지가 어떻게 올 수 있는 것인가?!! 이다..

 

 [참고] 서버에서 공지사항에 새로운 글이 등록되어있을때 앱에서 알림메세지를 확인하는 방식
: 앱을 키지 않고도 알람 메시지를 받아야 한다면 푸시를 이용해야 하고, 그렇지 않고 앱을 켰을 때만 확인하고 싶다면, 앱 에서 주기적으로 웹 서버를 체크하는 방식이 가능할 듯 보인다.

 

* 푸시 알림 서비스란?

: 서버에서 앱에 데이터(메시지)를 전송하는 서비스이다. 푸시 서비스를 구현하기 위해서는 내장 푸시 서비스인 GCM(안드로이드) / APNS(IOS) 를 이용하거나, 사설 푸시 서비스를 이용하여 구현할 수 있다.

 

* GCM(Google Cloud Messaging) 이란?

: 구글에서 제공하는 GCM 서버를 통한 메시지 발송 서비스로, 기존에는 C2DM이었으나 C2DM 서비스를 종료하고 GCM 으로 바꾸었다. 이 서비스를 이용하기 위해서는 ANDROID 프로요(Froyo) (API Lev 8) 이상이 되어야 한다.

 메시지는 최대 4KB 크기로 보낼 수 있으며, 이 서비스를 통해 채팅, 알림 등의 서비스 구현이 가능하다. 100% 수신 성공률을 장담하지는 못하지만, 과거 C2DM 에 비해 GCM의 수신 성공률은 많이 좋아졌다고 한다.

 

 

 

* GCM 구성 요소

 

 1. Android 단말(APP)

 => Android 2.2 이상 / Google Play Store 설치 / Google account 로그인(Android 4.0.4 이상에서는 필요없음)

 (애뮬레이터 사용시에는 Google API 포함된 Android 2.2 버전 이상)

 2. 3rd party app server

 => Google GCM server 를 통해 Anroid 단말(app)에 메시지 전송 기능 수행

 3. GCM server

 => Google 에서 제공하는 GCM server

 

* GCM 동작 순서

 1. GCM 활성화

 => Android 단말(APP)이 GCM 서버와 3rd-party server에 ID 등록 

 2. 메시지 송신

 => 3rd-party server 가 GCM Server를 통해 메시지 전송

 3. 메시지 수신

 => GCM 서버로부터 메시지 수신

 

1. GCM 활성화

1) Messaging service 사용을 위해 GCM server 에 com.google.android.c2dm.intent.REGISTER intent 로 extra 에 Project ID와 Application ID 를 전달해야 한다. 보통 이 작업은 앱의 onCreate 에서 한다.

 

2) 만약 등록이 성공적으로 이루어진다면, GCM server에서 com.google.android.c2dm.intent.REGISTERATION intent 를 registration ID 와 함께 전달한다. Android 단말(APP)은 이 아이디를 사용하기 위해 저장해둔다.(재등록을 생략하기 위해)

Google 이 주기적으로 registration ID 를 refresh 할 수 있기 때문에, com.google.android.c2dm.intent.REGISTRATION 이 여러번 불릴 수 있다는 사실을 기억해야 한다.

 

3) 전달받은 registration ID 를 3rd-party server 에 등록해야 한다. 이 registration ID 는 명시적으로 unregister 하기 전까지 또는 Google 이 registration ID 를 refresh 하기 전까지 유효하다.

 

2. 메시지 송신(3rd party server -> GCM server -> Android app(단말))

1) 3rd party server 는 GCM 활성화 단계에서 단말(APP) 에서 GCM server 로 등록하면서 받은 registration ID 와 GCM server 접속을 위한 API Key가 존재해야 한다.

 

2) 3rd party server 가 GCM server 에 메시지를 전송한다.

 

3) 단말이 꺼져있을 경우를 대비해 메시지를 queue 에 넣고 저장해 놓는다.

 

4) 단말이 켜져있다면 GCM server 가 단말에 메시지를 전송한다.

 

5) 단말에서 시스템이 타켓 app에 permission과 함께 메시지를 보낸다. Android app은 메시지를 받아 wake up 한다.

 

6) app 이 해당 메시지를 처리하며 만약 여러가지 작업을 한다면, PowerManager.WakeLock 을 통해 파워를 살리는 작업이 필요하다.

 

3. 메시지 수신(GCM server -> Android app(단말))

 

1) 시스템이 들어오는 메시지를 받으면, key / value pair를 추출해낸다.

2) 시스템이 타겟 app에게 com.google.android.c2dm.intent.RECEIVE Intent 에 key/value pair 를 넣어서 전달한다.

3) app 에서 intent를 받아서 data 처리를 한다.

 

 

* GCM 사용 방법(신청 방법)

- GCM 사용에 필요한 항목

: PROJECT ID / API KEY / Application ID / Registration ID / Google User Account

 1. PROJECT ID

 => Google API Console 에 있는 Project Number

 2. API KEY

 => Google Service 에 접속할 수 있는 API Key로 Post header 에 들어있어야 함

 3. Application ID

 => manifest 의 package name으로, GCM 에서 타겟팅할 APP을 구분하는 용도

 4. Registration ID

 => GCM server 가 android APP 에 assign 한 ID(단말기 ID)로, 이것을 3rd party app server 에 등록 시켜야함

   (Registration ID 와 Application ID 를 통해 특정 단말의 특정 앱을 구분)

 5. Google User Account

 => Google 계정 로그인 필요

 

 

[참고] 가이드 문서 : http://developer.android.com/guide/google/gcm/gs.html

 

1. Google APIs Console 페이지로 이동(로그인 필요)

https://console.developers.google.com/#/project

 

2. 구글 계정에 로그인하면 [Create Project] 버튼이 보일 것이다.

 (첫 방문자의 경우에는 중앙에 보일 것이다.)

 

 

 

 

 

 

 

3. 생성한 프로젝트 홈으로 이동하면 아래 정보들을 확인한다.

: Project Number 를 확인한다. 추후에 Register ID를 얻어올 때 사용된다~!

 

 

 

 

 

4. API Access Key 를 생성한다.

1) APIs & auth > Credentials 탭으로 이동

2) Publice API Access 박스 안의 Create new Key 버튼을 클릭

3) Server Key 를 클릭

 

 

4) 아래 화면이 나오면 아무런 입력값 없이 Create 버튼 클릭

 (해당 창에는 Access 가능한 IP 주소를 리스트하는 곳인데, GCM 은 무료이기 때문에 신경 쓰지 않아도 된다)

 

 

 5) 생성된 API KEY 값을 확인하고 기억해둔다.

 (생성한 프로젝트의 비밀번호 같은 역할이므로 중요하다~!)

 

6) 마지막으로 GCM 을 활성화해준다.

 ( APIs & auth > APIs 탭으로 이동하여 Google Cloud Messaging for Android 를 찾아 ON 으로 활성화)

 

 

 

 

5. 발급 받은 Server Key는 서버 구현시에 사용

 

6. 생성된 프로젝트의 Project Number 를 가지고 GCM 서버에 register 하여 단말기의 Register Id를 확인

 

7. 확인한 RegisterationID를 서버에 저장 시킨 후 이 것을 이용하여 메시지 전달

: GCM 에서 신청한 API Key, 앱에서 생성된 RegistrationID, 메시지 등 3가지를 GCM Push Server 에 전달

 

8. GCM Push Server 에서는 확인하여 단말기에 메시지를 전송

 

 [참고] GCM 구현을 위해 알아두어야 할 사항

1. 3rd-party server 가 app에 메시지 전송 가능

2. GCM은 메시지 전송과 순서를 보장하지 않음

3. App이 가동 중이지 않아도 msg가 수신되면 broadcast 와 service를 통해 wake up 시킴

(message 처리 내용이 시간이 걸린다면, app이 wake lock 을 걸어주어야 함)

4. GCM은 UI 없이 단순한 raw msg 전달의 목적을 갖는다.

5. Android 2.2 이상 단말이 필요하며, Google Play Store이 install 되어 있어야 함

6. Android 3.0 이하의 버전에서는 Google account 가 단말에 set up 되어 있어야 함

(Android 4.0.4 이상에서는 필요 없음)

 

 

 [참고] GCM 사용하는 대표적인 예(카카오톡)

: 대표적인 예로는 카카오톡을 들 수 있다. '푸쉬 알림' 기능으로, 새로운 메시지가 왔을 때 폰 중앙과 상단 바에 표시되는 기능이다.

평상시에 카카오톡 등 푸쉬를 받아야 하는 앱들은 램(RAM)에 상주하면서 푸쉬를 받는데 카카오톡은 자체 푸쉬를 사용하기 때문에 램에서 죽이면 푸쉬가 오지 않는다. 그리고 카카오톡은 GCM과 자체 푸쉬를 겸하여 사용하고 있고, 푸쉬 알림을 죽여 놓으면 GCM만을 통해 푸쉬를 받는데, 가끔 누락되는 메시지나 10분 정도 늦은 푸쉬를 받을 수도 있다고 한다.