Dev./Android

like miller 2012. 7. 18. 17:20

이 글을 작성하는 이유는 가이드가 영어로 되어 있고 또한 가이드가 약간 틀린 부분이 있다.

(제가 테스트 해본 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은 어플리케이션 단위로 적용가능한거로 알고있는데요 하나의 Project ID에 여러개의 API Key 가 생성이 되던데 그렇게 생성하면 여러개의 어플리케이션을 하나의 Project ID로 돌릴 수 있나요?
네~ 상관없습니다. ProjectID와 API KEY는 1개여도 여러 앱에 GCM을 보낼 수 있습니다.

결국 GCM을 보내는건 구글 서버이고 API KEY와 ProjectID로 해당 regID로 GCM을 보낼 수 있냐를 결정하게 되겠죠

GCM을 받은 단말에서는 GCM을 수신할 regID로 앱을 구별하여 해당 앱에 메시지를 전달합니다.
그 말씀은 곧 IP 제한을 두지 않을 거면 API KEY를 따로 생성할 필요 없이 하나의 API 키로 여러 어플리케이션에 등록이 가능하다는 말씀이신거죠..?ㅎㅎ
그럼 CGM은 하나의 API Key와 여러 RegID 를 복합적으로 사용해서
일괄적인 메세지를 여러 어플리케이션에 보내는게 가능한가요?
자신이 만든 여러 앱의 사용자 정보 DB를 통합 검색하여 reg id를 값을 가져온다면 여러개의 앱에 GCM을 보낼 수 있습니다.
유용하고 소중한 정보 감사합니다. 정말 많은 도움이 됐습니다.
감사합니다 ^^
소중한 자료 감사합니다. 퍼갈께요~
이게 무료서비스 인가요?
daou쪽에 스마트푸시는 먼가요?? 푸시 1건당 1원이라는데....;;;
네. 무료서비스 입니다.
다우의 스마트 푸시는 해당 업체에서 만든 푸시 솔루션이겠죠.

GCM은 구글에서 안드로이드 푸시를 위해 만든 기술입니다.
푸시서버 구축 하는데 시간은 어느 정도 걸리나요? 저희개발자는 15일 걸린다고 하는데.. 이해가 안가서 ㅠㅜ
푸시 서버의 개발 내용에 따라 다르겠지요. 개발 내용을 모르고 단순히 어느정도 걸린다고 말씀드릴 순 없네요.
final String regId = GCMRegistrar.getRegistrationId(this);
이거 쓰면 regid가 공백으로 나와서 기계 이름을 모르겟어요..
gcm 서비스를 단말에서 등록하기 전까지는 registration ID 값이 할당되지 않습니다.

즉, 앱 설치 후 처음 실행하여 등록된 값이 없다는 뜻이죠.

이 경우 GCMRegistrar.register 메소드를 통해서 등록을 하면 GCMIntentService 를 통해서 등록 결과를 받을 수 있게 됩니다.
감사합니다 ㅎ
좋은글 감사 합니다.
안드로이드 스튜디오에서작업하는데요 모든 gcm 코드를 돌려봐도 도대체 해결이 되지않네요 manifest랑 코드 문제가 없는데 도대체 무슨 문제인지 알수가 없네요ㅜㅜ 로그는 이렇게 뜨는데 무슨 문제인가요 ㅜㅜ

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)
manifest에 receiver 등록 하신건가요?