Android
2018.09.23 / 16:00

Android¿¡¼­ FCM Ǫ½Ã »ç¿ëÇϱâ

hangawee
Ãßõ ¼ö 248

Android¿¡¼­ Ǫ½Ã ¾Ë¸²À» ±¸ÇöÇÏ·Á¸é?

Àü¿¡ ÇÏ´ø ÇÁ·ÎÁ§Æ®¿¡¼­ ¾Èµå·ÎÀ̵å¿Í ¼­¹ö°£ÀÇ Çª½Ã ¾Ë¸²À» ±¸ÇöÇÏ¿´½À´Ï´Ù.
ÀÌ°É Çѹø Á¤¸®Çؼ­ ¹®¼­È­ ÇØ¾ß ÇßÁö¸¸ ½Ã°£ÀÌ ¾ø¾î¼­ Á¤¸®¸¦ ¸øÇÏ´Ù°¡ À̹ø ±âȸ¸¦ ÅëÇØ Æ÷½ºÆÃÀ» ÇÏ¿© Á¤¸®ÇÏ·Á ÇÕ´Ï´Ù.


À§ À̹ÌÁö´Â FCM »çÀÌÆ®¿¡¼­ °¡Á®¿Â °ÍÀε¥, À̹ÌÁö¿¡¼­ º¸´Â °Íó·³ Ǫ½Ã ¼­ºñ½º¸¦ ±¸ÇöÇÏ·Á¸é ¸ð¹ÙÀÏÃø ±¸Çö°ú
Ǫ½Ã ¸Þ¼¼Áö¸¦ °ü¸®ÇÏ´Â ¼­¹ö Ãø µÎ °¡Áö¸¦ ±¸ÇöÇØ¾ß ÇÕ´Ï´Ù. (GUI´Â Á¦¿ÜÇϵµ·Ï ÇÏ°Ú½À´Ï´Ù.)

À̹ø Æ÷½ºÆÿ¡¼­´Â FCMÀ» ¾Èµå·ÎÀ̵忡 Àû¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.


¾Èµå·ÎÀ̵忡¼­ FCM ¼³Á¤Çϱâ

¼³Á¤ÇÏ´Â °ÍÀº °ø½Ä¹®¼­¸¦ Âü°íÇÏ¸é µÇÁö¸¸, ÀÌ Æ÷½ºÆÿ¡¼­´Â Çٽɸ¸ Áý¾î¼­ Á¤¸®Çϵµ·Ï ÇÏ°Ú½À´Ï´Ù.


1. Firebase ÇÁ·ÎÁ§Æ® ¸¸µé±â

FCMÀ» Àû¿ëÇÒ ÇÁ·ÎÁ§Æ®¿¡ Firebase ÇÁ·ÎÁ§Æ®¸¦ Ãß°¡ÇØ¾ß Çϴµ¥, ÄֻܼçÀÌÆ®¿¡¼­ ÇÁ·ÎÁ§Æ®¸¦ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù.
ÇÁ·ÎÁ§Æ®°¡ ¹Ì Ãß°¡ »óŶó¸é À§ ÄÜ¼Ö »çÀÌÆ®¿¡¼­ »ý¼ºÇÕ´Ï´Ù.

»ý¼ºÀÌ ¿Ï·áµÇ¸é À§ »çÁøó·³ ¼³Á¤ ¾ÆÀÌÄÜ Å¬¸¯ ÈÄ ÇÁ·ÎÁ§Æ® ¼³Á¤À» Ŭ¸¯ÇÏ¸é ¾Æ·¡ »çÁøó·³ ¼³Á¤ È­¸éÀ¸·Î À̵¿ÇÏ°Ô µË´Ï´Ù.

ÀÌ°÷¿¡¼­ Android ¾Û¿¡ Firebase Ãß°¡¸¦ Ŭ¸¯ÇÏ¸é ¾Û µî·Ï È­¸éÀÌ ¶å´Ï´Ù.

¾Û µî·Ï±¸¼º ÆÄÀÏ ´Ù¿î·Îµå

¾Û µî·ÏÈ­¸é¿¡¼­´Â ¾Èµå·ÎÀ̵å ÆÐÅ°Áö À̸§(build.gradleÀÇ android{ applicationId }¿¡ ¼±¾ðµÈ °Í)À» µî·Ï ÈÄ,
´ÙÀ½ È­¸éÀΠ±¸¼º ÆÄÀÏ ´Ù¿î·Îµå¿¡¼­ ¼³¸í¿¡ ³ª¿Â ´ë·Î json ÆÄÀÏÀ» ÇÁ·ÎÁ§Æ®¿¡ Ãß°¡ÇÕ´Ï´Ù.

ÀÌÈÄ´Â ¾Æ·¡ÀÇ »çÁøó·³ ÀÛ¾÷À» ÁøÇàÇÕ´Ï´Ù.


2. Dependencies ¼³Á¤Çϱâ

¾Æ·¡ÀÇ ÀÇÁ¸¼ºÀ» Ãß°¡ÇØÁÝ´Ï´Ù.

1
2
3
4
dependencies {
...
ompile 'com.google.firebase:firebase-messaging:11.0.4'
}


4. FCM 󸮸¦ À§ÇÑ ¼­ºñ½º Ŭ·¡½º ÀÛ¼º

Android Studio¿¡¼­ ¼­ºñ½º¸¦ ±¸ÇöÇÒ Å¬·¡½º¸¦ ¸¸µé¾îÁÝ´Ï´Ù.

À§ »çÁøÀº ±×³É Âü°í¿ëÀ̸ç, Àú °°Àº °æ¿ì ÆÐÅ°Áö¸¦ Çϳª ¸¸µé°í ±×°÷¿¡ »ý¼ºÇÏ¿´½À´Ï´Ù.
2°³ÀÇ Å¬·¡½º¸¦ »ý¼ºÇØ¾ß Çϴµ¥, FirebaseMessagingService¸¦ »ó¼Ó¹ÞÀº Ŭ·¡½º¿Í FirebaseInstanceIdService¸¦ »ó¼Ó¹ÞÀº Ŭ·¡½º¸¦ ¸¸µé¾îÁÝ´Ï´Ù.

¾Æ·¡´Â ¿¹½Ã·Î ¸¸µç Ŭ·¡½ºµéÀÔ´Ï´Ù.
¸ÕÀú FirebaseMessagingServiceÀ» »ó¼Ó¹ÞÀº Ŭ·¡½º¸¦ Çϳª ¸¸µé¾îÁÝ´Ï´Ù.

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
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.PowerManager;
import android.support.v4.app.NotificationCompat;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import java.util.Date;
import java.util.Map;

public class CustomFirebaseMessagingService extends FirebaseMessagingService {

/**
* Called when message is received.
*
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
*/
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Map<String, String> pushDataMap = remoteMessage.getData();
sendNotification(pushDataMap);
}

private void sendNotification(Map<String, String> dataMap) {
Intent intent = new Intent(this, MachineListActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(dataMap.get("title"))
.setContentText(dataMap.get("msg"))
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setVibrate(new long[]{1000, 1000})
.setLights(Color.WHITE,1500,1500)
.setContentIntent(contentIntent);

NotificationManager nManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nManager.notify(0 /* ID of notification */, nBuilder.build());
}

ÀÌ ¼­ºñ½º Ŭ·¡½º´Â Ǫ½Ã ¸Þ¼¼Áö¸¦ ¹Þ¾Æ¼­ ó¸®ÇÏ´Â °ÍÀ» ±¸ÇöÇÕ´Ï´Ù.
onMessageReceived ¸Þ¼­µå¿¡¼­´Â Ǫ½Ã ¸Þ¼¼Áö¸¦ ¼ö½ÅÇßÀ» ¶§ È£ÃâÀÌ µÇ¸ç, pushDataMap¿¡´Â Ǫ½Ã ¸Þ¼¼Áö ³»¿ëÀÌ ´ã±â°Ô µË´Ï´Ù.
sendNotification ¸Þ¼­µå´Â Ǫ½Ã ¸Þ¼¼Áö¸¦ ¾Ë¸²À¸·Î Ç¥ÇöÇϴ ó¸®¸¦ ´ã´çÇÏ°Ô µË´Ï´Ù.
ÇØ´ç ¸Þ¼­µå´Â ÀÚ½ÅÀÇ ·ÎÁ÷¿¡ ¸Â°Ô²û ±¸ÇöÇÏ¸é µÇ¸ç, À§´Â ¿¹·Î ±¸ÇöÀ» ÇÑ °ÍÀÔ´Ï´Ù.

´ÙÀ½Àº FirebaseInstanceIdService¸¦ »ó¼Ó¹ÞÀº Ŭ·¡½º ¿¹½ÃÀÔ´Ï´Ù.

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
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;

public class CustomFirebaseInstanceIdService extends FirebaseInstanceIdService {

/**
* Called if InstanceID token is updated. This may occur if the security of
* the previous token had been compromised. Note that this is called when the InstanceID token
* is initially generated so this is where you would retrieve the token.
*/
// [START refresh_token]
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]


/**
* Persist token to third-party servers.
*
* Modify this method to associate the user's FCM InstanceID token with any server-side account
* maintained by your application.
*
* @param token The new token.
*/
private void sendRegistrationToServer(String token) {
//FCM ÅäÅ« °»½Å
}
}

ÀÌ Å¬·¡½º´Â ¾îÇø®ÄÉÀ̼ÇÀÌ Ã³À½ ¼³Ä¡µÇ°Å³ª °¡²û ÅäÅ«ÀÌ °»½ÅµÉ ¶§ onTokenRefresh ¸Þ¼­µå¸¦ ÅëÇØ FCM TokenÀ» Çϳª »ý¼ºÀÌ µÇ¾îÁý´Ï´Ù.
±×¸®°í ÀÌ ÅäÅ«ÀÌ »ý¼ºµÇ°Å³ª °»½ÅµÈ °æ¿ì ¼­¹ö¿¡ º¸³»ÁÖ´Â ¸Þ¼­µåÀΠsendRegistrationToServer¸¦ È£ÃâÇÏ°Ô µË´Ï´Ù.

ÀÌ FCM ÅäÅ«À» ÅëÇØ ÇØ´ç ±â±â·Î ¼­¹ö¿¡¼­ Ǫ½Ã ¸Þ¼¼Áö¸¦ º¸³»°Ô ÇØÁÖ´Â °íÀ¯ °ªÀÔ´Ï´Ù.
ÀÌ ºÎºÐÀº ÇâÈÄ¿¡ ¼­¹ö Ãø ±¸Çö ½Ã FCM ÅäÅ«ÀÌ °»½ÅµÇ´Â ºÎºÐÀ» °³¹ßÇØ¾ß ÇÕ´Ï´Ù.

»ç½Ç ´Ù¸¥ ºí·Î±×µé¿¡¼­´Â ¿©±â±îÁö¸¸ ´ëºÎºÐ ¼³¸íÀ» ÇÏ°Ô µË´Ï´Ù.
±×·±µ¥ »ç½Ç ÀÌ·± Á¤º¸¸¦ ãÀ¸½Ã´Â ºÐµéÀº ¿ä±¸»çÇ׿¡ ¸Â´Â ³»¿ëÀ» ±¸ÇöÇϱâ À§ÇØ ³»¿ëÀ» ã°Ô µË´Ï´Ù.
ÀüºÎ ´Ù Ä¿¹öÇÒ ¼ö´Â ¾øÁö¸¸ µÎ °¡Áö ¿¹½Ã »çÇ×À» º¸°í ¾î¶²½ÄÀ¸·Î ·ÎÁ÷À» Ç®¾î³ª°¡¾ß ÇÒÁö¸¦ ¾Ë¾Æº¸°Ú½À´Ï´Ù.

¾Ë¸² ¼ö½Å ¿©ºÎ

¿¹¸¦ µé¾î ¾Ë¸² ¼ö½Å ½Ã°£À» Á¦ÇÑÇÏ´Â ±â´ÉÀ» ±¸ÇöÇØ¾ß ÇÑ´Ù°í Çغ¾½Ã´Ù.
±×·³ ¾Æ·¡¿Í °°Àº ·ÎÁ÷À» »ý°¢ÇØ º¼ ¼ö ÀÖ°Ú½À´Ï´Ù.

  1. »ç¿ëÀڷκÎÅÍ ¾Ë¸² ¼ö½ÅÀ» Á¦¿ÜÇÒ ½Ã°£À» ÀԷ¹޽À´Ï´Ù.
  2. 1¹øÀÇ µ¥ÀÌÅ͸¦ Sharedpreference µî¿¡ ÀúÀåÀ» ÇصӴϴÙ.
  3. FirebaseMessagingService¸¦ ±¸ÇöÇÑ Å¬·¡½ºÀÇ onMessageReceived¸Þ¼­µå¿¡¼­ Ǫ½Ã ¾Ë¸² ¼ö½ÅÀ» ÇÏ¿´À» ¶§ 2¹øÀÇ ÀúÀåµÈ µ¥ÀÌÅ͸¦ Àоî¿Í¼­ ÇØ´ç ½Ã°£ÀÌ Çª½Ã ¾Ë¸²ÀÌ °¡´ÉÇÒ °æ¿ì¿¡¸¸ sendNotification() ¸Þ¼­µå¸¦ È£Ãâ.

Àú °°Àº °æ¿ì ¾Æ·¡¿Í °°Àº ¸Þ¼­µå¸¦ Çϳª ¸¸µé°í ·ÎÁ÷À» ±¸ÇöÇÏ¿´½À´Ï´Ù.

1
2
3
private boolean isCanReceivePush(String pushMsg) {
//½Ã°£ üũ ·ÎÁ÷
}

±×·¡¼­ onMessageReceived ¸Þ¼­µå¿¡¼­ Àú ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© true °ªÀ» ¹ÞÀ» °æ¿ì¿¡¸¸ ¸Þ¼¼Áö¸¦ ¼ö½ÅÇϴ ó¸®¸¦ ÇÏ¿´½À´Ï´Ù.


ÅäÅ« »ý¼º ¹× °»½Å ºÎºÐ

À§¿¡¼­ ¼³¸íµå¸° °Íó·³ ¾îÇø®ÄÉÀ̼ÇÀ» óÀ½ ¼³Ä¡ÇÒ ¶§³ª FCM ÅäÅ«À» °»½ÅÇÒ °æ¿ì¿£ Sharedpreference¿¡ ÅäÅ« °ªÀ» ÀúÀåÇصδ °Ô ÁÁ½À´Ï´Ù.
±×·¡¼­ onTokenRefresh() ¸Þ¼­µå¿¡¼­ È£Ã⠽à ¾Æ·¡¿Í °°ÀÌ ÀÀ¿ëÇÒ ¼ö ÀÖ½À´Ï´Ù.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId.getInstance().getToken();

if (isValidString(refreshedToken)) { //ÅäÅ«ÀÌ ³ÎÀ̰ųª ºó ¹®ÀÚ¿­ÀÌ ¾Æ´Ñ °æ¿ì
if (!isValidString(getSharedPreferencesStringData(getApplicationContext(), AD_FCM_TOKEN))) { //ÅäÅ«¿¡ µ¥ÀÌÅÍ°¡ ¾ø´Â °æ¿ì¿¡¸¸ ÀúÀå
setSharedPreferencesStringData(getApplicationContext(), AD_FCM_TOKEN, refreshedToken);
}

if (isValidString(getSharedPreferencesStringData(getApplicationContext(), AD_LOGIN_ID))) { //·Î±×ÀÎ »óÅÂÀÏ °æ¿ì¿¡´Â ¼­¹ö·Î º¸³½´Ù.
if (!refreshedToken.equals(getSharedPreferencesStringData(getApplicationContext(), AD_FCM_TOKEN))) { //±âÁ¸¿¡ ÀúÀåµÈ ÅäÅ«°ú ºñ±³ÇÏ¿© ´Ù¸¦ °æ¿ì¿¡¸¸ ¼­¹ö ¾÷µ¥ÀÌÆ®
setSharedPreferencesStringData(getApplicationContext(), AD_FCM_TOKEN, refreshedToken);
sendRegistrationToServer(refreshedToken);
}
}
}
}

Á¦°¡ °³¹ßÇß´ø ±¸Çü ·ÎÁ÷À» ±×´ë·Î °¡Á®¿Í¼­ ¾à°£ ÁöÀúºÐÇØ º¸ÀÏ ¼ö ÀÖ½À´Ï´Ù¸¸ ÀÏ´Ü Âü°í ¹× ¼³¸í¿ëÀÓÀ» °¨¾ÈÇØÁֽñ⠹ٶø´Ï´Ù.
ÀÏ´Ü Àú °°Àº °æ¿ì ¾Æ·¡ÀÇ ·ÎÁ÷À¸·Î ±¸ÇöÇÏ¿´½À´Ï´Ù.

  1. °»½ÅµÈ ÅäÅ«ÀÌ Á¤»óÀÎÁö üũ
  2. Sharedpreference¿¡ ÀúÀåµÈ FCM ÅäÅ« °ªÀÌ ¾ø´Â °æ¿ì¿¡¸¸ ÀúÀå.
  3. ¸¸¾à ·Î±×ÀÎ »óÅÂÀÏ °æ¿ì Sharedpreference¿¡ °»½ÅµÈ ÅäÅ«À» ÀúÀåÇÏ°í ¼­¹ö·Î °»½ÅµÈ ÅäÅ«À» Àü¼ÛÇÏ´Â ¸Þ¼­µå¸¦ È£Ãâ.

°£´ÜÇÏ°Ô µÎ °¡ÁöÀÇ ¿¹½Ã¸¸ ¼³¸íÀ» µå·È½À´Ï´Ù.
´Ù¸¥ ¿ä±¸»çÇ×ÀÌ ÀÖ´Ù¸é À§¿¡¼­ ¾È³»µå¸° °Íó·³ ·ÎÁ÷À» Ç®¾îº¸°í ±×¿¡ ¸ÂÃç¼­ ±¸ÇöÀ» Çϸé Ǫ½Ã´Â ¾î·ÆÁö ¾Ê°Ô ±¸ÇöÀ» ÇÏ½Ç ¼ö ÀÖ½À´Ï´Ù.


5. Manifest ÆÄÀÏ ¼öÁ¤

À§¿¡¼­ »ý¼ºÇÑ ¼­ºñ½º Ŭ·¡½º¸¦ ¸Å´ÏÆ佺Ʈ¿¡ µî·ÏÇÕ´Ï´Ù.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- Firebase Service -->
<service
android:name=".firebase.CustomFirebaseMessagingService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>

<service
android:name=".firebase.CustomFirebaseInstanceIdService"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>

À§ ÀÛ¾÷À» ´Ù ¸¶Ä¥ °æ¿ì Ǫ½Ã¸¦ ¼ö½ÅÇÒ ¼ö ÀÖ°Ô µË´Ï´Ù.


Á¤¸®

»ç½Ç ÀÌ Æ÷½ºÆ® Çϳª¸¸À¸·Î´Â Ǫ½Ã ¼­ºñ½º¸¦ ±¸ÇöÇß´Ù ÇÒ ¼ö ¾ø½À´Ï´Ù.
°³ÀÎÀûÀ¸·Î Ǫ½Ã ¼­ºñ½º¸¦ ±¸ÇöÇÏ·Á¸é ¼­¹ö ÃøÀÇ ±¸ÇöÀÌ Á¦ÀÏ Áß¿äÇÑ °Í °°½À´Ï´Ù.
ÀÌ Æ÷½ºÆ®¿Í ¦À» ÀÌ·ê ¼­¹ö Ãø ±¸Çö Æ÷½ºÆÃÀº °ð ÀÛ¼ºÇÏ¿© ¾÷µ¥ÀÌÆ® Çϵµ·Ï ÇÏ°Ú½À´Ï´Ù.
¶ÇÇÑ 1:1 Ǫ½Ã ¸»°í ±¸µ¶ °ªÀ» ÀÌ¿ëÇÏ¿© Ǫ½Ã¸¦ ¹Þ´Â ³»¿ëµµ Æ÷½ºÆÃÇÒ ¿¹Á¤ÀÔ´Ï´Ù.

¾÷µ¥ÀÌÆ®¸¦ ±â´Ù·ÁÁÖ¼¼¿ä.