PWA

ChatGPT와 FCM 개발 - Firebase Functions

그랜파 개발자 2024. 9. 20. 11:32

79. Firebase Functions

구독자 정보 저장을 통하여 firestore에 푸시 알림 서비스를 받는 구독자의 정보를 저장하였습니다. Firebase Functions를 사용하여 Firestore에 저장된 구독자에게 푸시 알림을 보내는 기능을 구현합니다. FCM을 이용하여 알림을 보내는 기능은 Cloud 함수로 만들어야 합니다.

ChatGPT에게 물었습니다.

Create a function to send push messages to subscribers stored in firestore using firebase functions.

firebase functions를 이용하여 firestore에 저장된 구독자에게 푸시 메시지를 보내는 기능을 만들어 줘.

To send push notifications to subscribers stored in Firestore using Firebase Functions, you'll need to create a Cloud Function that retrieves subscriber tokens from Firestore and sends notifications using Firebase Cloud Messaging (FCM). Below is a step-by-step guide on how to implement this feature.

Firebase Functions를 사용하여 Firestore에 저장된 구독자에게 푸시 알림을 보내려면 Firestore에서 구독자 토큰을 검색하고 FCM(Firebase Cloud Messaging)을 사용하여 알림을 보내는 Cloud 함수를 만들어야 합니다. 다음은 이 기능을 구현하는 방법에 대한 단계별 가이드입니다.

1. Set Up Firebase Functions and Firebase Admin SDK

1. Firebase 함수 및 Firebase Admin SDK 설정

Ensure that your Firebase project is initialized with Firebase Functions and that the Firebase Admin SDK is installed. Firebase 프로젝트가 Firebase Functions로 초기화되었고 Firebase Admin SDK가 설치되어 있는지 확인하세요.

1.1. Install Firebase CLI and Initialize Firebase Functions

1.1. Firebase CLI 설치 및 Firebase 함수 초기화

If you haven’t done this already, install Firebase CLI: 아직 설치하지 않았다면 Firebase CLI를 설치하세요.

npm install -g firebase-tools

Initialize Firebase Functions in your project: 프로젝트에서 Firebase 함수를 초기화합니다.

firebase init functions

When prompted:
메시지가 표시되면:

  • Choose JavaScript or TypeScript as the language.
    언어로 JavaScript 또는 TypeScript를 선택합니다.
  • Install dependencies when asked.
    요청 시 종속성을 설치합니다.

1.2. Install Firebase Admin SDK

1.2. Firebase Admin SDK 설치

The Firebase Admin SDK is required to interact with Firestore and FCM. Install it in your functions directory: Firestore 및 FCM과 상호작용하려면 Firebase Admin SDK가 필요합니다. functions 디렉토리에 설치하세요:

npm install firebase-admin

2. Write the Firebase Function

2. Firebase 함수 작성

This function will retrieve subscriber tokens from Firestore and send a push notification to each subscriber.
이 함수는 Firestore에서 구독자 토큰을 검색하고 각 구독자에게 푸시 알림을 보냅니다.

2.1. Set Up the Function

2.1. 기능 설정

In functions/index.js (or functions/src/index.ts if using TypeScript), create a function to send push notifications:
functions/index.js(또는 TypeScript를 사용하는 경우 functions/src/index.ts)에서 푸시 알림을 보내는 함수를 만듭니다.

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();

const db = admin.firestore();

exports.sendPushNotifications = functions.https.onRequest(async (req, res) => {
  try {
    // Ensure the request contains the necessary fields
    const { title, body } = req.body;

    if (!title || !body) {
      return res.status(400).send('Missing title or body in request');
    }

    // Retrieve all subscriptions from Firestore
    const subscriptionsSnapshot = await db.collection('subscriptions').get();
    const tokens = [];

    subscriptionsSnapshot.forEach(doc => {
      tokens.push(doc.data().token);
    });

    if (tokens.length === 0) {
      return res.status(404).send('No subscribers found');
    }

    // Create the message object
    const message = {
      notification: {
        title: title,
        body: body,
      },
      tokens: tokens,
    };

    // Send the notification
    const response = await admin.messaging().sendMulticast(message);

    console.log('Notifications sent successfully:', response);

    // Handle any tokens that caused failures
    if (response.failureCount > 0) {
      const failedTokens = [];
      response.responses.forEach((resp, idx) => {
        if (!resp.success) {
          failedTokens.push(tokens[idx]);
        }
      });
      console.log('Failed tokens:', failedTokens);

      // Optionally: Remove failed tokens from Firestore
      const batch = db.batch();
      const failedTokenDocs = await db.collection('subscriptions')
        .where('token', 'in', failedTokens)
        .get();

      failedTokenDocs.forEach(doc => {
        batch.delete(doc.ref);
      });

      await batch.commit();
    }

    res.status(200).send('Notifications sent successfully');
  } catch (error) {
    console.error('Error sending notifications:', error);
    res.status(500).send('Error sending notifications');
  }
});

3. Deploy the Function

3. 함수 배포

Deploy your function to Firebase: Firebase에 함수를 배포합니다.

firebase deploy --only functions

4. Trigger the Function

4. 기능 트리거

You can trigger this function by sending an HTTP POST request to the function's endpoint.
함수의 엔드포인트에 HTTP POST 요청을 전송하여 이 함수를 트리거할 수 있습니다.

  • URL: The function's URL will be something like https://<your-region>-<your-project-id>.cloudfunctions.net/sendPushNotifications
    URL: 함수의 URL은 https://<your-region>-<your-project-id>.cloudfunctions.net/sendPushNotifications와 같습니다.
  • Method: POST
    방법: POST
  • Body: A JSON object containing the title and body of the notification.
    본문: 알림의 '제목'과 '본문'을 포함하는 JSON 개체입니다.

Example using curl:
curl을 사용한 예:

curl -X POST https://<your-region>-<your-project-id>.cloudfunctions.net/sendPushNotifications \
-H "Content-Type: application/json" \
-d '{
  "title": "Hello World",
  "body": "This is a test notification."
}'

5. Handling Failed Tokens

5. 실패한 토큰 처리

The function already includes logic to handle failed tokens. If sending notifications fails for certain tokens (e.g., because the user uninstalled the app), those tokens are removed from Firestore. 함수에는 실패한 토큰을 처리하는 논리가 이미 포함되어 있습니다. 특정 토큰에 대한 알림 전송이 실패하면(예: 사용자가 앱을 제거하여) 해당 토큰이 Firestore에서 삭제됩니다.

Summary 요약

This guide helps you create a Firebase Function that sends push notifications to subscribers stored in Firestore. The function retrieves the FCM tokens from Firestore, sends notifications using FCM, and optionally removes invalid tokens from Firestore. You can deploy this function and trigger it via an HTTP POST request, making it easy to send notifications programmatically.

이 가이드는 Firestore에 저장된 구독자에게 푸시 알림을 보내는 Firebase 함수를 만드는 데 도움이 됩니다. 이 함수는 Firestore에서 FCM 토큰을 검색하고, FCM을 사용하여 알림을 보내고, 선택적으로 Firestore에서 잘못된 토큰을 제거합니다. 이 기능을 배포하고 HTTP POST 요청을 통해 트리거할 수 있으므로 프로그래밍 방식으로 알림을 쉽게 보낼 수 있습니다.