본문 바로가기

Development/Android Studio

(Android Studio) Chapter10. FCM Push Message

1. FCM(Firebase Cloud Messaging) Push Message

  1) 기능

    - 상단 푸쉬알림 

    - 구글의 FCM을 통해 메시지를 설정하고 앱 사용자에게 상단메시지를 보냄(주로 게임의 푸쉬알림을 생각하면 쉬울 듯)

  2) 빌드 프로세스

    - 프로젝트 생성 > https://console.firebase.google.com/에 프로젝트 생성하고 Android Studio에서 생성한 프로젝트명 기입 > json파일 다운로드 > app 디렉토리에 다운로드 > build.gradle app-level에 dependency, plugin 선언 > build.gradle project-level에 apply plugin, implement platform, implement > com. google.firebase.messaging.FirebaseMessagingService를 extends  > TAG, msg 선언 > 메시지 받아서 얼마나 오랫동안 노출을 시킬지 선언 > FirebaseMessagingService를 extends > token으로 메시지를 등록하여 보내기 > 사이트에서 프로젝트로 메시지 보내기

 

  3) 코드 예시

    - https://console.firebase.google.com/에 프로젝트 생성

    - app 디렉토리에 다운로드

    - build.gradle project-level에 apply plugin, implement platform, implement

plugins {
    id 'com.android.application'
}

android {
    namespace 'com.example.pushexample'
    compileSdk 33

    defaultConfig {
        applicationId "com.example.pushexample"
        minSdk 33
        targetSdk 33
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.6.0'
    implementation 'com.google.android.material:material:1.8.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'com.google.firebase:firebase-messaging:23.1.2'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    implementation platform('com.google.firebase:firebase-bom:31.2.3')
    implementation 'com.google.firebase:firebase-analytics'
}

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

    - build.gradle app-level에 dependency, plugin 선언

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.gms:google-services:4.3.15'

    }
}

plugins {
    id 'com.android.application' version '7.3.1' apply false
    id 'com.android.library' version '7.3.1' apply false
}

    - com. google.firebase.messaging.FirebaseMessagingService를 extends

package com.example.pushexample;

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

import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;

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;

    @Override
    public void onMessageReceived(@NonNull RemoteMessage message) {
        Log.e(TAG, "onMessageReceived");

        RemoteMessage remoteMessage = null; // remoteMessage 오류에 대한 추천으로 추가 한 코드
        title = remoteMessage.getNotification().getTitle();
        msg = remoteMessage.getNotification().getBody();

        // 보내온 메시지를 시스템이 직접 한 것 처럼 인식하게 하는 것
        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, mBuilder.build());

        mBuilder.setContentIntent(contentIntent);

    }
}

    - FirebaseMessagingService를 extends

package com.example.pushexample;

import android.util.Log;

import androidx.annotation.NonNull;

import com.google.firebase.messaging.FirebaseMessagingService;
// FirebaseInstanceIdService(삭제됨) > FirebaseMessagingService
public class FirebaseinstanceIDService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseIIDService";

    @Override  // onTokenRefresh(instanceidservice 종속 메소드) > onNewToken
    public void onNewToken(@NonNull String token) {

        Log.e(TAG,token);

        sendRegistrationToServer(token);

    }

    private void sendRegistrationToServer(String token) {

    }

}

    - 사이트에서 프로젝트로 메시지 보내기

 

  4) 문제점

    - 강의상에는 지금은 사용하지 않는 FirebaseInstanceIdService 클래스로 빌드를 한 점 > 지금은 FirebaseMessagingService클래스 사용

    - 하기 코드를 쓰도록 사이트에서는 지침을 주지만 의존도문제가 발생함. 그러나 삭제 가능


allprojects {
    repositories {
        google() // Google's Maven repository
        mavenCentral() // Maven Central repository
    }
}

    - remoteMessage에 대한 오류 해결 문제 미해결

    - SDK 설치 및 사용에 대한 버전 호환성 문제 미해결

 

2. 참고 사이트

https://angelplayer.tistory.com/263

 

[안드로이드 에러] 라이브러리 추가 시 에러 (Build was configured to prefer settings repositories..) 해결

에러 A problem occurred evaluating project ':app'. > Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by build file 'app\build.gradle' 원인 글을 작성하는 시점의 최신 안드로이

angelplayer.tistory.com