본문 바로가기

의역과 오역/Dev

GCM의 개요 (Google Cloud Messaging - overview)

(원문 : http://developer.android.com/google/gcm/gcm.html )


Overview 


 안드로이드의 Google Cloud Messaging (GCM)은 개발자들이 서버에서 안드로이드 애플리케이션으로 보내는 것과 메시지를 사용자의 기기에서 클라우드로 돌려보내도록 upstream 하는 것을 돕는 무료 서비스입니다. 이것은 서버로부터 가져올 새로운 데이터가 있는지를 알려주는 경량의 메시지가 될 수도 있습니다. (예를 들어 백 앤드와 싱크가 끝났음을 알려주는 "새로운 이메일" 알림) 또는 메시지 4kb까지 데이터를 담고 있는 메시지가 될 수 있습니다. GCM 서비스는 메시지들의 큐에 관련된 모든 부분을 관리하고 target 기기에서 실행 중인 target 안드로이드 애플리케이션에 이를 전달합니다.


 당신의 애플리케이션에 바로 GCM을 사용해보고 싶다면 Getting Started를 참조하기 바랍니다.


 다음은 Google Cloud Messaging의 기본적인 특징입니다.


- 안드로이드 애플리케이션으로 메시지를 보내기 위해 3rd 파티 애플리케이션 서버를 허용합니다. 

- GCM Cloud Connection 서버를 사용해서 사용자의 기기로부터 메시지를 upstream 할 수 있습니다.

- 안드로이드 기기 상의 안드로이드 애플리케이션 메시지를 받기 위해 실행시킬 필요가 없습니다. 메시지가 도착하게되면 Intent broadcast를 통해 시스템은 안드로이드 애플리케이션이 wake up시키게됩니다. 이를 위해 애플리케이션은 적절한 broadcast receiver와 permission 설정이 되어있어야 합니다. 

- built-in 유저 인터페이스 또는 메시지 데이터를 조작할 수 있는 방법은 제공되지 않습니다. GCM은 단순하게 전달받은 raw 메시지를 바로 안드로이드 애플리케이션으로 넘겨줍니다. 메시지를 조작하는 것과 관련된 모든 통제권은 애플리케이션이 가지게 됩니다. 예를 들어 애플리케이션이 알림을 띄우게되면, 커스텀 유저 데이터를 보여주거나 조용히 데이터를 동기화하게 됩니다.

- GCM은 안드로이드 2.2 또는 이상 버전에서 실행되며 Google Play Store가 설치되어 있어야 합니다. Google API를 가지고 있는 안드로이드 2.2 버전 에뮬레이터에서도 사용할 수 있습니다. 그렇지만 Google Play Store를 통해 안드로이드 애플리케이션을 deploy하는 데에 제한은 없습니다. 

- GCM은 Google 서비스들에 대한 연결을사용합니다. 3.0 이전의 기기들에 대해서는 사용자의 모바일 기기에 Google 계정이 설정되어 있어야합니다. Google 계정은 안드로이드 4.0.4 이상 버전의 기기에서는 필요하지 않습니다. 


핵심 개념 

 아래 표는 GCM에 관한 핵심 용어와 개념을 요약하고 있습니다. 이것은 다음의 카테고리로 나뉘어져 있습니다. 

- Component : GCM에서 기본적인 역할을 하는 엔티티들 

- Credential :  GCM의 서로 다른 단계에서 모든 부분이 인증되고 메시지가 정확한 곳으로 이동할 수 있음을 보장하는 ID들과 토큰들 


표1. GCM Component 와 credentials


Component 

Client App 

 기기에서 동작 중인 GCM이 사용가능한 안드로이드 애플리케이션입니다. 이것은 Google Play Store가 설치된 2.2 이상의 안드로이드 디바이스여야 하며, 안드로이드 4.0.4 보다 하위 버전에서 실행 중이라면 적어도 Google 계정에 한 번 이상 로그인 되어있어야 합니다. 테스트를 위해서 Google API가 설치된 안드로이드 2.2 에뮬레이터를 사용할 수도 있습니다. 


3rd 파티 애플리케이션 서버

 GCM 구현의 일부로 당신이 작성할 애플리케이션 서버입니다. 3rd 파티 애플리케이션 서버는 GCM connection 서버를 통해 데이터를 기기 상의 안드로이드 애플리케이션으로 보내게됩니다.


GCM Connection 서버들 

 3rd 파티 애플리케이션 서버로부터 메시지를 가져오고 기기로 메시지를 보내는 것과 관련해서 Google이 제공하는 서버들입니다. 


Credentials

Sender ID

 API console에서 얻게되는 프로젝트 넘버입니다. 이를 얻는 방법은 Getting Started에 설명되어 있습니다. sender ID는 registration 과정에서 3rd 파티 애플리케이션이 기기에 메시질르 보내도록 허용되어 있는지를 식별하기 위해 사용되게 됩니다. 


Application ID

 안드로이드 애플리케이션이 메시지를 받기 위해 등록되어있는 상태에서 안드로이드 애플리케이션은 manifest의 패키지명에에 의해 식별되게 됩니다. Application Id는 메시지가 정확한 안드로이드 애플리케이션을 대상으로 하도록 합니다.


Registration ID

 안드로이드 애플리케이션이 메시지를 받는 것을 허용하기 위해 GCM 서버가 발행한 ID입니다. 안들이드 애플리케이션이 registration ID를 가지고 있었던 적이 있다면, 애플리케이션은 이것을 3rd 파티 애플리케이션 서버로 보낼 것 입니다. rd 파티 애플리케이션 서버는 이것을 주어진 애플리케이션에 대해 메시지를 받기 위해 등록된 각각의 기기를 식별하는 용도로 사용합니다. 다시 말하면 registration ID는 특정 안드로이드 애플리케이션이 특정 기기에서 실행되고 있는지와 관련이 있습니다. registrationID는 비밀을 유지해야한다는 걸 잊지마세요.


Note : 만약 당신이 backup 과 restore를 사용한다면, registration ID는 명시적으로 백업하지 않는 것이 좋습니다. 당신이 기기르 백업할 때 앱은 자동적으로 shared preference를 백업합니다. 만약 당신이 명시적으로  GCM registration ID를 배제하지 않는다면, ㅇ새 기기에서 재사용될 수 있으며 이것은 전송 에럴르 유발할 수 있습니다. 


Google User Account

 GCM이 동작하기 위해서, 기기가 안드로이드 4.0.4 버전 이하에서 실행되고 있다면 모바일 기기는 적어도 하나의 Google account를 가지고 있어야 합니다. 


Sender Auth Token

 3rd 파티 애플리케이션 서버에 저장되는 API key 는 애프리케이션 서버의 인증된 권한을 Google Service들로 보냅니다. API key는 메시지를 보내는 POST request의 헤더에 포함됭 있습니다. 


아키텍처의 개요


 GCM 구현은 Google이 제공하는 connection 서버와 connection 서버와 상호작용하는 3rd파티 앱 서버와 안드로이드 기기에서 실행되는 GCM이 사용가능한 클라이언트 앱을 포함하고 있습니다. 


그림 1. GCM 아키텍쳐

- Google이 제공하는 GCM Connection 서버들은 3rd 파티 애플리케이션 서버에서 메시지를 가져오고 기기에서 실행 중인 GCM이 사용가능한 안드로이드 애플리케이션(이하 "client app")으로 보냅니다. 

- 3rd 파티 애플리케이션 서버는 당신이 선택한 GCM connection 서버(들)과 작업하기 위해 구현해야 하는 컴포넌트입니다. 앱 서버는 메시지를 GCM connection 서버로 메시지를 보내게 됩니다. 연결 서버는 메시지를 큐에 추가하고 저장하며, 기기가 온라인 상태라면 이를 기기에 보냅니다. 더 자세한 사항은 Implementing GCM 서버를 참조하시기 바랍니다. 

- 클라이언트 앱은 기기에서 실행 중인 GCM이 사용한 가능한 안드로이드 애플리케이션입니다. GCM 메시지를 받기 위해서, 이 앱은 반드시 GCM으로 등록을 하고 registration ID를 받아야합니다. XMPP(CCS) connection 서버를 사용한다면, 클라이언트 앱은 메시지를 "upstream"하여 connection 서버로 되돌릴 수 있습니다. 어떻게 클리아언트 앱을 구현할지는 Implementing GCM Server를 참조하기 바랍니다. 



생명주기의 흐름


- GCM  사용할 수 있게 하기. 기기에서 실행 중인 안드로이드 애플리케이션이 메시지를 받기 위해 등록을 합니다. 

- 메시지 보내기. 3rd 파티 애플리케이션 서버 기기로 메시지를 보냅니다. 

- 메시지 받기. 안드로이드 애플리케이션이 GCM 서버로부터 메시지를 받습니다. 


이 과정은 아래에 자세하게 설명되어있습니다. 



GCM 사용할 수 있게 하기

 최초에 안드로이드 애플리케이션은 메시지 서비스를 사용할 필요가 있습니다. 이것은GoogleCloudMessaging의 register()를 호출하게 됩니다. 이것은 Implementing GCM Client에 자세히 나와있습니다. register() 메소드는 registrationID를 반환합니다. 안드로이드 애플리케이션은 이 후에 사용을 위해 ID를 저장해 놓습니다. (예를 들어 이미 등록이 되어있는지 onCreate()에서 체크할 때 쓰입니다.)


메시지 보내기

 다음은 애플리케이션 서버가 메시지를 보낼 때 발생하는 이벤트의 흐름입니다. 


 1. 애플리케이션 서버는 GCM 서버로 메시지를 보냅니다. 

 2. Google은 기기가 오프라인 상태라면 메시지를 큐에 추가하고 저장합니다. 

 3. 기기가 온라인일 때, Google은 기기로 메시지를 보냅니다. 

 4. 기기 상에서, 시스템은 적절한 permission을 가진 intent broadcast를 통해서 메시지를 특정 안드로이드 애플리케이션으로 broadcast 합니다. 이를 통해 해당 안드로이드 애플리케이션은 메시지를 받게 됩니다. 이것은 안드로이드 애플리케이션을 wake up 시킵니다. 안드로이드 애플리케이션은 메시지를 받기 전에 실행되고 있을 필요는 없습니다. 

 5. 안드로이드 애플리케이션은 메시지를 처리합니다. 만약 안드로이드 애플리케이션이 즁중요한 작업을 하고 있다면, 서비스에서 이 외의 처리를 할 수 있도록 Powermanager, WakeLock을 멈출 수 있습니다.


 안드로이드 애플리케이션은 더 이상 메시지를 받길 원하지 않는다면 GCM 등록을 해제할 수 있습니다. 


메시지 받기 


 이것은 모바일 기기에 설치된 안드로이드 애플리케이션이 메시지를 받을 때 발생하는 이벤트의 흐름입니다.


 1. 시스템은 도착한 메시지를 받고 존재한다면 메시지 payload의 raw  key/value 쌍을 가져옵니다.. 

 2. 시스템은 key / value 쌍을 extra들의 묶음의 com.google.android.c2dm.intent.RECEIVE 인텐트 안의 대상 안드로이드 애플리케이션으로 넘기게 됩니다. 

 3. 안드로이드 애플리케이션이 com.google.android.c2dm.intent.RECEIVE intent의 raw data를 가져옵니다.