[안드로이드] 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
'IT > 안드로이드+JAVA' 카테고리의 다른 글
[안드로이드+JAVA] 지정한 수 만큼 문자열 잘라서 출력하기 (0) | 2020.10.08 |
---|---|
[안드로이드] 안드로이드 스튜디오 그래들 업데이트 (0) | 2020.04.15 |
[안드로이드] 네트워크 연결 확인 (0) | 2018.01.12 |
[안드로이드] 다음 카카오 지도 api 사용하기 (Kakao Map Api) (3) | 2018.01.10 |
[JAVA] 전위 연산자, 후위 연산자, ++, -- (0) | 2017.06.14 |