0

Ich benutze Firebase Cloud-Funktionen, um einen Benutzer Push-Benachrichtigungen zu senden. Ich verstehe JS nicht gut, aber ich möchte in der Lage sein, die App-Badge-Nummer automatisch durch die Benachrichtigungsnutzlast zu erhöhen und die Nummer für jede empfangene Benachrichtigung um 1 zu erhöhen. Das habe ich jetzt. Ich habe die Dokumentation für firebase gelesen, aber ich glaube nicht, dass ich genug JS verstehe, um herauszufinden, was sie beschreiben.Wie App-Ausweisnummer für jede Push-Benachrichtigung erhöht

exports.sendPushNotificationLikes = functions.database.ref('/friend-like-push-notifications/{userId}/{postId}/{likerId}').onWrite(event => { 
const userUid = event.params.userId; 
const postUid = event.params.postId; 
const likerUid = event.params.likerId; 
if (!event.data.val()) { 
    return; 
} 

// const likerProfile = admin.database().ref(`/users/${likerUid}/profile/`).once('value'); 

const getDeviceTokensPromise = admin.database().ref(`/users/${userUid}/fcmToken`).once('value'); 

// Get the follower profile. 
const getLikerProfilePromise = admin.auth().getUser(likerUid); 

return Promise.all([getDeviceTokensPromise, getLikerProfilePromise]).then(results => { 
    const tokensSnapshot = results[0]; 
    const user = results[1]; 

    if (!tokensSnapshot.hasChildren()) { 
     return console.log('There are no notification tokens to send to.'); 
    } 

    const payload = { 
     notification: { 
      title: 'New Like!', 
      body: '${user.username} liked your post!', 
      sound: 'default', 
      badge: += 1.toString() 
     } 
    }; 

    const tokens = Object.keys(tokensSnapshot.val()); 

    // Send notifications to all tokens. 
    return admin.messaging().sendToDevice(tokens, payload).then(response => { 
      // For each message check if there was an error. 
      const tokensToRemove = []; 
     response.results.forEach((result, index) => { 
      const error = result.error; 
     if (error) { 
      console.error('Failure sending notification to', tokens[index], error); 
      // Cleanup the tokens who are not registered anymore. 
      if (error.code === 'messaging/invalid-registration-token' || 
       error.code === 'messaging/registration-token-not-registered') { 
       tokensToRemove.push(tokensSnapshot.ref.child(tokens[index]).remove()); 
       } 
      } 
     }); 
     return Promise.all(tokensToRemove); 
    }); 
}); 

});

Vielen Dank im Voraus für jede Hilfe

Antwort

0

dies Unter der Annahme, ist die Linie in Frage:

badge: += 1.toString() 

Vorsichtige Annahmen Typumwandlung. Wenn Sie "1" + "1" hinzufügen, erhalten Sie "11", nicht "2". Warum nicht versuchen, so etwas wie:

badge: `${targetUser.notificationCount + 1}` 

Das die notificationCount wird unter der Annahme, ist ein Schlüssel in Ihrem Schema, und dass es als Zeichenfolge eingegeben wird. Sie werden das Ziel des Benutzers Benachrichtigung Zählung anhalten müssen irgendwo so kann erhöht werden, wenn eine neue Meldung kommt es auch eine ganze Zahl sein könnte und dann die Zeichenfolge Interpolation ist nicht notwendig, das heißt:.

badge: targetUser.notificationCount + 1 

Beachten Sie außerdem, dass Ihre String-Interpolation in Backticks anstelle von einfachen Anführungszeichen hier gewickelt werden muss, das heißt:

body: `${user.username} liked your post!` 

ich kann nicht sagen, wie die Interaktionen in Ihrer Datenbank abgebildet werden. Dieser Ansatz erfordert das Fortsetzen und Aktualisieren der Benachrichtigungsanzahl des Zielbenutzers.

+0

Ich bin nicht sicher, ob ich verstehe, was Sie meinen: „Auch darüber im Klaren sein, dass Ihre String-Interpolation hier in Backticks statt einzeln verpackt werden muss, Zitate, zB: " Sind sie nicht schon richtig verpackt? Aber ja, das hat mir "undefined" anstelle des Usernamens gegeben. – Chris

+0

In deinem obigen Beispiel für den '' body''' Wert verwendest du einfache Anführungszeichen. Das '' '$ {}' '' wird nur als regulärer String behandelt. Sie müssen den Backtick (über der Tabulatortaste) verwenden, damit die Zeichenfolgeninterpolation funktioniert. ('vs ') Wenn Sie eine IDE verwenden, sollte sich auch die Hervorhebung des Materials innerhalb der' '' $ {} '' 'ändern. [MDN-Dokumente für Vorlage-Literale] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) – DILP

1

ich dies zu raten ist, was das Problem ist:

const payload = { 
    notification: { 
     title: 'New Like!', 
     body: '${user.username} liked your post!', 
     sound: 'default', 
     badge: += 1.toString() 
    } 
}; 

Angenommen, Sie eine Benachrichtigung Eigenschaft count haben in Ihrem Schema sagen notificationCount dann können Sie dies tun:

const payload = { 
    notification: { 
     title: 'New Like!', 
     body: `${user.username} liked your post!`, 
     sound: 'default', 
     badge: Number(notificationCount++) // => notificationCount + 1 
    } 
}; 

auch auf Diese body: '${user.username} liked your post!' wird als "user.username like your post!" gespeichert. Dies ist nicht das Verhalten, das Sie wollen, was sollten Sie dies tun, ist:

body: `${user.username} liked your post!`