본문 바로가기

개발도구/aOS - 안드로이드 개발

[안드로이드] 펌 - C2DM_1

■ C2DM에 필요한 것

 * Mobile Device (장치)
   * Market 애플 리케이션이 설치되는
   * 2.2 이상의 Android가 달리고있다
   * Google 계정 끈을 가진
   * C2DM를 이용하는 Android 애플 리케이션을 설치

 * Third - Party Application Server (애플 리케이션 서버)
   * 개발자가 준비
   * 장치의 Android 애플 리케이션에 C2DM Server를 통해 데이터를 전송

 * C2DM Servers (C2DM 서버)
   * Third - Party Application Server에서 메시지를 제거하고
    그것을 장치로 보내는 역할을 수행 Google 서버


■ C2DM 인증에 필요한 것

 * Sender ID (Android app 용)
   * 애플 리케이션 개발자 끈을 잡은 email 계정
   * 장치로 메시지를 보내는 것을 허용했다 Android 애플 리케이션
    등록 과정에서 이용되는
   * 개발자마다 다른

 * Application ID (Android app 용)
   * manifest중인 패키지 이름
   * Android 애플 리케이션마다 다른

 * Registration ID (Android app / Application Server 용)
   * 메시지를받는 것을 허용하고있다 Android 애플 리케이션에 대해
    C2DM 서버에서 발급된 ID
   * 특정 디바이스의 특정 애플 리케이션에 묶여
   * 장치의 Android 애플 리케이션마다 다른

 * Google User Account
   * 사용자마다 다른

 * Sender Auth Token (Application Server 용)
   * Third - party application server에 저장된
    ClientLogin Auth 토큰
   * 메시지 보내기 POST 요청의 헤더에 포함된


■ C2DM 등록

 1. REGISTER Intent받은 등록
  * Register Intent 
   (com.google.android.c2dm.intent.REGISTER
   를 C2DM 서버에 제출
    * register Intent는 Sender ID와 Application ID를 포함

 2. Registaration ID 검색
  * 등록 성공시 C2DM 서버에서 발생하는 REGISTRATION Intent의
   브로드 캐스트를 받고, Registration ID를 검색하는
  * Registration ID를 업데이 트하므로 REGISTRATION Intent 여러 번
   라는 것에 대응해야

 3. Registaration ID 송부
  * Registration ID를 응용 프로그램 서버에 제출
  * Registration ID는 응용 프로그램이 명시적으로 자신을 가입한지
   분리했을 때 또는 Google이 애플 리케이션의 Registration ID를 업데이 트 시까지
   살아난다


■ 메시지 보내기

 * 애플 리케이션 서버
  * 하나의 특정 애플 리케이션 (= 특정 장치에 애플 리케이션)에
   다른 ClientLogin token을 가지고 여러 registration ID를 가진
  * 각 registration ID는 특정 애플 리케이션에 대해
   메시징 서비스를 사용하는 특정 장치를 표현하고있다

 1. 리케이션 서버는 Google C2DM 서버에 메일을 보낸다.

 2. Google 측은 장치가 가동되어 있지 않은 경우에는 메시지를
  큐에 저장해 둔다.

 3. 장치가 온라인 상태가되면, Google은 장치로 메시지를 보낸다.

 4. 장치에서 시스템이 특정 애플 리케이션에 대해 적절한 권한
  설정하고, 그 대상 애플 리케이션만이 메시지를 검색할 수 있도록
  Intent Broadcast를 사용하여 메시지를 브로드 캐스트한다.
  메시지를 받기 위해 사전에 달려있을 필요는 없다.

 5 애플 리케이션은 메시지를 처리한다. 프로세스가 복잡한 경우
  wake lock을 보유하고 백그라운드 Service 처리한다.


■ 메시지 수신

 1 시스템은 전송된 메시지를 받고 메시지 payload에서
  삶의 key / value 쌍을 직접 받는다.

 2 시스템은 대상 Android 애플 리케이션에 key / value 쌍을 
  com.google.android. c2dm.intent.RECEIVE 의도의
  Extras에 담아 전달한다.

 3. Android 애플 리케이션, RECEIVE Intent에서 key를 사용하여 원시 데이터를
  제거하고 데이터를 처리한다.




■ 바로 자신의 애플 리케이션에 통합하라

 1. ChromeToPhone를 추천하여 My Google Chrome Extension을
  만들기

   생략

 2. Chrome Extension에서 보내진 메시지를 처리하여
  C2DM 서버에 전송하는있는 응용 프로그램 서버 
  Google App Engine에서 만드는 (별도 Google App Engine 
  아니라 자기 고등어도 Amazon도 좋아)

  ● 필요한 기능
   * 클라이언트와 커뮤니케이션있다.

   * C2DM 서버에 HTTP 요청을 보낼 수

   * 요청을 처리하고 필요에 따라 대기열의 데이터를
    처리할 수. 예를 들어, exponential back off가 가능하다 것.

   * ClientLogin Auth token와 클라이언트 registration ID를
    저장할 수있다.

  ● 메시지 보내기
   https : / / android.apis.google.com/c2dm/send 에
   POST 요청
을 보낼


   POST 요청 헤더 설정

    Content - Type : application / x - www - form - urlencoded

    Content - Length : Content 바이트 길이

    Authorization : GoogleLogin auth = AUTH_TOKEN]
      ac2dm 서비스 관련 ClientLogin Auth 토큰


   POST 요청의 Content에 포함된 필드

    * registration_id
      터미널에서 Android 애플 리케이션에서 가져온 registration ID. 필수.

    * collapse_key
      장치가 오프라인 상태의 경우와 같이 마지막 메시지만
      클라이언트에 보내도록 유사한 메시지
      그룹을 축소 시키는데 사용되는 문자열.
      단말기가 온라인 상태가되었을 때, 많은 메시지가
      보내지 않음을 의미. 필수.
      메시지 순서 보장은 없기 때문에, 정말로 "마지막"
      메시지일지도 모른다주의

    * data. (optional)
      key / value 쌍으로 표현된 Payload 데이터도하고 있으면
      이 응용 프로그램 데이터로 Intent 속에
      포함된다. 선택적. 
      key / value 쌍의 수에는 제한이 없지만, 메시지의 전체
      크기는 제한이있다.

    * delay_while_idle (optioanl)
      장치가 작동하지 않을 때, 메시지를 즉시 보내지 않는다
      것을 보여준다. 서버는 장치가 활성화되기를 기다리고,
      각 collapse_key마다 해당 값, 마지막 메시지
      보내기



   응답 (200)
    Header
    * Update - Client - Auth = Updated Auth Token]
      ? 새로운 Auth Token가 발행되면,이 Field가 응답에 들어가는

    Body
    * id = ID of sent message]

    * Error = [error code]
      * QuotaExceeded 
         너무 많은 메시지를 보내고있다. 잠시 후 다시 시도하라.
 
      * DeviceQuotaExceeded
         특정 장치에 너무 많은 메시지를 보내고있다.
         잠시 후 다시 시도하라.

      * InvalidRegistration
         registration_id가 존재하지 않거나 잘못되었습니다.
         이 장치에 메시지 전송을 중단해야한다.

      * NotRegistered
         registration_id은 더 이상 유효하지 않습니다.
         예를 들어, 사용자가 응용 프로그램을 제거하고 하나
         notification을 끈 경우에?
         이 장치에 메시지 전송을 중단하라.

      * MessageTooBig
         메시지 페이로드가 너무 큽니다.
         제한을 확인하여 메시지의 크기를 작게하라.

      * MissingCollapseKey
         Collapse key는 필수이다. 요청
         Collapse key를 포함시키기

   응답 (503)
     서버가 일시적으로 사용할 수 없다. 나중에, 응답의
     Retry - After 헤더를 사용하여 다시 시도하십시오.
     애플 리케이션 서버는exponential back off 를 구현해야해야한다.
     문제를 일으킨 서버는 블랙리스트에 게재되는 위험도있다.

   응답 (401)
     ClientLogin AUTH_TOKEN이 잘못되었습니다.


 3. Android 애플 리케이션을 만들

  오래 되었기 때문에 다음 항목.



--------------------------------------------------------
출처 : http://y-anz-m.blogspot.com/2010/09/androidcloud-to-device-message-c2dm-2.html (구글번역)