반응형


Try Cloud Messaging for Android

 클라우드 메시징이 어떻게 작동하는지 보기 위해서는 여러분의 안드로이드 샘플 앱을 사용하거나, 클라우드 메시징에 여러분의 존재하는 앱을 추가하십시요.
필수조건 : 안드로이드 스튜디오 그리고 구글 플레이 서비스 의 최신 버전들.

1. Get the project

여러분이 구글 서비스 샘플을 처음 사용한다면, 구글 서비스 저장소에서 체크아웃 받으세요.
그다음 안드로이드 스튜디오를 여세요.

File > Open 을 선택하고, 여러분이google-services저장소에서 클론받은 것을 찾아서, 그리고 google-services/android/gcm 을 열면 됩니다(안드로이드 스튜디오 시작 화면이라면, Import Non-Android Studio project 를 선택하고 이것과 같은 경로를 사용하세요). 


2. Get a configuration file

그 샘플을 사용하려면, 여러분은 설정 파일을 가져오기 위해서 그리고 프로젝트 셋팅을 끝내기 위해서 몇가지 추가적인 정보를 제공할 필요가 있습니다. 샘플을 사용하려면  gcm.play.android.samples.com.gcmquickstart 패키지 이름을 사용하세요.

등록을 완벽하게 마친 후에는, 프로젝트에 추가하기 위한 google-services.json 파일을 다운로드 하세요.


Create an API project

새로운 클라우드 메시징 프로젝트들은 Firebase console 안에서 Firebase project 로 생성해야만 합니다. 처리단계에서, 프로젝트에 대한 설정 파일과 자격 증명을 생성하게 될 것 입니다.

  1. Firebase console 에서 Firebase 프로젝트를 하나 생성하고, 이미 생성한 것이 없을텐데요. 여러분의 앱과 관련된 이미 존재하는 구글 프로젝트가 이미 있다면, Import Google Project를 클릭하세요. 그게 아니라면, Create New Project를 클릭하세요.
  2. Add Firebase to your Android app 를 클릭하고 다음 단계를 설정하세요. 여러분의 존재하는 구글 프로젝트가 포함되어 있다면, 이것은 자동적으로 발생하고 여러분은 그 설정 파일을 다운로드 할 수 있습니다.
  3. 프롬프트가 떴을 때, 앱의 패키지 이름을 입력하세요. 여러분의 앱이 사용하는 패키지 이름을 입력하는 것은 중요합니다.; 이것은 오직 여러분의 Firebase 프로젝트에 앱을 추가할 때 설정할 수 있습니다.
  4. 마지막으로, google-services.json 파일을 다운로드 하세요. 여러분은 언제나 이 파일을 다운로드 할 수 있습니다.
  5. 아직 수행하지 않았다면, 이것을 여러분 프로젝트의 모듈 폴더로 복사하세요, 일반적으로 app/.

1. Add the configuration file to your project

 여러분이 방금 다운로드 한 google-services.json 파일을 안드로이드 스튜디오의 app/  또는 mobile/ 디렉토리로 복사하세요. 안드로이드 스튜디오 터미널 pane 을 열어보세요:

MAC/LINUX
$ mv path-to-download/Downloads/google-services.json app/


WINDOWS
$ move path-to-download/Downloads/google-services.json app/


2. Run the sample

이제 이미 여러분은 안드로이드 스튜디오에서 그 샘플을 빌드하고 실행했을 것입니다.

 첫째로, 여러분의 Server key 가 확실해야하는데 이것은 GcmSender.java 안의 API_KEY 값으로 제공됩니다. 
안드로이드 스튜디오 안에서, 실행 버튼을 클릭하고 연결된 단말기를 선택하세요.
여러분의 단말기로 샘플 애플리케이션이 떴을 때, 다음의 그레들 명령어를 실행하여 모든 등록된 앱 인스턴스들에게 notification 을 보내세요.:

Linux/Mac:

./gradlew run -Pmsg="<message>"

Windows:

.\gradlew.bat run -Pmsg="<message>"


이 명령어는 샘플을 목적으로 하는 서버를 모방하는 것인데요, 그러나 실제 앱 서버에 대한 예를 드는 서버의 의미를 가지지 않습니다. 왜냐하면 GcmSender.java 파일은 Server key를 포함하고 있기 때문인데, 여러분의 클라이언트 앱에서는 포함하지 않습니다. 메시지를 보내기 위한 앱 서버에 대한 더 많은 정보를 보려면 About GCM Connection Server 를 보세요. 서버의 동작하는 예시들을 검토하기 위해서는, GitHub 에 있는 GCM samples를 보세요.


3. How it works

각 단말기에 대해서,  첫째로 InstanceID API 로부터 구글 클라우드 메시징을 위한 registration token 을 얻어야 합니다. 이 토큰은 여러분의 단말기에서 퀵스타트로 실행중인 인스턴스를 식별하기 위해서 사용되어 집니다. IntentService 에서 사용중인 토큰을 추출하는 것을 보여주고 있습니다. 왜냐하면 네트워크 연결의 결과이기 때문에, 이 UI 쓰레드의 실행을 확실하게 해야 합니다.


public
 class RegistrationIntentService extends IntentService {
   
// ...

   
@Override
   
public void onHandleIntent(Intent intent) {
       
// ...
       
InstanceID instanceID = InstanceID.getInstance(this);
       
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
        // ...
   
}

   
// ...
}

이 샘플의 데모 서버(GcmSender.java)가 메시지 문자열을 기본적으로 topic /topics/global 으로 보냅니다. 이 토픽을 보낸 메시지를 받으려면, 각 앱 인스턴스가 이 토픽을 구독해야 합니다.


private
void subscribeTopics(String token) throws IOException {
GcmPubSub pubSub = GcmPubSub.getInstance(this);
for (String topic : TOPICS) {
pubSub
.subscribe(token, "/topics/" + topic, null);
}
}

그리고 GcmReceiver 에 의해 잡힌 메시지들을 처리하기 위해서는 GcmListenerService 를 상속한 한 서비스를 사용해야 합니다. WakefulBroadcastReceiver 를 상속한 GcmReceiver 는, 여러분의 리스너 서비스가 완벽하게 작업을 할 수 있도록 CPU가 깨우는 것을 보장합니다.

GcmListenerService.onMessageReceived 메소드를 오버라디딩 햠으로써, 여러분은 수신된 메시지 기반으로 행동들을 수행 할 수 있습니다.


@Override

public void onMessageReceived(String from, Bundle data) {
   
String message = data.getString("message");
   
Log.d(TAG, "From: " + from);
   
Log.d(TAG, "Message: " + message);

   
if (from.startsWith("/topics/")) {
       
// message received from some topic.
   
} else {
       
// normal downstream message.
   
}

   
// ...
}


4. Next steps

만약 여러분이 자세한 내용을 원한다면 어떻게 자신의 앱으로 메시지를 보내는지 보려면, 우리의 샘플 구현 가이드를 보세요.


좋은 경험을 했나요? 문제속으로 뛰어 들까요? 우리에게 알려주세요!

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the Apache 2.0 License. For details, see our Site Policies. Java is a registered trademark of Oracle and/or its affiliates.


반응형
반응형


Implementing an HTTP Connection Server

 이 문서는 Google Cloud Messaging(GCM) HTTP connnection server 를 기술합니다. Connection 서버들은 구글이 제공하는 서버들로서 애플리케이션 서버로부터 메시지를 받아서 단말기로 보냅니다.
 Server Reference 를 보면 모든 메시지 파라메타들과 어떤 Connection 서버들을 지원하는지 볼 수 있습니다.


Authentication

메시지를 보내려면, 애플리케이션 서버는 하나의 POST 요청을 발행합니다. 예를 들면:

하나의 메시지 요청은 2개의 부분으로 만들어져 있습니다: HTTP 헤더와 HTTP 바디.

HTTP 헤더는 반드시 다음의 헤더들을 포함해야 합니다.:
  • Authorization : key=YOUR_API_KEY
  • Content-Type : applicaiton/json JSON 을 사용하기 위함; application/x-www-form-urlencoded;charset=UTF-8 plain text 를 사용하기 위함. 만약에 Content-Type 이 생략되었다면 메시지 형식이 plain text 라고 다정하게 될 것 입니다.

예를 들면:

Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "data" : {
    ...
  },
}

 HTTP 바디 내용은 여러분이 JSON을 사용했는지 plain text 를 사용했는지에 의존적 입니다. the Server Reference 를 보면 모든 JSON 파라메타들의 목록이나 plain text 메시지 가 포함할 수 있는 목록을 볼 수 있습니다.


Checking the validity of an API key

 만약 메시지들을 보내고 인증 오류들을 받는다면, 여러분의 API 키에 대한 유효성을 검사해야 합니다. 예를 들면, 안드로이드에서, 다음의 명령어를 실행해 보세요.
# api_key=YOUR_API_KEY

# curl --header "Authorization: key=$api_key" \
       --header Content-Type:"application/json" \
       https://gcm-http.googleapis.com/gcm/send \
       -d "{\"registration_ids\":[\"ABC\"]}"

만약 401 HTTP 상태 코드를 받는다면, 여러분의 API 키는 유효하지 않는 것입니다. 반면에 다음과 같은 것을 봐야만 하는데요.:

{"multicast_id":6782339717028231855,"success":0,"failure":1,
"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

만약 여러분이 registration token 의 유효성을 확인받기를 원한다면, 여러분은 “ABC” 를 registration token 로 교체함으로써 수행할 수 있을 것 입니다.


Request Format

이 단락은 어떻게 요청들을 JSON 이나 plain text 형식으로 만드는지를 보여줍니다. 하나의 요청에 포함할 수 있는 필드(속성)들의 완벽한 목록은 Server Reference 를 보세요. 

Send-to-sync

여기에 JSON 을 사용한 가장 작은 가능한 요청(어떤 파라메타도 없고 오직 받는사람만 있는 하나의 메시지)이 있습니다.
{ "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..." }

그리고 plain text 를 사용한 같은 예제가 있습니다.
registration_id=42

Message with payload — notification message

여기에 하나의 notification 메시지가 있습니다.
{ "notification": {
    "title": "Portugal vs. Denmark",
   
"text": "5 to 1"
 
},
 
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

notification 과 data 페이로드로 구성된 메시지들을 사용할 수 있는데요. notification 페이로드들에서 지원되는 키들에 대해서는 Server Referenece 를 보세요.  notification 메시지와  메시지 옵션들에 대한 좀 더 많은 정보에 대해서는, Payload 를 보세요.

Message with payload — data message

여기에 data 페이로드로 된 하나의 메시지가 있습니다.:
{ "data": {
    "score": "5x1",
   
"time": "15:10"
 
},
 
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

여기에는 모든 추가적인 필드(속성)들의 집합으로 된 하나의 메시지가 있습니다.
{ "collapse_key": "score_update",
  "time_to_live": 108,
 
"delay_while_idle": true,
 
"data": {
   
"score": "4x8",
   
"time": "15:16.2342"
 
},
 
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}

그리고 여기에는 plain-text 형식을 사용한 같은 메시지가 있습니다.:
collapse_key=score_update&time_to_live=108&delay_while_idle=1&data.score=4x8&data.time=15:16.2342&registration_id=42 

 만약 여러분의 조직에서 인터넷을 오고 가는 트래픽을 제한하는 방화벽을가지고 있다면, 여러분의 GCM 클라이언트 앱들이 메시지를 받기 위해서 GCM 과의 연결성을 허락하기 위한 설정이 필요합니다. 열어야 하는 포트들이 있는데요: 5228, 5229 그리고 5230 입니다. GCM 은 전형적으로 오직 5228을 사용하는데, 하지만 때때로 5229 와 5230 을 사용하기도 합니다. GCM 은 특정한 IP들만 제공하지 않는데, 그래서 여러분의 방화벽이 외부로 나가는 모든 IP 주소들에 대한 연결들(15169 개의 구글의 ASN 안의 IP 블락 목록들에 포함된)에 대해 받아들일 수 있도록 허락해야만 합니다.


Response format

 메시지를 보내려고 시도했을 때 두 가지 가능한 결과가 있습니다.:
  • 메시지는 성공적으로 처리되었다. HTTP 응답은 200 상태를 가지게 되고, 바디는 메시지의 상태에 대한 더 많은 정보를 가지게 됩니다.
  • GCM 은 요청을 거부한다. HTTP 응답은 200이 아닌 상태 코드를 지니게 됩니다(400, 401 또는 5xx 같은).

하나의 JSON 요청이 성공적일 때(HTTP 상태 코드가 200), JSON 객체가 Downstream HTTP message response body를 담은 채로 반환됩니다. 모든 메시지들에 대한 메시지 ID 값을 로그로 남기는데, 이 경우에 여러분은 구글의 지원이나 GCM diagnotics 를 통해서 메 시지의 문제를 해결해할 필요가 있게 됩니다.

 만약 failure의 값과 canonical_ids이 0이면, 응답의 나머지를 분석할 필요가 없게 됩니다. 반면에, 우리가 추천하는 것은 여러분이 결과 필드(속성)를 통해서 반복하고 다음 목록의 각 객체에 대해 아래에 있는 것을 실해하는 것 입니다:

  • 만약 message_id가 설정되어 있으면, registration_id를 검사하세요.:
    • 만약 registration_id가 설정되면, 여러분의 서버 데이터베이스에서 original ID 를 새로운 값(canonical ID)으로 바꿔줘야 합니다.  알아두어야 할 것이 있는데 original ID 는 결과의 부분이 아닌데, 그래서 여러분은 요청으로 전달된 registration_ids의 목록으로부터 그것을 획득할 필요가 있습니다(같은 인덱스를 사용하는).

  • 그 외에는, error 값을 가지게 됩니다.
    • 만약 에러가 Unavailable 라면, 여러분은 다른 요청으로 메시지를 보내는 것을 다시 시도 할 수 있습니다.
    • 만약 에러가 NotRegistered 라면, 여러분은 서버 데이터베이스로부터 registration ID 를 지워야만하는데 왜냐하면 애플리케이션이 단말기에 설치되지 않았기 때문이거나, 클라이언트 앱이 메시지를 받도록 설정되지 않았기 때문입니다. 
    • 그 외에는, 요청으로 전달된 registration token 에 어떤 문제가 있습니다; 그것은 아마도 회복불가능한 에러일텐데 서버 데이터베이스로부터 그 등록을 제거하기를 요구할 것 입니다. 모든 가능한 에러 값들에 대해서는 Downstream message error reponse codes 를 보세요.

하나의 plain-text 요청이 성공적일 경우에(HTTP 상태 코드가 200), 응답 바디는 key/value 쌍의 형식으로 1 또는 2 줄을 가지고 있습니다. 첫 번째 줄은 항상 이용가능하고 그 내용은 id=ID of sent message 이거나  Error=GCM error code 입니다. 두 번째 줄은, 만악에 이용할 수 있다면, registration_id=canonical ID 의 형식을 가지게 됩니다. 두 번째 줄은 추가적인 것이며, 그리고 첫 번째 줄이 에러가 아닐 때 보내질 수 있습니다. 우리는 JSON 응답을 처리하는 것과 같은 방법으로 plain-text 응답을 처리하는 것을 추천합니다.:

만약 첫 번째 줄이 id 로 시작한다면, 두 번째 줄을 검사하세요:
만약에 두 번째 줄이  registration_id로 시작한다면, 값을 얻을 수 있고 여러분의 서버 데이터베이스의 registration token 을 교체 할 수 있습니다.
그 외에는, Error 값을 받습니다.:
만약 에러 값이 NotRegistered 라면, 여러분의 서버 데이터베이스에서 registration token 을 제거하세요.
그 외에는, 복구할 수 없는 에러들이 있습니다(알아두어야 할 것: Plain-text 요청들은 에러 코드에 대해서 결코 Unavailable를 반환하지 않을 것 이고, 대신에 500 HTTP 상태를 반환하게 될 것 입니다).


Example responses

이 단락은 성공적으로 처리된 메시지들을 나타내는 응답들의 몇 가지 예제들을 보여줍니다. 응답들이 기반이 되는 요청들에 대한 Request Format 을 보세요.

여기는 응답으로 한 받는 사람에게 canonical IDs 없이 성공적으로 보내진 JSON 메시지 의 간단한 경우 입니다. 
{ "multicast_id": 108,
  "success": 1,
 
"failure": 0,
 
"canonical_ids": 0,
 
"results": [
   
{ "message_id": "1:08" }
 
]
}

또는 만약 요청이 plain-text 형식인 경우:
id=1:08

아래에는 3개의 성공적으로 처리된 메시지와 함께 6의 수신자(각각 IDs 4, 8, 15, 16, 23 그리고  42)에 대한 JSON 결과들인데, 1 개의 canonical registration token 이 반환되었으며, 그리고 3개의 에러가 있습니다:
{ "multicast_id": 216,
  "success": 3,
 
"failure": 3,
 
"canonical_ids": 1,
 
"results": [
   
{ "message_id": "1:0408" },
   
{ "error": "Unavailable" },
   
{ "error": "InvalidRegistration" },
   
{ "message_id": "1:1516" },
   
{ "message_id": "1:2342", "registration_id": "32" },
   
{ "error": "NotRegistered"}
 
]
}

이 예제 안에서:
  • 첫 번째 메시지 : 성공, not required.
  • 두 번째 메시지 : 재전송 되어야만 함(to registration token 8).
  • 세 번째 메시지 : 복구할 수 없는 에러(그 값은 데이터베이스에서 오류를 일으키게 될 것 입니다).
  • 네 번째 메시지 : 성공, nothing required.
  • 다섯 번째 메시지 : 성공, 그러나 registration token 이 서버 데이터베이스에서 갱신되어야만 합니다(from 23 to 32).
  • 여섯 번째 메시지 : registration token(42) 는 서버 데이터베이스에서 삭제되어야만 하는데 왜냐하면 애플리케이션이 단말기에서 삭제되었기 때문입니다.

또는 단지 위의 세 번째 메시지가 plain-text 형식을 사용해서 보내졌다면:
Error=InvalidRegistration

만약 위의 다섯 번째 메시지가 plain-text 형식을 사용해서 보내졌다면:
id=1:2342
registration_id=32


Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the Apache 2.0 License. For details, see our Site Policies. Java is a registered trademark of Oracle and/or its affiliates.


반응형
반응형


About GCM Connection Server

https://developers.google.com/cloud-messaging/server

GCM의 서버는 2가지 컴포넌트로 구성되어 있다.
  •  GCM connectoin servers 는 구글에 의해서 제공되어진다. 이서버들은 앱서버로부터의 메시지들을 처리하고 그것들을 앱을 실행중인 장비들로 보낸다. 구글은 HTTP와 XMPP로 연결 서버들을 제공한다.
  •  application server는 당신의 환경에서 구현해야만한다. 이 애플리케이션 서버는 적절하게 XMPP나 HTTP를 사용하여, 선택된 GCM 서버를 통해서 클라이언트 앱으로 데이터를 보낸다.
완벽한 GCM 구현은 클라이언트 구현과 서버 구현 모두를 요구한다. 좀더 많은 클라이언트측면에 대한 정보를 원한다면, 플랫폼별 가이드 문서를 보아라.


Role of the Application Server

GCM을 사용하는 클라이언트 앱을 작성하기 전에, 여러분은 다음의 기준을 충족하는 애플리케이션 서버를 갖춰야만한다.
  • 여러분의 클라이언트와 통신할 수 있어야 한다.
  • GCM connection server 로 형식화된 요청들을 적절하게 보낼 수 있어야 한다.
  • exponential back-off 를 사용하여 요청들과 재전송을 처리할 수 있어야 한다. (http://developers.google.com/api-client-library/java/google-http-java-client/backoff)
  • API 키와 클라이언트 등록 token 을 안전하게 저장할 수 있어야 한다. (Note: 절대 API 키를 클라이언트 코드에 삽입하면 안된다.)
  • XMPP를 위해서, 서버는 클라이언트들이 보내는 각가의 메시지들을 유일하게 식별할 수 있게 메시지IDs를 생성할 수 있어야만 한다. XMPP 메시지 IDs sender ID 당 한 개여야만 한다.
여러분은 앱서버와 GCM서버의 상호작용을 원하는대로 사용할 수 있게 하기 위해서 GCM connection server protocol을 결정할 필요가 있다. Note that 만약에 여러분이 클라이언트 애플리케이션에서 업스트림을 사용하기를 바란다면, XMPP를 사용해야만 할 것이다. 이에 대한 자세한 논의는 Chooging a GCM Connection Server를 보아라.


Choosing a GCM Connection Server Protocol

 현재 GCM은 HTTP와 XMPP의 2가지 연결 서버 프로토콜을 제공하고 있다. 여러분의 앱서버는 프로토콜을 따로따로 사용하거나 한꺼번에 사용할 수 있다. XMPP 메시지처리가 HTTP 메시지처리와 다른 점은 다음과 같다.

  • Upstream/Downstream messages
    • HTTP : Downstream만 가능하며, cloud 에서 device 로 4KB의 데이터를 올릴 수 있다.
    • XMPP : cloud 에서 device 로 device에서 cloud 로 Upstream과 Downstream이 가능하여, 4KB의 데이터를 올릴 수 있다.
  • Messaging(동기 또는 비동기)
    • HTTP : 동기방식. 앱서버는 HTTP POST 요청으로 메시지들을 전달하고 응답을 기다린다. 이 메카니즘은 동기방식이고 응답을 받을 때까지 다른 메시지를 보내기 위한 발송은 차단한다.
    • XMPP : 비동기방식. 앱서버는 지속성있는 XMPP 연결을 통해 full line speed로 클라이언트 앱으로 메시지들을 주고 받을 수 있습니다. XMPP 연결 서버는 비동기적으로 실패 알림(특별한 ACK 그리고 NACK JSON-encoded XMPP 메시지들로 구성된)에 대한 응답을 보낼 수 있습니다.
  • JSON
    • HTTP : JSON 메시지들은 HTTP POST 로 보내진다.
    • XMPP : JSON 메시지들은 XMPP 메시지들로 캡슐화되어진다.
  • Plain Text
    • HTTP : Plain Text 메시지들은 HTTP POST 로 보내진다.
    • XMPP : 지원되지 않는다.
  • Multicast downstream 으로 여러개의 등록 토큰들을 보냅니다.
    • HTTP : JSON 메시지 형식으로 지원된다.
    • XMPP : 지원되지 않는다.


Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the Apache 2.0 License. For details, see our Site Policies. Java is a registered trademark of Oracle and/or its affiliates.


반응형
반응형


Messaging Concepts and Options

https://developers.google.com/cloud-messaging/concept-options

 Google Cloud Messaging APIs는 넓은 범위의 메시지처리 선택사항들과 능력들을 제공한다. 여러분들이 GCM APIs 로 무엇을 할 수 있을지 이해를 돕기 위해서, 이 페이지는 GCM 메시지의 기본적인 요소들을 설명하고 가장 공통적으로 사용되어지는 메시지의 선택사항들의 몇몇에 대해 목록화 했다.


Components of a message

 앱 서버는 the target, the message options, the payload와 같은 기본적인 요소들로부터 하나의 다운스트림 메시지 요청을 만든다. 이런 요소들은 GCM HTTP나 XMPP connection server 프로토콜에서 공통적이다.

Target
 필수사항. 앱서버가 메시지를 보낼 때, 메시지의 목적지를 식별할 수 있는 Target 을 명확히 해야만 한다. ‘to’ 필드를 사용해서 target 을 명확히 한다. 이 필드는 하나의 registration token, topic, notification key(한 단말 그룹으로 보내기 위한) 를 담을 수 있다.

Options
 앱 서버는 클라이언트 앱으로 다운스트림 메시지를 보낼 때 다양한 옵션을 설정할 수 있는데, 예를들면 메시지가 다음 것으로 대체되어야만 하는 것과 같이 말이죠. 메시지 옵션의 전체 목록에 대해서는, 여러분이 선택해서 사용할 HTTP나 XMPP connection server 프로토콜에 대한 참조정보를 보면 됩니다. 공통적으로 사용되는 메시지 옵션들은 아래에 설명되어 있습니다.

Payload
 다운스트림 메시지에 대해서, GCM 은 notification 과 data 두 가지 타입으로 페이로드를 제공합니다. Notification 은 2KB 제한이 있고 사용자가 식별할 수 있는 핵심요소들로 미리정의된 집합의 조건을 가진 경량화된 옵션이 있다. Data 페이로드는 4KB 까지 개인화된 key/value 쌍으로 개발자들이 보낼 수 있게 한다. Notification 메시지는 추가적인 데이터 페이로드를 넣을 수 있는데 사용자가 notification 을 클릭했을 때 전달된다.



User scenario
How to send
Notification
GCM 은  클라이언트 앱 대신에 최종 사용자 단말기에 자동적으로 메시지를 보여준다. Notification은 사용자가 식별할 수 있는 핵심요소들의 미리정의된 집합을 가지고 있다.
notification payload 를 설정한다. 선택적인 데이터 페이로드를  가질 수 있다. 항상 조절할 수 있다.
Data
클라이언트 앱은 메시지들의 데이터를 처리하는 것에 책임이 있다. 메시지들의 데이터는 오직 개인화된 key/value 쌍을 가지고 있다.
오직 data 페이로드만 설정한다. 조절할 수도 있고 조절할 수 없을 수도 있다.

 notifications 를 사용할 때는 GCM이 당신의 클라이언트 앱 대신에 notification을 표시하는 것을 처리하기를 원할 때 입니다. data 메시지를 사용할 때는 안드로이드 클라이언트앱에서 메시지가 표시되거나 처리하는 것을 당신이 다루기 원할 때 입며 또는 당신이 메시지를 직접 GCM connection 으로 iOS 단말기에 메시지를 보내기 원할 때 입니다.

 앱서버는 메시지를 notification 과 data 페이로드 양쪽 모두를 포함해서 전달할 수 있다. 몇가지 경우에서, GCM이 notification 페이로드를 표시하는 것을 다룰수 있고 클라이언트 앱은 data 페이로드를 처리할 수 있다. 더 많은 정보와 예제를 위해선, 다음의 문서를 보세요. (https://developers.google.com/cloud-messaging/concept-options#notifications_and_data_messages)


Notifications and data in the message payload

 Notification은 개발자에게 사용자가 보기 쉬운 전시 메시지(몇몇의 미리 정의된 핵심요소와 선택적 custom key/value 쌍으로 된)를 보내기 위한 쉬운 방법을 제공한다. Data 페이로드는 개발자의 오직 개인화된 key/value 쌍을 포함하고 있고, 클라이언트 앱이 메시지를 처리해야만 한다. 여러분은 notification 과 data 페이로드 모두를 가진 메시지를 보낼 수 있다.

Notification
 notificaiton 을 보내기 위해선,  ’notification’을 알림메시지의 사용자가 이해할 수 있는 부분을 위해서 미리정의된 핵심요소들의 집합으로 설정하는게 필수적이다. 예를들어, 여기 IM 애플리케이션에 JSON 형식으로 된 notification 메시지가 있다. 사용자는 단말기에서 제목으로 “Portugal vs. Denmark” 텍스트로 “great match!” 와 같은 메시지를 볼 수 있다고 기대하고 있다.

{
   
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
   
"notification" : {
     
"body" : "great match!",
     
"title" : "Portugal vs. Denmark",
     
"icon" : "myicon"
   
}
  }

 Notifications 은 랩이 비활성화일 때 알림통(tray)으로 전달됩니다. 활성화 상태인 iOS 앱에 대해서는, notifications 은 ‘didReceiveRemoteNotification:’ 으로 대신 전달되어 진다. 활성화 상태인 안드로이드 랩에 대해서는, notification 페이로드가 데이터 묶음 안의 ‘notification’키 기반으로 onMessageReceived() 에 전달되어 진다.

Data message
 클라이언트 앱에 데이터 페이로드를 전달하기 위해서는 custom key/value 쌍으로 ‘data’ 를 설정해야 합니다. 데이터 메시지는 최대 4KB 의 페이로드를 가질 수 있다. 
 예를 들면, 여기에 위와 같이 똑같은 IM 애플리케이션의 JSON 형식으로 된 notification 메시지가 있는데, 정보는 ‘data’안에 캡슐화되어 있고 클라이언트앱이 내용을 해석하기를 바랄 것이다.

{
   
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
   
"data" : {
     
"Nick" : "Mario",
     
"body" : "great match!",
     
"Room" : "PortugalVSDenmark"
   
},
 
}

안드로이드에서는, 클라이언트 앱이 ‘onMessageReceived()’ 로 데이터 메시지를 받을 것이고 key/value 쌍에 따라서 처리할 수 있을 것이다. iOS 에서는, 메시지를 저장하고 앱이 구동중일때(foreground)만 전달하고 GCM connection 이 성립될 것이다.

Note 좀 더 플랫폼에 특화된 상세내용을을 기록해라.
  • 안드로이드에서는, ‘data’ 페이로드는 액티비티를 실행하기 위해 사용되는 인텐트로 가져올 수 있을 것이다.
  • iOS에서는, ‘data’ 페이로드는 ‘didReceiveRemoteNotification:’ 으로 찾을 수 있을 것이다.

만약에 앱이 백그라운드일 때 iOS 단말기로 custom key/value 로 구성된 메시지를 보내기를 원한다면, ‘data’ 의 key/value 쌍에 'content_available’를 true 로 셋팅하면 된다.

Hybrid messages with both notification and data payload
 메시지를 받았을 때 앱의 행동은 notification 과 data 페이로드 양쪽을 포함하여 앱이 백그라운드이거나 포그라운드인 것에 의존적이다. - 근본적으로, 메시지를 수신한 시간에 앱이 활성화 상태이던지 아니던지간에~ 

  • 백그라운드일 때, 앱은 알림통으로 notification 페이로드를 받고, 오직 notification 을 사용자가 탭했을 때 data 페이로드를 처리할 수 있습니다.
  • 포그라운드일 대, 앱은 notification 이나 data 페이로드 모두를 받을 수 있습니다.

다음의 JSON 형식의 메시지는 ‘notification’ 과 ‘data’ 페이로드 모두를 담을 수 있습니다.

  {
   
"to" : "APA91bHun4MxP5egoKMwt2KZFBaFUH-1RYqx...",
   
"notification" : {
     
"body" : "great match!",
     
"title" : "Portugal vs. Denmark",
     
"icon" : "myicon"
   
},
   
"data" : {
     
"Nick" : "Mario",
     
"Room" : "PortugalVSDenmark"
   
}
 
}


Commonly used message options

이 단원은 간단한 다운스트림 메시지를 보낼 때 가장 공통적으로 사용되는 몇몇 옵션들을 더 자세히 조사합니다 : collapsible messaging(collapsible은 가장 최근의 메시지가 큐안에 있는 이전 메시지를 덮어쓰는 것 입니다.), 다중발송, 메시지 우선순위 그리고 메시지의 수명 설정에 대해서 입니다.

Collapsible and non-collapsible message

Non-collapsible message
 non-collapsible 메시지는 각각의 메시지가 각 단말기로 전달된다는 것을 시사한다.(내포한다.) non-collapsible 메시지는 몇몇 유용한 내용을 전달하는데, 데이터를 가져오기 위해 서버에 접속하는 모바일 애플리케이션에 대해 ‘ping’ 을 하는 것과는 대조적으로 말이죠.
 메시지들은 notification 메시지들을 제외하고 기본적으로 non-collapsible 인데, notification 메시지들은 항상 collapsible 이다. GCM 은 전달 순서를 보장하지 않는다.
 non-collapsible 메시지들의 몇몇 전형적 사용방법으로는 채팅메시지나 중요한메시지들입니다. 예를들어, IM 애플리케이션에서, 당신은 모든 메시지를 전달하고 싶을텐데, 왜냐하면 모든 메시지가 다른 내용을 가지고 있기 때문이죠.
 Note: collapsing 없이 100개의 메시지 제한으로 저장될 수 있다고 봅시다. 만약에 제한에 도달했을 때, 모든 메시지들은 제거될 것입니다. 단말기가 다시 온라인 상태가되면, 제한에 도달했음을 나타내는 메시지를 받을 것입니다. 애플리케이션은 그 상황을 적절하게, 전형적으로 앱서버로부터 전체 동기화 요청에 의해서 처리할 수 있을 것입니다.

Collapsible message
 collapsible 메시지는 메시지가 아직 단말기에 도달하지 않았을 때 같은 collapse key 를 가진 새로운 메시지에 의해서 대체될 수 있다는 것입니다.
collapsible 메시지의 두가지 일반적인 사용 경우는 Send-to-Sync 메시지와 notification 입니다. Send-to-Sync 메시지는 서버로부터의 데이터를 동기화 시키기 위해 모바일 애플리케이션에 말하는 “ping”같은 것 입니다. 한가지 예로 스포츠 애플리케이션에서 사용자의 최종 스코어를 갱신하는 것 입니다. 오직 가장 최근의 메시지만 의미가 있을 것 입니다.
 GCM은 언제든지간에 단말기 당 앱서버에 의해 사용되어지는 최대 4가지의 다른 collapse key들을  사용할 수 있습니다. 다른 말로 하면, GCM connection server 는 각각의 다른 collapse key로 동시적으로 4개의 다른 collapsible Send-to-Sync 메시지들을 한 단말기당 저장할 수 있다는 말이다. 만약에 GCM 이 유지하는 4개의 collapse key를 초과한다면, 어떤 키가 유지될지에 대해서 어떤 보장도 하지 않습니다.

iOS에서, 앱서버가 Send-to-Sync 메시지를 보내야 할 필요가 있을 때 content_available 를 설정해야 합니다. 비활성화된 클아이언트 앱은 백그라운드에서 여러분의 로직을 실행할 것이고, 포그라운드일 경우에는 메시지를 didReceiveRemoteNotification:. 로 메시지를 전달할 것입니다.

Which should I do?
Collapsible 메시지는 성능 관점에서는 좀 더 나은 선택이고, 여러분의 애플리케이션이 non-collapsable 메시지를 사용할 필요가 없게 제공되어집니다. 그러나, 만약 collapsible 메시지를 사용하겠다면, GCM이 최대 4가지의 다른 collpase key에 대해서만 언제든지간에 등록된 토근당 GCM Connection server 에 의해서 사용되어지는 것만 허용합니다. 여러분은 제한된 숫자를 초과해서는 안되는데, 말하자면 예측할 수 없는 결과들을 야기시킬 수 있기 때문입니다.


Use scenario
How to send
Non-collapsible
모든 메시지는 클라이언트 앱에 중요하고 전달되어져야만 한다.
notificaiton 메시지들을 제외하고, 모든메시지들은 기본적으로 non-collapsible 이다.
Collapsible
새로운 메시지가 있을 때 클라이언트 앱에 무관한 메시지는 오래된 메시지로 바꿔버리는데, GCM이 그 오래된 메시지를 교체합니다.
collapse_key 파라메타를 설정하면 됩니다.


Setting the priority of a message

 다운스트림 메시지에 대해서 전달 우선순위를 할당하는 2가지 옵션이 있습니다. 보통 그리고 높은 우선순위. 높음과 보통 우선순위 메시지 전달은 다음과 같이 동작합니다.
  • High Priority. GCM 은 높은 우선순위의 메시지들을 즉시 전달하려고 하는데, GCM 서비스가 가능할 때 그리고 당신의 앱서버로 네트워크 연결을 열었을 때  잠자고 있는 단말기를 깨우는 것을 허용한다. 예를들어, 인스턴스메시지, 채팅, 음성전화알림과 같은 앱들처럼 일반적으로 네트웍연결을 개방할 필요가 있고 GCM 이 단말기로 메시지를 전달하는 것을 보장합니다. 만약에 메시지가 time-critical 하고 사용자의 즉작적인 반응이 요구된다면 높은 우선순위로 설정하고, 조심해야 할 것이 있는데 높은 순위로 메시지를 설정하는 것은 일반 우선순위 메시지들과 비교해서 좀 더 베터리를 닳게 하는 원인이 된다는 것입니다.
  • Nomal Priority. 보통 우선순위는 메시지 전달의 개본 우선순위입니다. 보통 우선순위 메시지들은 잠자고 있는 단말기에 대해서 네트워크 연결을 개방할 필요가 없고, 메지시 전달은 베터리를 아끼기 위해서 지연될 것입니다. 시간에 민감하지 않은 메시지들에 대해서는, 이메일 통지나 다른 데이터를 동기화해야하는 경우처럼 전달 우선순위를 보통으로 선택합니다.

유효한 값은 ‘high’ 와 ’normal’ 입니다. 자세한 내용을 위해서는, HTTPXMPP 에 대한 서버 참조를 보세요.

iOS 클라이언트 앱에선, 보통과 높음이 APNS 우선순위 레벨5와 레벨10이 비슷하다. iOS 명확한 행동에 대한 모든 자세한 내용은, APNs 문서를 보세요. 안드로이드 명확한 행동에 대한 자세한 내용은, Doze 와 App Stanby 에 대한 최적화 문서를 보세요.

여기에 잡지 구독자에게 알리기 위한 보통우선순위 메시지의 예제가 있는데, 새로운 내용을 다운로드 할 수 있다는 것 입니다.
{
 
"to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
 
"priority" : "normal",
 
"notification" : {
   
"body" : "This week’s edition is now available.",
   
"title" : "NewsMagazine.com",
   
"icon" : "new",
 
},
 
"data" : {
   
"volume" : "3.21.15",
   
"contents" : "http://www.news-magazine.com/world-week/21659772"
 
}
}


Setting the lifespan of a message

 GCM 은 일반적으로 메시지들이 보내지면 메시지들을 즉시 전달한다. 그러나, 항상 그런 것은 아닙니다. 예를 들어, 안드로이드 플랫폼의 경우에는, 단말기가 꺼져있거나 인터넷 연결이 안 되어 있을 경우에는 이용할 수 없습니다. 또는 보내는 쪽에서 단말기가 그들 스스로 ‘delay_while_idle’ 플래그를 사용하여 활성화 될 때까지 메시지들이 전달되지 않도록 요청할 것입니다. 마지막으로, GCM은 의도적으로 지나친 리소스 사용과 부정적인 영향을 주는 베터리 수명으로부터 애플리케이션을 보호하기 위해서 메시지들을 지연시킵니다.

 이러한 일어났을 때, GCM은 메시지들을 저장하고 가능한 실행할 수 있게 전달한다. 대부분의 경우에서 메시지 전달이 잘 되는 반면에, 늦은 메시지에 대해서도 잘 전달되지 않는 몇몇의 애플리케이션들이 있을 수 있습니다. 예를 들면, 메시지가 걸려오는 전화나 영상 통화 알림이라면, 그 알림은 전화가 끝나기전까지 짧은 시간에 의미가 있을 것입니다. 또는 특정 메시지가 어떤 이벤트에 초대받았는데, 이벤트가 끝난 후에 알림을 받게 되어 쓸모없을 경우가 있습니다.

 여러분은 ’time_to_live’ 인자를 사용할 수 있는데, HTTP 와 XMPP 요청 모두를 지원하고, 메시지의 최대수명을 명시합니다. 인자의 값은 0부터 2,419,200초 까지고, GCM이 메시지를 저장하고 다시 전달하기를 시도하기 위한 최대시간에 상응합니다. 요청들은 4주라는 최대기간의 기본값의 필드를 포함할 수 없습니다. ??

 여기에 이 기능을 위한 몇몇 사용예시가 있습니다.
  • 걸려오는 전화의 영상통화
  • 이벤트 초대의 파기
  • 달력 이벤트

 메시지의 수명을 정하는 다른 이점은 GCM이 절대 메시지들을 ‘time_to_live’값을 0초로 throttle 하지 않는 다는 것입니다. 다른말로, GCM은 메시지가 전달되어지도록 “지금 즉시 당장” 최선의 노력을 보장한다는 것 입니다. ‘time_to_live’ 값이 0을 가진 메시지들은 즉시전달되어질 수 없다는 것을 명심하고, 그것들은 폐기될 것 입니다. 그러나, 어떤 메시지들은 저장되어질 수 없기 때문에, 알림을 보내기 위한 최고의 대시시간을 제공할 것 입니다.

여기에 TTL을 포함한 JSON형식의 요청에 대한 예제가 있습니다.

{
   
"collapse_key" : "demo",
   
"delay_while_idle" : true,
   
"to" : "xyz",
   
"data" : {
     
"key1" : "value1",
     
"key2" : "value2",
   
},
   
"time_to_live" : 3
 
},

현재, time_to_live 는 iOS에 대한 메시지 알림에 대해서는 지원하지 않습니다.  


Receiving messages from multi-senders.

GCM은 같은 클라이언트 앱으로 메시지를 보내기 위한 다중 parties를 허용합니다. 예를 들어, 어떤 클라이언트 앱이 여러 기고자로 이루어진 기사 서비스를 한다고 가정하고, 그들중 각각이 새로운 기사를 쓸 때 메시지가 보내져야한 하는데요. 메시지가 URL을 포함해서 클라이언트 앱이 기사를 다운로드 할 수 있습니다. 한 장소에서 모든 보내는 동작을 중앙집중화 하는 대신에, GCM은 당신에게 기고자들 각각에게 메시지를 보낼 수 있는 능력을 줄 것 입니다. 

 이게 가능하게 하려면, 각각의 발송서버가 그 자신의 senderID를 생성해야만 합니다. 어떻게 GCM senderID를 획득하는지에 대한 정보에 대해서는 당신의 플랫폼에 대한 클라이언트 문서를 보세요. 등록요청을 했을 때, 클라이언트 앱은 여러번 token을 가져올텐데, 매번 audience field 의 서로 다른 senderID로 가져올 것 입니다. 

 마지막으로, 앱서버에 대응하는 등록토큰을 공유하면(GCM 등록 클라이언트/서버 handshake를 완료하기 위해), 자신의 인증키를 사용해서 클아이언트 앱으로 메시지들을 보낼 수 있습니다.

Note 다중 sender 에는 100개의 제한이 있습니다.


Lifetime of a message

앱서버가 GCM으로 메시지를 올리고 메지시 ID 를 돌려받았을 때, 메시지가 단말기로 이미 전달되었다는 것을 의미하지는 않습니다. 더 정확히 말하면, 전달을 위해 인수가 끝난 것을 의미합니다. 많은 요인들에 의존하여 메시지가 인수되어진 후에 메시지들에게 어떤 일들이 일어날까요.

 최상의 시나리오는,  단말기가 GCM에 연결되었을 때, 그리고 화면이 켜져있으면 거기에는 어떠한 throttling 제한도 없을 것이며, 메시지는 바로 전달될 것 입니다.

단말기가 GCM에 연결되었지만 idle 상태일 때는, 메시지는 ‘delay_while_idle’ 플래그가 true 로 설정되어 바로 전달될 것 입니다. 그 외에는, 메시지들은 단말기가 깨어날 때까지 GCM connection server 에 저장될 것 입니다. 그리고 ‘collapse_key’ 플래그가 한가지 규칙을 수행할 것입니다: 만약에 메시지가 이미 같은 collapse key로 전달을 위해 저장되어있고 기다라고 있다면, 오래된 메시지는 폐기될 것이고 새로운 메시지가 대체할 것입니다. 그러나, collapse_key 가 설정도어 있지 않다면, 새로운 것이나 오래된 것이나 향후 전달을 위해 저장될 것입니다.

 만약에 단말기가 GCM에 연결되어 있지 않다면, 메시지는 연결이 성립될 때까지 저장될 것입니다(collapse key 규칙을 다시 고려하라). 연결이 성립되었을 때,  ‘delay_while_idle’ 플래그가 있음에도 불구하고 GCM은 단말기로 모든 기다리는 메시지들을 전달할 것입니다. 만약에 단말기가 다시 연결되지 않는다면(예를들어어, 단말기가 공장도 초기화 된다면), 결국에 메시지는 타임아웃될 것이고 GCM 저장소에서 폐기될 것입니다. 타임아웃 초기값은 4주인데, ’time_to_live’ 값이 셋팅된 것 이외의 경우가 해당됩니다.

 마지막으로, GCM이 단말기로 메시지를 전달하려고 시도하려느데 앱이 설치되어있지 않을때, GCM은 바로 그 메시지를 폐기시키고 등록토큰을 무효화시킬 것 입니다. 미래에 그 단말기로 메시지를 보내려고 할 때 ’NotRegistered’ 에러를 가지게 될 것 입니다.



Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the Apache 2.0 License. For details, see our Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

반응형
반응형


Google Cloud Messaging: Overview

https://developers.google.com/cloud-messaging/gcm 

 GCM은 개발자로하여금 서버와 클라이언트 사이에서 메시지를 보낼 수 있게 해주는 무료서비스입니다. GCM은 서버에서 앱으로 메시지들을 다운스트림을 할 수 있고 앱에서 서버로 업스트림도 할 수 있습니다.
 예를들어, 하나의 가벼운 다운스트림 메시지는 클라이언트 앱에 통지할 수 있고 새로운 데이터는 서버로부터 가져갈 수 있게 됩니다, 새로운 이메일 알림처럼 말이죠. 즉각적인 메시지처리와 같은 경우에, GCM 메시지는 앱으로 4kb 까지 전달할 수 있습니다. GCM서비스는 메시지들을 큐로 처리하는 모든 것을 다룰 수 있고 클라이언트 앱으로 전달하거나 받을 수 있습니다.(GCM 서비스가 큐형태로 운영된다.)


Architectual Overview

 하나의 GCM 구현은 한개의 구글 연결 서버를 포함하는데, 여러분의 환경에서 한 앱서버는 HTTP 또는 XMPP 프로토콜로 구글연결서버와 상호통신을 하며, 이는 클라이언트 앱과도 마찬가지이다.
<Figure1. GCM Architecure> AppServer <—> GCM Connection Server <—> ClientApp

아래에 어떻게 GCM을 구성하는 컴포넌트들이 상호작용하는지를  보여준다.
  • 구글 GCM Connection Server는 여러분의 앱서버로부터 메시지를 다운스트림하고 그것을 클라이언트 앱으로 전달한다. XMPP 연결서버는 클라이언트 앱으로부터의 메시지를 업스트림 할 수 있게 하여 그것을 여러분의 앱서버로 전달할 수 있게 한다. 더 많은 정보는 About GCM Connection Server.(https://developers.google.com/cloud-messaging/server)
  • 여러분의 앱서버에서, GCM Connection Server 와 통신하기 위해 HTTP 나 XMPP 프로토콜로 구현해야 하다. AppServer는 GCM Connection Server 로 다운스트림 메시지들을 보낸다.; GCM Connection Server는 메시지들을 큐에 넣고 저장한 다음에 그것을 클라이언트 앱으로 보낸다. 만약에 XMPP를 구현해야 한다면, AppServer는 클라이언트 앱으로부터 메시지들을 받을 수 있을 것이다.
  • ClientApp은 GCM을 할 수 있는 클라이언트 앱이다(일 것이다). GCM 메시지들을 받고 보내기 위해서, 앱은 GCM 에 등록되어야만하고 'registration token' 이라고 불리는 유일한 식별자를 가져야만 한다. 어떻게 클라이언트 앱을 구현하는지에 대해 더 많은 정보를 얻으려면, 플랫폼에 대한 문서를 보세요.



Key Concepts
다음의 표는 GCM과 관련된 핵심용어들과 개념들을 요약한 것이다. 이것은 다음의 카테고리들로 나누어진다.
  • Components - GCM에서 주요한 역할을 하는 요소들이다.
  • Credentials - GCM에서 사용되는 IDs 와 tokens 이 모든 위치에서 인증받을 수 있게 하고, 메시지들이 정확한 장소로 갈 수 있게 만들어 준다.

Table 1. GCM components and credentials.

Components

GCM Connection Server
구글 서버들로 AppServer 와 ClientApp 사이에서 메시지를 보내데 관련되어 있다.
Client App
GCM을 할 수 있는 클라이언트 앱으로 여러분의 AppServer와 통신할 수 있다.
App Server
AppServer로 GCM을 구현하는 한 부분으로서 여러분이 만든다. AppServer는 GCM Connection Server를 통해서 클라이언트 랩으로 데이터를 보낸다. 만약에 앱서버가 XMPP프로토콜을 구현했다면, 앱서버도 클라이언트 앱으로부터 업스트림으로 보내진 메시지들을 받을 수 있다.

Credentials

Sender ID
유일한 숫자로된 값이 API 프로젝트를 구성할 때 생성된다.(Google Developer Console 에서 “Project Number”로 주어진다.) Sender ID는 앱서버를 식별하기 위한 등록절차에서 사용되어지는데 허가를 받으면 클라이언트 앱으로 메시지들을 보낼 수 있다.
API Key
API 키는 AppServer에 저장되며 AppServer가 구글 서비스로 접근하는 권한을 가지게 한다. HTTP 를 사용할 때, API 키는  보내는 메시지의 POST요청헤더에 포함되어 진다. XMPP 를 사용할 때,  API 키는 SASL PLAIN 인증요청에서 연결을 인증하기 위한 패스워드로 사용된다. 
Application ID
Client App은 메시지를 수신하려면 등록되어야한다. 어떻게 구현되는지는 플랫폼에 의존적이다.
  • Android : app manifest 의 패키지이름을 사용한다.
  • iOS : App 의 번들 식별자를 사용한다.
  • Chrome : 크롬 확장 이름을 사용한다.
Registration Token
하나의 ID가 GCM Connection Server에 의해서 client app 으로 발급되는데 앱이 메시지를 받을 수 있도록 한다. 등록된 토큰은 보안을 유지해야 합니다.



Lifecycle Flow

  • GCM을 사용할 수 있게 등록한다. 클라이언트 앱의 한 인스턴스는 메시지들을 받으려면 등록해야 합니다. 좀 더 많은 논의를 보려면 다음의 문서를 보세요.https://developers.google.com/cloud-messaging/registration
  • 다운스트림 메시지들을 보내고 받는다.
    • 메지시 보내기. 앱서버는 클라이언트앱으로 메시지를 보낸다.
      1. 앱서버가 GCM connection server 로 메시지를 보낸다.
      2. GCM connection server 는 만약에 단말기가 오프라인이면 메시지를 큐에 넣고 저장한다.
      3. 단말기가 온라인일 때, GCM connection server 는 단말기로 메시지를 보낸다.
      4. 단말기에서 클라이이언트 앱은 플랫폼의 특별한 구현에 따라서 메시지를 받는다. 
    • 메시지 받기. 클라이언트 앱은 GCM connection server 로부터 메시지를 받는다. 어떻게 클라이언트 앱이 각자의 환경에서 앱이 받은 메시지들을 처리하는 것과 같은 자세한 내용에 대해서는 특정 플랫폼 문서를 확인하세요.
  • 업스트림 메시지들을 보내고 받는다. 이 기능은 XMPP Connection Server 를 사용할 때만 이용할 수 있다.
    • 메시지 보내기. 클라이언트 앱은 앱서버로 메시지들을 보낼 수 있다.
      1. 단말기에서 클라이언트 앱은 XMPP Connection server 로 메시지들을 보낼 수 있다. 어떻게 클라이언트 앱이 XMPP 를 통해서 메시지를 보내는지를 자세히 알려면 여러분 플랫폼의 특별한 문서를 보세요.
      2. XMPP Connection Server 는 서버가 연결되어 있지 않을 때 메시지를 큐에 넣고 저장한다.
      3. 앱서버가 다시 연결되었을 때, XMPP Connection server는 메시지를 앱서버로 전달한다.
    • 메시지 받기. 앱서버는 XMPP Connection Server로부터 메시지를 받은 다음에 다음 내용을 수행한다.
      1. 클라이언트 앱 발송정보를 확인하기 위해 메시지 헤더를 분석한다.
      2. 받은 메시지를 알려주기 위해서 XMPP Connection Server 로 “ack”를 보낸다.
      3. 추가적으로 메시지 페이로드를 분석한다, 클라이언트 앱에 정의된대로~

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License, and code samples are licensed under the Apache 2.0 License. For details, see our Site Policies. Java is a registered trademark of Oracle and/or its affiliates.


반응형

+ Recent posts