FCM 을 활용한 PUSH 메세지 보내기 (2022-10-19)

프로그래밍/ANDROID|2022. 10. 19. 16:16
반응형

New Project > Empty Activity 선택

Language : Java

Minimum SDK : API 21

[v] Use legacy android.support libraries

이 상태로 진행하였습니다.

 

 

build.gradle 수정 (프로젝트 수준)

 

아래 내용을 파일 내용 맨 윗부분에 추가 합니다.

 

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

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

(생략)

 

 

build.gradle 수정 (앱 수준)

 

아래 내용을 추가 합니다.

중간에 주석 부분도 추가해줍니다. 없을 경우 바로 아랫줄에 구문 에러 메세지가 출력됩니다.

 

plugins {
    id 'com.android.application'
    id 'com.google.gms.google-services' // 이 부분을 추가 합니다.
}

(생략)

dependencies {

    //noinspection GradleCompatible
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:2.0.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    implementation platform('com.google.firebase:firebase-bom:31.0.0')
    implementation 'com.google.firebase:firebase-analytics'
    implementation 'com.google.firebase:firebase-messaging:23.1.0'
    implementation 'com.google.firebase:firebase-core:21.1.1'
}

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

 

 

settings.gradle 생성 (앱 수준)

 

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

 

 

google-services.json 생성

 

Firebase console 페이지에 접근해서 프로젝트에 APP 을 추가합니다.

추가하는 과정에서 google-services.json 파일을 다운로드 받을 수 있으며,

해당 파일은 app 디렉토리 안에 넣어 놓습니다.

 

 

build.gradle 페이지에서 [Sync Now] 버튼을 눌러줍니다.

 

 

MyFirebaseMessagingService.java 생성

 

package com.tistory.sysdocu;

import androidx.annotation.NonNull;

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

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    @Override
    public void onNewToken(@NonNull String token) {
        super.onNewToken(token);
        //token을 서버로 전송
    }

    @Override
    public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        //수신한 메시지를 처리
    }
}

 

 

MainActivity.java 수정

 

package com.tistory.sysdocu;

import android.os.Bundle;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.messaging.FirebaseMessaging;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        FirebaseMessaging.getInstance().getToken().addOnSuccessListener(new OnSuccessListener<String>() {
            @Override
            public void onSuccess(String token) {

                // 토큰을 토스트로 간단히 확인
                Toast toast = Toast.makeText(getApplicationContext(), "TOKEN : " + token, Toast.LENGTH_LONG);
                toast.show();

// 아래와 같이 특정 서버로 데이터를 전송 할 수 있습니다. 
// 서버로 token 을 전송하는 방식은 여러가지가 있으나, 여기에서는 간단히 GET 방식으로 접근하여 전송하도록 하였습니다.
// 웹서버에서는 token 을 DB 에 저장하여 활용하면 됩니다.
/*
                new Thread(){
                    @Override
                    public void run() {
                        StringBuilder content = new StringBuilder();
                        try {
                            URL url = new URL("https://sysdocu.tistory.com/register.html?token=" + token);
                            BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
                            String str;
                            while ((str = in.readLine()) != null) {
                                content.append(str +"\n");
                            }
                            in.close();
                        } catch (MalformedURLException e) {
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }.start();
*/
            }
        });
    }

}

 

 

activity_main.xml 수정

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:background="#DFE5E5"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:textColor="@color/black"
        android:text="토큰은 웹서버에서 확인하세요." />

</LinearLayout>

 

 

AndroidManifest.xml

 

아래 내용을 추가합니다.

 

(생략)

<uses-permission android:name="android.permission.INTERNET"/>


(생략)

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

(생략)

 

 

프로젝트를 빌드하여 apk 파일을 생성하고, 핸드폰에 설치합니다.

 

 

PUSH 발송 테스트

 

방법1)

Firebase console 페이지에 접근해서 [ 참여 > Messaging ] 메뉴로 들어갑니다.

첫번째 메세지 보내기(?) 에서 [Firebase 알림 메시지] 를 선택하고 앱을 설치한 모든 device 로 PUSH 메세지를 발송해 볼 수 있습니다.

 

 

방법2)

PHP 코드를 아래와 같이 작성 합니다.

 

<?php

$title = "제목입니다.";
$body = "내용입니다.";

$_url = 'https://fcm.googleapis.com/fcm/send';

$_header = array(
    'Content-Type: application/json',
    'Authorization: key=서버 키' // Firebase console > 프로젝트 설정 > 클라우드 메시징에서 '서버 키' 를 복사하여 입력합니다.
);

$_data = array(
    'to' => '사용자 토큰', // 앱에서 출력된 (서버로 전송한) 토큰을 입력합니다.
    'notification' => array( // 앱이 백그라운드 또는 실행중이지 않을때 제목과 내용
        'title' => $title,
        'body' => $body
    ),
    'data' => array( // 앱이 실행중일때 제목과 내용 (내용을 보려면 앱 소스에서 코드를 추가해주세요)
        'title' => $title,
        'body' => $body
    )
);
$_param = json_encode($_data);

$curlObj = curl_init();
curl_setopt($curlObj, CURLOPT_URL, $_url );
curl_setopt($curlObj, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curlObj, CURLOPT_SSLVERSION, 1);
curl_setopt($curlObj, CURLOPT_POST, true);
curl_setopt($curlObj, CURLOPT_HEADER, false);
curl_setopt($curlObj, CURLOPT_HTTPHEADER, $_header);
curl_setopt($curlObj, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curlObj, CURLOPT_POSTFIELDS, $_param);
$response = curl_exec($curlObj);

$_json = array();
$_json = json_decode($response, true);
curl_close($curlObj);
?>

 

소스는 이와 같으며 PHP 파일을 실행하여 token 으로 지정한 특정 device 로 PUSH 메세지를 발송할 수 있습니다.

 

반응형

댓글()