Cloud Functions에서 Firestore 업데이트를 특정 기기에 푸시 알림

Cloud Functions × Firestore × Firebase Cloud Messaging



Cloud Functions는 서버리스 컴퓨팅 서비스입니다. 다양한 이벤트를 트리거하여 액션을 실행할 수 있어 매우 비용 성능이 우수합니다.

이번에는 이 Cloud Functions를 사용하여 Firestore에 데이터가 추가되면 특정 기기에 push 알림을 받도록 합니다.

구조



알림을 보낼 DB를 디자인합니다. 이번은 단순화를 위해 notifications 라는 컬렉션으로 하고 있습니다.
여기서 미리 테이블에 디바이스의 id가 붙어 있으면 하기 쉽다고 생각합니다.
notifications
│
├── notification
│   ├── text
│   └── users
.        ├── bJi8iJLw0ufF1HCO17v3b7UTVS53
.        .
.        .

Architecture





Steps



다음이 이미 완료된 전제로 구현합니다. 어쩌면 이 기사에 도착하는 사람은 코딩으로 막힌 사람이라고 생각합니다. Firestore 샘플 여기밖에 없었다. . .
  • Firebase 프로젝트가 생성되었습니다
  • 필요한 패키지가 설치되었습니다
  • 클라이언트 측 원격 알림 설정

  • 1. Cloud Functions 시작



    먼저 프로젝트를 만듭니다.
    $ Firebase init
    

    functions 디렉토리내에 있는 index.js 에 코드를 기술해 갑니다.

    2. 코드 작성



    index.js
    const functions = require('firebase-functions');
    const admin = require('firebase-admin');
    admin.initializeApp();
    
    exports.sendNotifications = functions.firestore.document('notifications/{notificationId}').onCreate(
        async (snapshot) => {
            // Notification details.
            const newValue = snapshot.data();
    
            const payload = {
                notification: {
                    title:"新規ライブ",
                    body: newValue.text + "の新しいライブが追加されました!",
                    content_available: 'true',
                    sound: "default",
                    click_action: `https://${process.env.GCLOUD_PROJECT}.firebaseapp.com`,
                }
            };
    
            const userIDs = newValue.users
    
            // Get the list of device tokens.
            userIDs.forEach(function (value) {
                admin.firestore().collection('fcmTokens').doc(value).get()
                    .then(function (querySnapshot) {
    
                        let fcmToken = querySnapshot.data().fcmToken
                        admin.messaging().sendToDevice(fcmToken, payload);
                        return;
                    }).catch(error => { return });
            });
        });
    
    

    뭐야 이 포인트



    샘플에. 그래서 userId와 연결하여 식별할 수 있도록 했습니다.
    fcmTokens
    │
    ├── fcmToken(id: uid)
    │   └── fcmToken
    .       
    .    
    

    우선 const allTokens = await admin.firestore().collection('fcmTokens').get(); 의 인수에 컬렉션을 지정합니다. 이번에는 테이블에 새로운 문서가 추가되었을 때 발화하고 싶기 때문에 functions.firestore.document() 를 호출하고 있습니다.
    그 외에도 onCreate() , onUpdate() 등 다양한 트리거가 있습니다. 자세한 내용은 여기 .

    그리고 onDelete() 에 통지의 설정을 합니다.
    payload 라는 컬렉션에서 fcmtoken을 얻을 수 있습니다. RealtimeDB보다 편리한 느낌.

    마지막으로 fcmTokens 에서 취득한 사용자의 토큰에 정리해 push 통지를 송신하고 있습니다.

    3. Deploy


    $ firebase deploy
    

    어쩐지 죽으면 로그를 확인하고 조금 고쳐 갑시다.

    4. Test



    파이썬에서 Firestore에 새 문서를 추가하려고합니다.
    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import firestore
    
    
    cred = credentials.Certificate()
    firebase_admin.initialize_app()
    db = firestore.client()
    
    notification_data = {
        "text": "MY FIRST STORY",
        "users": ["gHrdAxQhFYdTmoFjgi8RX8PljXv1"]
    }
    
    db.collection(u'notifications').document().set(notification_data)
    

    어떤 장치에 push 알림이 오면 오케이. 타쿠 TV 보고 있었던 것은 비밀.



    코드는 여기

    좋은 웹페이지 즐겨찾기