[안드로이드] FCM 사용하기 예제



FCM은 Firebase를 사용해서 푸시메시지를 보내는 방법입니다.

예전에는 GCM을 많이 사용했다고 하는데,

현재는 간단하고 편리하다는 등의 이유로 FMC을 많이 사용한다고합니다.





1. Firebase 콘솔로 이동 후 프로젝트 생성합니다.

https://console.firebase.google.com/

프로젝트 이름을 입력합니다.





2. 프로젝트 패키지 이름을 입력합니다.






3. 앱 등록하면 google-services.json 파일을 다운받을 수 있습니다.

안드로이드스튜디오에서 프로젝트를 엽니다.

상단 왼쪽 목록에서 'Project Files' 로 선택 후 app 폴더에 .json 파일을 복사해줍니다.

정상적으로 복사했다면 아래의 구조처럼 .json 파일이 들어가있을겁니다.





4. build.gradle (Project:app name) 파일에서 buildscript > dependencies > 위치에 아래 코드 추가

buildscript {
dependencies {
classpath 'com.google.gms:google-services:3.1.0'
}
}



추가된 전체 코드





5. build.gradle (Module : app) 파일에서 가장 하단에 아래 코드 추가

apply plugin: 'com.google.gms.google-services'

그리고 dependencies 안에 아래 코드 추가

compile 'com.google.firebase:firebase-messaging:11.0.4'



상단 오른쪽에 Sync Now 눌러줍니다.




추가 완료된 코드





6. FirebaseInstanceIDService 클래스를 만들어줍니다.

아래 코드를 복사해서 패키지명 아래부터 그대로 붙여줍니다.

import android.util.Log;

import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.FirebaseInstanceIdService;


public class FirebaseInstanceIDService extends FirebaseInstanceIdService {

private static final String TAG = "MyFirebaseIIDService";

/**
* 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() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);

// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
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) {
// TODO: Implement this method to send token to your app server.
}
}




7. FirebaseMessagingService 클래스를 만들어줍니다.

마찬가지로 아래 코드를 복사해서 패키지명 아래부터 그대로 붙여줍니다.


import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.support.v4.app.NotificationCompat;
import android.util.Log;

import com.google.firebase.messaging.RemoteMessage;

public class FirebaseMessagingService extends com.google.firebase.messaging.FirebaseMessagingService {

private static final String TAG = "FirebaseMsgService";

private String msg, title;

/**
* 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) {
Log.d(TAG, "onMessageReceived===");
// [START_EXCLUDE]
// There are two types of messages data messages and notification messages. Data messages are handled
// here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
// traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
// is in the foreground. When the app is in the background an automatically generated notification is displayed.
// When the user taps on the notification they are returned to the app. Messages containing both notification
// and data payloads are treated as notification messages. The Firebase console always sends notification
// messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
// [END_EXCLUDE]

// handleIntent();
// TODO(developer): Handle FCM messages here.
// Not getting messages here? See why this may be: https://goo.gl/39bRNJ
Log.d(TAG, "From: " + remoteMessage.getFrom());

// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
}

// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}

title = remoteMessage.getNotification().getTitle();
msg = remoteMessage.getNotification().getBody();

// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.

// [END receive_message]


Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, MainActivity.class), 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(title)
.setContentText(msg)
.setAutoCancel(true)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setVibrate(new long[]{1, 1000});

NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

notificationManager.notify(0 /* ID of notification */, mBuilder.build());


mBuilder.setContentIntent(contentIntent);
}

}

NotificationCompat.Builder 부분에서

아이콘, 타이틀, 진동 길이 등 수정가능합니다.





8. 매니페스트 파일의 <application> 부분에 아래 코드를 추가합니다.

<service
android:name=".FirebaseMessagingService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>

<service
android:name=".FirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>




9. 여기까지 했으면 일단은 완료입니다.

사용자가 푸시메시지를 터치하면 앱이 실행되며

메인 액티비티가 열릴겁니다!





--- 추가 사용법 ---



10. 토큰 얻는 법입니다. (MainActivity)

메인액티비티의 onCreate()에 아래 코드를 추가해주면,

앱이 실행됐을때 토큰을 얻을 수 있습니다.

FirebaseInstanceId.getInstance().getToken();
String token = FirebaseInstanceId.getInstance().getToken();
if (token != null) {
Log.d("FCM Token", token);
}




11. 푸시를 눌렀을 때 이벤트 변경.

기본으로 푸시 눌렀을때는 메인 액티비티가 실행됩니다.

다른 이벤트를 주고 싶은 경우에는

FirebaseMessageingService 의 onMessageReceived() 함수를 수정하면 된다고 하는데,

저는 그게 제대로 적용이 안돼서(못하는 걸수도..)

다른 방법을 찾았습니다.



MainActivity의 onCreate에 아래 코드 추가.

아래 코드는 푸시 클릭 후 Mian2Activity를 실행하는 코드입니다.

if (getIntent().getExtras() != null) {
Log.d("MainActivity", "push Y");
// Push로 앱 실행되면 해당 코드 실행
Intent intent = new Intent(MainActivity.this, Main2Activity.class);
startActivity(intent);
} else {
Log.d("MainActivity", "push N");
}






12. firebase 에서 테스트해보기

Project > Notification > 메시지 작성

아래처럼 메시지 내용을 입력합니다.

하단에 고급옵션에서 제목도 수정 가능합니다.





13. 폰에서 알림 받기 완료



푸시를 누르면 MainActivity에서 추가한 코드처럼

Main2Activity로 이동합니다.



FCM 예제는 끝입니다!


더 자세한 정보는 Firebase 홈페이지에서 확인해보세요~

https://firebase.google.com/docs/cloud-messaging/?authuser=0




+ Recent posts

티스토리 툴바