푸쉬 알림 기능. GCM (Google Cloud Messaging) 사용하기 (1)

by 조쉬 posted Jul 16, 2015
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄


 


 



 안드로이드 푸쉬 알림 기능 Google Cloud Messaging 사용하기

 




앱을 만드는데 빠질 수 없는 기능이 바로 '푸쉬 알림'입니다. 푸쉬 알림의 대표적인 예라면 카카오톡에서 새로운 메시지가 왔을 때 폰 중앙에 나타나고, 상단 바에 표시되는 기능입니다. 이런 푸쉬기능을 제가 만드는 앱에 집어넣으려고 하는데, 제가 원하는 예제가 구글링해도 없길래 안드로이드 개발자 사이트에 있는 예제를 직접 해보려고 합니다.



 http://developer.android.com/google/gcm/index.html  개발자 홈페이지 링크

 





 시작하기 전에

 


 


GCM 예제를 시작하기 전에 GCM을 내가 만든 앱에서 사용하기 위해 준비해야 할 것이 있습니다. 바로 Project Number와 API 키입니다. 구글 개발자 창에 들어가서 프로젝트를 만들고 GCM을 사용하도록 설정해야 합니다.



 https://console.developers.google.com

 






접속하면 위와 같은 화면이 나오는데, CREATE PROJECT를 선택하면 새 프로젝트를 만들 수 있습니다. 







프로젝트를 만들면 고유의 프로젝트 ID와 번호를 주는데 우리가 필요한 건 바로 이 번호입니다. 그다음은 GCM API를 프로젝트에 등록합니다. 프로젝트를 선택하고 APIs & auth 를 선택해 APIs 에 들어가면 API 목록이 나옵니다. 







위와 같이 on으로 되어있는 것은 사용할 수 있는 API이고, OFF로 되어있는 것은 사용하지 못하는 API입니다. 스크롤을 아래로 내리면 Google Cloud Messaging for Android를 찾을 수 있습니다. OFF를 선택해서 on으로 바꿉니다.


그다음 왼쪽 메뉴에서 Credentials를 선택합니다. Public API access 아래 있는 CREATE NEW KEY를 선택하면 API key를 받을 수 있습니다.




프로젝트 ID와 API key를 잘 적어둡니다. 이걸로 준비는 끝-





  이클립스로 안드로이드 프로젝트 만들기

 




  1. 매니페스트 파일 수정하기

 



GCM를 사용해서 만들 예제 프로젝트를 만듭니다. 


제일 처음에는 매니페스트 설정입니다. 사용하는 매니페스트에 다음 코드를 추가합니다.


<manifest package="com.example.gcm" ...>

   
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17"/>
   
<uses-permission android:name="android.permission.INTERNET" />
   
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
   
<uses-permission android:name="android.permission.WAKE_LOCK" />
   
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

   
<permission android:name="com.example.gcm.permission.C2D_MESSAGE"
       
android:protectionLevel="signature" />
   
<uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />

   
<application ...>
       
<receiver
           
android:name=".GcmBroadcastReceiver"
           
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=".GcmIntentService" />
   
</application>

</manifest>


유저 퍼미션에서 몇 개는 4.0 이후 버전에서는 적지 않아도 되지만, 그래도 만약을 위해 다 적읍시다. <receiver>는 <application> 안에 넣으면 됩니다. 위에 com.example.gcm 은 자기 패키지를 대입하셔야 합니다.




  2. GCM 클라이언트 만들기

 




GCM은 서버와 클라이언트로 나누어져 있습니다. 서버는 메시지를 보내는 역할이고 클라이언트는 메시지를 받는 역할입니다. 앱으로 푸쉬알림을 보낼 때, 앱은 클라이언트가 되고, 서버는 웹 프로그램이 될 수도 있고, 다른 앱이 될 수도 있고, 자바 프로그램일 수도 있습니다. 즉 서버는 어떤 것으로 만들어도 제약이 없다는 것이죠. 구글 클라우드에 요청만 보낼 수 있으면 서버 역할을 할 수 있습니다. JSP나 앱을 이용해 서버를 만드는 방법도 있지만 여기서는 간단하게 자바를 이용해 서버를 만들었습니다. 


클라이언트는 앱이기 때문에 안드로이드 앱에 GCM을 받는 코드를 추가합니다. GCM을 받는 GCMBaseIntentService를 Extends 하는 클래스를 하나 만듭니다. 아래 jar 파일을 다운받은 뒤 프로젝트 빌드 path에 추가해야 합니다.



 

gcm.jar


 



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
package com.cho.gcmz;
 
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
 
import com.google.android.gcm.GCMBaseIntentService;
public class GCMIntentService extends GCMBaseIntentService {
 
private static void generateNotification(Context context, String message) {
 
int icon = R.drawable.ic_launcher;
long when = System.currentTimeMillis();
 
 
NotificationManager notificationManager = (NotificationManager) context
.getSystemService(Context.NOTIFICATION_SERVICE);
 
Notification notification = new Notification(icon, message, when);
 
String title = context.getString(R.string.app_name);
 
Intent notificationIntent = new Intent(context, MainActivity.class);
 
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP 
        | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent intent = PendingIntent.getActivity(context, 0,
notificationIntent, 0);
 
 
 
notification.setLatestEventInfo(context, title, message, intent);
 
notification.flags |= Notification.FLAG_AUTO_CANCEL;
 
notificationManager.notify(0, notification);
 
}
 
@Override
protected void onError(Context arg0, String arg1) {
 
}
 
@Override
protected void onMessage(Context context, Intent intent) {
 
String msg = intent.getStringExtra("msg");
Log.e("getmessage""getmessage:" + msg);
generateNotification(context,msg);
 
}
 
 
 
@Override
 
protected void onRegistered(Context context, String reg_id) {
Log.e("키를 등록합니다.(GCM INTENTSERVICE)", reg_id);
}
 
 
 
@Override
 
protected void onUnregistered(Context arg0, String arg1) {
Log.e("키를 제거합니다.(GCM INTENTSERVICE)","제거되었습니다.");
}
 
}
 



generateNotification 메소드는 GCM에서 알림이 왔을 때 폰에 표시하기 위한 기능을 담고 있습니다. GCMBaseIntentService 에 포함된 메소드는 아닙니다. 기본적으로 GCMBaseIntentService 를 만들면 4가지 필수 메소드를 오버라이드 합니다. 



 onError 

  에러가 발생할 경우

 onMessage

  GCM에서 메세지를 받은 경우

 onRegistered

  기기를 등록할 경우

 onUnregistered

  기기를 해지할 경우

 



실질적으로 GCM에서 메시지를 받는 부분은 onMessage 입니다. 하지만 메시지를 받는다고 자동으로 폰에 알림이 되는 것은 아니고, 메시지를 받았을 때 액션을 onMessage 메소드 안에 정의 해주시면 됩니다.


등록과 해지는 앱이 실행되고 있는 단말기를 구글 클라우드 서비스에 등록하는 기능입니다. GCM 서비스를 이용하기 위해서는 단말기가 우리가 만든 프로젝트에 등록된 기기여야 하는데, 아까 받은 프로젝트 ID를 통해 기기를 등록할 수 있습니다. 기기를 등록할 때 기기 고유의 등록 ID를 받게 되는데, 이 ID를 통해 서버 측에서 메시지를 보낼 수 있습니다. 


예제에서는 하나의 안드로이드 기기에서 테스트를 하므로 등록 ID 관리가 쉽지만, 나중에 앱 스토어에 배포하게 될 앱을 만들게 되면, 등록 ID를 관리하는 데이터베이스를 만들어야 합니다. 이것은 서버를 만드는 글에서 자세히 설명하겠습니다.


GCM 서비스를 받는 클래스는 만들었고 이제 이 서비스를 실행하고 프로젝트 ID를 등록하는 메인 액티비티를 만듭니다.



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
package com.cho.gcmz;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
 
import com.google.android.gcm.GCMRegistrar;
 
public class MainActivity extends Activity {
 
@Override
 
public void onCreate(Bundle savedInstanceState) {
 
super.onCreate(savedInstanceState);
 
setContentView(R.layout.activity_main);
 
registerGcm();
 
}
 
 
public void registerGcm() {
 
GCMRegistrar.checkDevice(this);
GCMRegistrar.checkManifest(this);
 
final String regId = GCMRegistrar.getRegistrationId(this);
 
if (regId.equals("")) {
GCMRegistrar.register(this"프로젝트 ID" );
else {
Log.e("id", regId);
}
 
}
 
}



GCM에 등록하는 메소드 registerGcm을 만들었습니다. 프로젝트 ID에는 아까 얻은 숫자로 구성된 프로젝트 ID를 적으시면 됩니다. 기기가 등록되어 있으면 Log를 통해 기기의 등록 ID가 표시됩니다. 코드를 실행시키면 log창을 통해 기기의 등록 ID를 확인할 수 있습니다.








옆에 길~게 나온 것이 전부 등록 ID입니다. 나중에 서버 쪽 프로그램을 만들 때 필요합니다.


이제 클라이언트는 다 만들었습니다. 클라이언트 앱을 실행하면 자신의 기기를 프로젝트 ID를 이용해 등록하고, 등록 ID를 받아옵니다. 한번 등록한 기기는 같은 등록 ID를 사용하기 때문에 재등록할 필요가 없습니다. 앱을 한번 실행시키고 등록 ID를 이용해 서버 쪽에서 메시지를 보낼 수 있습니다.


서버 쪽 프로그램 만드는 것은 다음 글에서 다루도록 하겠습니다.