FCM 을 활용한 PUSH 메세지 보내기 (2022-10-19)
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 메세지를 발송할 수 있습니다.
'프로그래밍 > ANDROID' 카테고리의 다른 글
[Android] APNG 사용하기 (0) | 2023.08.24 |
---|---|
안드로이드 알람 생성 2가지 방법 (Android Notifications Tutorial with Examples) (0) | 2022.07.18 |
안드로이드 비정상 종료 감지 처리 (어플 재시작) (0) | 2021.06.08 |
안드로이드 와이파이 SSID 가져오기 (0) | 2021.06.02 |
TextView 레이아웃 사이즈에 맞게 글자 크기 자동 조정하기 (0) | 2021.06.02 |