0

管理者が特定のトピックに登録されているユーザーにアラートを送信できるモバイルアプリケーション(AndroidおよびiOS向け)を導入しています。これを行うために、Realtime Databaseを使用してアラートを保存し、トピックに通知を送信するクラウド機能を使用しています。Firebase Admin SDK sendToTopicが機能しない

私は、次のクラウド機能に展開しました:私は、リアルタイムデータベースに新しいメッセージを挿入すると、上記の機能が正しく(firebaseコンソール上)のログセクションにそのメッセージをフェッチ

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

admin.initializeApp(functions.config().firebase); 

exports.sendNewAlertNotification = functions.database.ref('/alerts').onWrite(event => { 
    const getValuePromise = admin.database() 
     .ref('alerts') 
     .orderByKey() 
     .limitToLast(1) 
     .once('value'); 

    return getValuePromise.then(snapshot => { 
     const { text, topics, author } = snapshotToArray(snapshot)[0]; 

     const payload = { 
      data: { 
       title: 'Avviso', 
       body: text, 
       icon: 'ic_stat_notify', 
       sound: 'default', 
       color: '#F3E03B', 
       tag: 'alerts', 
       ticker: 'Nuovo avviso', 
       subtitle: 'Avvisi', 
       author: JSON.stringify(author) 
      } 
     }; 

     const options = { 
      priority: 'high', 
      timeToLive: 60 * 60 * 24 * 2, // 48 hours 
      collapseKey: 'it.bmsoftware.caliup' 
      // contentAvailable: true 
     }; 

     if (topics.length > 1) { 
      let condition = ''; 
      topics.forEach((topic, index) => { 
       condition += `'${topic}' in topics` 

       if (index < topics.length - 1) { 
        condition += ' || ' 
       } 
      }); 
      console.log(`Sending alert to condition '${condition}' -> ${JSON.stringify(payload)}`); 
      return admin.messaging().sendToCondition(condition, payload, options); 
     } else if (topics.length === 1) { 
      let topic = topics[0]; 
      console.log(`Sending alert to topic '${topic}' -> ${JSON.stringify(payload)}`); 
      return admin.messaging().sendToTopic(topic, payload, options); 
     } else { 
      console.log(`No topics found`); 
     } 
    }); 
}); 

const snapshotToArray = (snapshot) => { 
    let result = [] 
    if (!snapshot || !snapshot.val()) 
     return result 

    snapshot.forEach((childSnapshot) => { 
     let item = childSnapshot.val() 
     item.key = childSnapshot.key 
     result.push(item) 
    }) 

    return result 
} 

をI正しいカスタムログと、status 'ok'というログを参照してください。

これにもかかわらず、通知はデバイスに届きません。 firebaseコンソールから同じトピックを直接テストすると、デバイスが正しく登録されるので、正常に動作します。

雲機能に問題がありますか?

答えて

0

少なくともiOSの場合、dataのペイロードのみを送信する場合は、// contentAvailable: trueのコメントを解除する必要があります。こうすることで、アプリコードで通知を表示してトリガーすることができます。データペイロードを処理しなくても通知がポップアップされるようにするには、ペイロードにnotificationオブジェクトを渡す必要があります。

通知は以下のフィールドに限定されています。https://firebase.google.com/docs/reference/admin/node/admin.messaging.NotificationMessagePayload

関連する問題