괴도군의 블로그

[Android] GCM HTTP 테스트하기 / 구현하기 (2016 최신) 본문

#프로그래밍/Android

[Android] GCM HTTP 테스트하기 / 구현하기 (2016 최신)

괴도군 2016. 1. 29. 14:48
반응형

서버없이 테스트겸..

간단하게 정리해봅니다.

GCM에 등록하는 소스는 다음과 같구요.. (앱 켜자마자 등록하게 되어있습니다.)

1. 앱설정

제일먼저.. 구글플레이 서비스 라이브러리를 추가하겠습니다.

(예전에는 sdk에 샘플에 들어있는 라이브러리 파일을 직접 import한다든지.. 귀찮은 방법들이 많았는데 제일 간단하고 쉽습니다.)
gradle설정으로 직접해주실분들은.. 
자신의 앱의 build.gradle파일에 추가해주세요 (sync하는거 잊지마시구요..)

1
2
3
4
5
6
7
dependencies {    
    ... 
    compile 'com.google.android.gms:play-services-identity:8.3.0'
    compile 'com.google.android.gms:play-services-plus:8.3.0'
    compile 'com.google.android.gms:play-services-gcm:8.3.0'
    ...
}
cs

2. 앱소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class MainActivity extends Activity 
{    
    static final String TAG = "MainActivity";    
    String rid;    
    String senderId = "191143026205";    // 프로젝트 넘버입니다. 아래 설정부분 따라가보시면 얻는곳이 있습니다.
      
    @Override    
    protected void onCreate(Bundle savedInstanceState) {        
    super.onCreate(savedInstanceState);        
    setContentView(R.layout.activity_main);
 
    //        unregist();            
    regist();    
    }    
 
    private void regist() {        
        new AsyncTask<Void, Void, String>() {            
            @Override            
            protected String doInBackground(Void... params) {                
                String msg = "";                
                Log.d(TAG, msg);                
                try {                    
                    InstanceID instanceID = InstanceID.getInstance(getApplicationContext());                    
                    rid = instanceID.getToken(senderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);                    
                    //instanceID.deleteToken(rid,GoogleCloudMessaging.INSTANCE_ID_SCOPE);                    
                    msg = "Device registered, registration ID= " + rid;                    
                    //발급받은 토큰을 server로 저장하는 함수 (미구현)                    
                    //RegistToServer();                    
                    //발급 받은 토큰을 Sharedpreference로 저장 (미구현)                    
                    //storeRegistrationId(context, regId);                    
                    Log.d(TAG, msg);                
                } catch (IOException ex) {            
                msg = "Error :" + ex.getMessage();                
                }                
            return msg;            
            }
        }.execute(nullnullnull);
    }    
 
    private void unregist() {        
        new AsyncTask<Void, Void, String>() {            
            @Override            
            protected String doInBackground(Void... params) {                
                String msg = "";                
                Log.d(TAG, msg);                
                try {                    
                    InstanceID instanceID = InstanceID.getInstance(getApplicationContext());                    
                    instanceID.deleteInstanceID();                    
                    msg = "Device unRegistered";                    
                    //server에 토큰 삭제 요청 (미구현)                    
                    //unRegistToServer();                    
                    //Sharedpreference로 저장된 토큰 제거 (미구현)                    
                    //deleteRegistrationId(context, regId);                                
                    Log.d(TAG, msg);                
                } catch (IOException ex) {                    
                msg = "Error :" + ex.getMessage();                
                }                
            return msg;            
            }        
        }.execute(nullnullnull);    
    }
}
 
cs

그리고 푸시를 받는부분..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyGcmListenerService extends GcmListenerService {
    static final String TAG = "MyGcmListenerService";
    @Override
    public void onMessageReceived(String from, Bundle data) {
        String title = data.getString("Hello");
//        String text = data.getString("text");
 
        Log.d(TAG, "From: " + from);
        Log.d(TAG, "data: " + data);
        Log.d(TAG, "Title: " + title);
//        Log.d(TAG, "Text: " + text);
 
        //from is sender id
        //data is datas
    }
}
 
cs

그리고 푸시토큰이 변경되었을때에 실행되는 부분..
1
2
3
4
5
6
7
public class MyInstanceIDListenerService extends InstanceIDListenerService {
    @Override
    public void onTokenRefresh() {
        //send new registration token to app server
    }
}
 
cs

AndroidManifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.t5online.test">
 
    <permission android:name="my_app_package.permission.C2D_MESSAGE" 
android:protectionLevel="signature" />
 
    <uses-permission android:name="my_app_package.permission.C2D_MESSAGE" />
 
    <!-- GCM messages 수신하기 위해서 -->
 
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
 
    <!-- 인터넷 접속 -->
 
    <uses-permission android:name="android.permission.INTERNET" />
 
    <!-- 구글계정 접근 -->
 
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
 
    <!-- 메시지 수신하려면 절전모드로 가면 안됨 -->
 
    <uses-permission android:name="android.permission.WAKE_LOCK" />
 
    <application
        android:name=".MainApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:windowSoftInputMode="stateHidden|adjustResize">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
        <!-- 꼭 등록해놔야하는 GcmReceiver -->
        <receiver
            android:name="com.google.android.gms.gcm.GcmReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <category android:name="com.example.gcm" />
            </intent-filter>
        </receiver>
 
        <service
            android:name=".gcm.MyGcmListenerService"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            </intent-filter>
        </service>
 
        <service
            android:name=".gcm.MyInstanceIDListenerService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.android.gms.iid.InstanceID"/>
            </intent-filter>
        </service>
 
    </application>
 
</manifest>
 
 
 
cs

그리고..

여기까지가 앱입니다..


3. GCM API 신청방법

GCM 사용을 위해 프로젝트 등록과.. api 신청을 해야합니다. 아래 주소로 접속. 

https://console.developers.google.com


또는... 간단한 방법이 있네요

https://developers.google.com/cloud-messaging/android/client 여기서 순서대로 진행하시면 됩니다.. 

sender id와 api key를 쉽게줍니다. json파일은 보관용..

1. 프로젝트 생성버튼클릭

2. 이름 정하고 만들기

3. 여기가 중요합니다..  프로젝트 번호를 따로 저장해둡니다. (위에서 설정해야하는 sender id 입니다.)

4. api신청하러 갑니다.

5. Cloud Messageing for Android 클릭

6. api사용설정 클릭

7. 사용자 인증정보로 이동

8. api호출 위치를 웹서버로 합니다. (보통의 서버로 호출하는경우도 같습니다. )



9. api키도 적어둡니다. 호출시에 필요합니다.


4. 테스트

구글 크롬을 설치하시고.. 주소창에 chrome://apps/ 를 치거나.. 북마크바의 앱을 들어가시면

(  https://chrome.google.com/webstore/category/apps?utm_source=chrome-ntp-icon )

웹스토어가 있습니다 클릭하시면 위 url로 이동하게 되는데

검색창에 rest라고 적고 검색하면 여러 rest 클라이언트가 나오는데 저는 advanced REST client를 사용합니다.

아참.. 먼저 앱설정을 다 마치셨다면 sender id(프로젝트 넘버)를 적어주시고 앱을 실행시켜주세요.

위와같이 로그들이 나오게 될텐데.. 

W/InstanceID: token: fufTl3YKUZE:APA91bGrwf0mFqa0thYbg8CK94S2y6rR2-R7Si98ZUIjc180N0acKurPPsG0u_F4bjWrBg9FGdVT2PvH23r2i_HvmtE6PtYoDKNxpvanVfTNu0A9xvKy8eWo1zSBYtk367ideD9pdZoS

D/MainActivity: Device registered, registration ID= fufTl3YKUZE:APA91bGrwf0mFqa0thYbg8CK94S2y6rR2-R7Si98ZUIjc180N0acKurPPsG0u_F4bjWrBg9FGdVT2PvH23r2i_HvmtE6PtYoDKNxpvanVfTNu0A9xvKy8eWo1zSBYtk367ideD9pdZoS


단말을 GCM에 등록하게되면 토큰을 줍니다. 위와같이 내부에서도 한번찍어주고있고 제가 올린소스에서도 한번 찍고주고있습니다.

자신의 앱에서 나온 토큰값을 복사해주시고.. 아래에 테스트호출에 사용하시면됩니다.

먼저.. 처음이신분은 무슨화면인가 싶으실텐데 아까 설치하신 advanced REST Client 입니다. 

화면과 같이 똑같이 입력해주세요 

https://android.googleapis.com/gcm/send

Content-Type: application/json

Authorization:key=

1
2
3
4
5
6
7
8
{
  "registration_ids" : [""],
 
  "data": {
    "Hello" : "World"
  } 
}
 
cs


API신청할때 키값이 생성되었죠? 그걸 key=다음에 공백없이 써주시고

아래의 payload창에 나와있는 Token적는곳에 로그로 나온 토큰값을 붙여넣어주시면됩니다. 그리고 샌드를 누르면..

이와같이 테스트가 가능합니다.. 단말에서 직접 푸시를 로그로 확인하실수 있습니다.

카톡처럼 알림구현은 직접 Notification를 구현하셔야합니다.

참고: http://berabue.blogspot.kr/2015/03/android-notification.html


푸시 호출하는 내용의 옵션들을 알고싶으시다면..

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

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

http://eun-sung-hun.blogspot.kr/2015/01/gcm-server.html

http://www.icelancer.com/2015/02/google-cloud-messaging-gcm-3.html

http://blog.saltfactory.net/android/implement-push-service-via-gcm.html

반응형
Comments