node.js에서 푸시 알림을 보내고 kotlin 앱에 표시하는 방법

23615 단어
이 기사에서는 Firebase 및 node.js를 사용하여 모바일 장치에 푸시 알림을 보내는 방법을 살펴봅니다.
먼저 Firebase를 구성한 모바일 애플리케이션이 있다고 가정합니다. 또한 node.js 애플리케이션이 있다고 가정합니다.

우선, 노드 애플리케이션에 2개의 노드 라이브러리 즉, firebase-admin 및 fcm-notification을 설치해야 합니다.

npm i firebase-admin --save
npm i fcm-notification --save


Firebase 계정에 액세스하고 json 파일인 비공개 키를 node.js 애플리케이션에 포함해야 합니다. 이 비공개 키를 얻으려면 Firebase > YouProjectName > 설정 > 서비스 계정으로 이동하여 새 비공개 키 생성 버튼을 클릭합니다.
노드 앱의 클래스 또는 함수에서 다음 패키지를 가져옵니다.

var admin = require("firebase-admin");
var fcm = require('fcm-notification');
var serviceAccount = require("../config/privateKey.json");
const certPath = admin.credential.cert(serviceAccount);
var FCM = new fcm(certPath);


firebase-admin을 사용하여 비공개 키 json 파일에서 인증서를 생성합니다. 코드 라인에서 볼 수 있듯이

const certPath = admin.credential.cert(serviceAccount);
비공개 키에서 생성된 이 인증서는 Firebase 계정에 대한 요청을 인증하기 위한 것입니다.

푸시 알림을 보내는 기능

  sendPushNotification= (fcm_token, title, body) => {

    try{
        let message = {
            android: {
                notification: {
                    title: title,
                    body: body,
                },
            },
            token: fcm_token
        };

        FCM.send(message, function(err, resp) {
            if(err){
                throw err;
            }else{
                console.log('Successfully sent notification');
            }
        });

    }catch(err){
        throw err;
        }

    }



sendPushNotification()은 푸시 알림을 보내기 위해 만든 함수 이름입니다. 푸시 알림의 3개 매개변수, 즉 fcm_token, 제목 및 본문을 사용합니다. message는 android 및 토큰 키가 있는 객체입니다. Android는 알림이 모바일 장치로 전송되고 있음을 나타내는 키입니다. Android 키 내에는 푸시 알림의 제목과 본문을 포함하는 알림 객체가 있습니다. 토큰은 알림이 전송되는 fcm 토큰을 보유하는 키입니다.

FCM은 개인 키에서 생성된 인증서를 가져오는 fcm-notification 패키지의 fcm 클래스 인스턴스입니다.
fcm 클래스 내에는 인스턴스를 통해 액세스되는 메서드 send가 있으며 아래 코드 스니펫에서 볼 수 있는 것처럼 2개의 매개변수, 즉 메시지 객체와 콜백 함수를 취합니다.

 FCM.send(message, function(err, resp) {
   if(err){
        throw err;
     }else{
        console.log('Successfully sent notification');
     }
   });


Firebase를 사용하여 node.js에서 모바일 장치로 푸시 알림을 보내는 방법입니다.
결론을 내리기 전에 fcm 토큰은 firebase가 구성되고 사용되는 모바일 앱에서 온다는 점에 유의하십시오. 즉, 데이터베이스에 토큰을 저장하는 경우 데이터베이스에서 이 토큰에 실제로 액세스할 수 있습니다.

In Kotlin(모바일 앱)
Kotlin 코드에서 Firebase 서비스를 다음과 같이 설정할 수 있습니다.

import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.media.RingtoneManager
import android.net.Uri
import android.os.Build
import android.util.Log
import androidx.core.app.NotificationCompat
import androidx.core.content.ContextCompat
import com.google.firebase.messaging.FirebaseMessaging
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class CustomFirebaseMessagingService : FirebaseMessagingService() {

    override fun onMessageReceived(remoteMessage: RemoteMessage) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val mNotificationManager =
                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            val importance = NotificationManager.IMPORTANCE_HIGH
            val mChannel = NotificationChannel(
                AppConstants.FCMConstants.CHANNEL_ID,
                AppConstants.FCMConstants.CHANNEL_NAME,
                importance
            )
            mChannel.description = AppConstants.FCMConstants.CHANNEL_DESC
            mNotificationManager.createNotificationChannel(mChannel)
        }

        if(remoteMessage.data.isNotEmpty()) {
            remoteMessage.data.let {

                var title = it["title"]
                var body = it["message"]
                println("From data object, notification title: $title and body: $body")
                sendNotification(title.toString(), body.toString())
            }
        }

        if (remoteMessage.notification != null){
            var title = remoteMessage.notification?.title
            var body = remoteMessage.notification?.body
            println("From notification object, notification title: $title and body: $body")
            if(!title.isNullOrEmpty() && !body.isNullOrEmpty()){
                sendNotification(title.toString(), body.toString())
            }
        }


    }


    private fun sendNotification(title: String, messageBody: String) {
        var intent: Intent? = null
        intent = Intent(this, HomeActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        val pendingIntent = PendingIntent.getActivity(
            this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT
        )
        var defaultSoundUri: Uri? = null
        defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val importance = NotificationManager.IMPORTANCE_HIGH
            val channel =
                NotificationChannel(
                    AppConstants.FCMConstants.CHANNEL_ID,
                    AppConstants.FCMConstants.CHANNEL_NAME,
                    importance
                )
            channel.description = AppConstants.FCMConstants.CHANNEL_DESC
            // Register the channel with the system; you can't change the importance
            // or other notification behaviors after this
            val notificationManager = this.getSystemService(
                NotificationManager::class.java
            )
            notificationManager.createNotificationChannel(channel)
        }
        val notificationBuilder: NotificationCompat.Builder =
            NotificationCompat.Builder(this, AppConstants.FCMConstants.CHANNEL_ID)
                .setStyle(NotificationCompat.BigTextStyle().bigText(messageBody))
                .setContentTitle(title)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setPriority(NotificationManager.IMPORTANCE_MAX)
                .setChannelId(AppConstants.FCMConstants.CHANNEL_ID)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            notificationBuilder.setSmallIcon(R.drawable.push_icon)
            notificationBuilder.color = ContextCompat.getColor(this, R.color.pink_500)
        } else {
            notificationBuilder.setSmallIcon(R.mipmap.ic_launcher)
        }
        val notificationManager =
            this.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build())
    }


    override fun onNewToken(p0: String) {
        Log.d("NotificationFCM", "Token: " + p0)
    }

}


이 기사를 읽어 주셔서 감사합니다. 도움이 되셨기를 바랍니다.

좋은 웹페이지 즐겨찾기