이 글을 작성하는 이유는 가이드가 영어로 되어 있고 또한 가이드가 약간 틀린 부분이 있다.
(제가 테스트 해본 2012/7/16 에는 잘못되었는데 지금은 수정되었다.)
그래서 가이드를 보고 잘 하는 사람이 있는 반면 잘 못하는 사람도 있다.
누구나 이 글을 보고 따라하면 할 수 있도록 step by step으로 작성한다.
GCM(Google Cloud Messaging for Android) 이란?
서버에서 안드로이드 단말의 앱에 데이터를 전송하는 서비스이다. 즉, 푸시서비스이다.
전에는 C2DM이라는 푸시 서비스가 존재했다. 하지만 2012 구글 I/O에서 젤리빈과 함께 GCM 서비스가 공개되었다. 앞으로는 C2DM 의 신규 서비스 신청을 받지 않고 GCM을 이용해야 한다.
C2DM 서비스를 종료하는 것은 아니지만 GCM으로 migration 하는 것을 권장하고 있다.
*GCM 소개 : http://developer.android.com/guide/google/gcm/index.html
GCM 서비스 신청하기
*가이드 문서 : http://developer.android.com/guide/google/gcm/gs.html
1. 먼저 Google APIs Console 페이지로 이동한다. (로그인 안되어 있으면 로그인 하기)
2. 구글 api를 사용한 적이 없으면 아래와 같은 화면이 나온다. 그러면 Create Project 버튼을 누른다.
3. 프로젝트를 생성을 하면 왼쪽 메뉴 중 Overview 로 이동한다. 그 후 Project ID를 등록한다.
또한 구글 API를 사용한 적이 있다면 아래와 같은 화면이 나올 것이다.
만약 Project ID가 등록 안되어 있으면 등록을 해야 한다.
Project ID를 등록 하였으면 아래처럼 나올 것이다.
4. 그러면 왼쪽 위에 있는 Google apis 로고를 클릭하여 새로고침을 한다.
그 후 브라우저의 URL 주소를 잘 보자.
아마도 [https://code.google.com/apis/console/#project:긴 번호] 이러한 형식일 것이다.
#project: 이후의 숫자를 잘 적어놓자. 단말에서 GCM등록할 때 필요한 값이다.
5. 왼쪽 메뉴 중 Servies 메뉴로 이동 후 GCM 서비스를 활성화 시킨다.
6. GCM 서비스를 활성화 시켰으면 왼쪽 메뉴 중 API Access 메뉴로 이동한다.
그리고 Create new Server key 버튼을 누른다
7. 버튼을 누르면 조그만 창이 나온다. 그러면 아무것도 하지말고 create 버튼을 누른다.
*만약 특정 서버만 허용을 할 것이면 버튼 위에 있는 Accpet request from these server IP addresses: 공간에 서버 IP를 적으면 해당 서버만 허용한다.
*아무것도 적지 않으면 모든 ip 서버를 허용한다.
8. 서버 키가 생성되면 해당 키를 잘 적어놓는다. 서버에서 단말로 푸시를 보낼때 사용되는 값이다.
생성된 키는 언제든지 지우거나 새로 생성할 수 있다.
아래와 같은 화면이 나오면 서비스 신청은 끝났다.
신청 후 중요한 것은 2가지 이다.
단말에서 GCM 등록을 위한 값(SEND_ID)
- 프로젝트 ID를 등록하면 URL 주소가 변경되는데 url 주소 마지막 #project: 이후의 숫자
서버에서 단말에 푸시를 보낼때 사용하는 값 (SERVER_KEY)
- API Access 에서 Create Server key를 누르면 생성되는 API key 값
결국 GCM을 보내는건 구글 서버이고 API KEY와 ProjectID로 해당 regID로 GCM을 보낼 수 있냐를 결정하게 되겠죠
GCM을 받은 단말에서는 GCM을 수신할 regID로 앱을 구별하여 해당 앱에 메시지를 전달합니다.
그럼 CGM은 하나의 API Key와 여러 RegID 를 복합적으로 사용해서
일괄적인 메세지를 여러 어플리케이션에 보내는게 가능한가요?
daou쪽에 스마트푸시는 먼가요?? 푸시 1건당 1원이라는데....;;;
다우의 스마트 푸시는 해당 업체에서 만든 푸시 솔루션이겠죠.
GCM은 구글에서 안드로이드 푸시를 위해 만든 기술입니다.
이거 쓰면 regid가 공백으로 나와서 기계 이름을 모르겟어요..
즉, 앱 설치 후 처음 실행하여 등록된 값이 없다는 뜻이죠.
이 경우 GCMRegistrar.register 메소드를 통해서 등록을 하면 GCMIntentService 를 통해서 등록 결과를 받을 수 있게 됩니다.
05-18 22:06:38.219 31368-31368/com.example.park.studiogcm E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.park.studiogcm/com.example.park.studiogcm.MainActivity}: java.lang.IllegalStateException: No receivers for action com.google.android.c2dm.intent.RECEIVE
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
at android.app.ActivityThread.access$700(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.IllegalStateException: No receivers for action com.google.android.c2dm.intent.RECEIVE
at com.google.android.gcm.GCMRegistrar.checkReceiver(GCMRegistrar.java:182)
at com.google.android.gcm.GCMRegistrar.checkManifest(GCMRegistrar.java:169)
at com.example.park.studiogcm.MainActivity.onCreate(MainActivity.java:21)
at android.app.Activity.performCreate(Activity.java:5206)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
at android.app.ActivityThread.access$700(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
at dalvik.system.NativeStart.main(Native Method)