Probleme mit Firebase-Push-Benachrichtigungen, die Themen verwendenJavaScript

Javascript-Forum
Guest
 Probleme mit Firebase-Push-Benachrichtigungen, die Themen verwenden

Post by Guest »

Wir haben eine App für Kurznachrichten mit über 1L aktiven Nutzern in fünf Sprachen entwickelt. Benutzer erhalten Push-Benachrichtigungen basierend auf ihrer ausgewählten Sprache, ihrem Bundesland und ihrem Bezirk. Um dies umzusetzen, haben wir ein Firebase-Thema für jede Kombination aus Sprache, Bundesland und Bezirk erstellt.
Wir vermuten jedoch Probleme mit diesem Ansatz, weil:
Die tatsächliche Benutzerzahl für jedes Thema entspricht nicht den Erwartungen.
Die Engagement-Rate (Öffnungen) ist deutlich niedriger als erwartet.
Hier ist der Code, den wir zum Abonnieren von Benutzern für Themen und zum Versenden von Benachrichtigungen verwenden. Dazu gehört:
Benutzern Themen in Stapeln von 1.000 Registrierungs-Tokens abonnieren.
Senden einer Push-Benachrichtigung mithilfe der Firebase Cloud Messaging (FCM) API.

Code: Select all

try {

let topicName = `${data.language_id}-${pushData.state_id}-${pushData.dist_id}`
let success = 0
let failure = 0
let errors = []

function pushBatch(registration_ids) {
return new Promise(async (resolve, reject) => {
try {
const pntime = Date.now()
const response = await admin.messaging().subscribeToTopic(registration_ids, topic);
console.log("FCM push time", (Date.now() - pntime) / 1000, 'seconds')
return resolve(response)
} catch (error) {
console.error(error)
return resolve({ successCount: 0, failureCount: 0, errors: [] })
}
});
}

let pushPromises = []

for (let index = 0; index < tokens.length; index += 1000) {
pushPromises.push(pushBatch(tokens.slice(index, index + 1000)))
}

let current = Date.now()

console.log("Executing batch of", pushPromises.length)
const responses = await Promise.all(pushPromises)

for (const iterator of responses) {
success += iterator.successCount
failure += iterator.failureCount
errors = [...errors, iterator.errors]
}

console.log(`Subscribed to topic ${topic}, success: ${success}, failure: ${failure}`, (Date.now() - current) / 1000, 'seconds')

const accessToken = await getAccessToken();

const pushData = {
message: {
topic: topic,
data: {
post_id: `${data.post_id}`,
push_id: `${data.push_id}`,
language_id: `${data.language_id}`,
category_id: `${data.category_id}`,
title: `${data.title}`,
sent_at: `${data.sent_at}`,
draft_id: `${data.draft_id}`,
device_id: `${data.device_id}`,
tag: `${data.tag}`,
pn_title: `${data.pn_title}`,
pn_color: `${data.pn_color}`,
showPNTime: `${data.showPNTime}`,
image: `${data.image}`
},
apns: {
headers: {
"apns-priority": "5"
},
payload: {
aps: {
sound: "buzzer_message",
category: "AnyNewsApp"
}
}
},
webpush: {
headers: {
Urgency: "high"
}
}
}
};

const pushResponse = await axios.request({
method: 'post',
maxBodyLength: Infinity,
url: 'https://fcm.googleapis.com/v1/projects/anynews-2bffa/messages:send',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
},
data: pushData
})

return { success, failure, id: pushResponse.data.name }

} catch (error) {
console.error("Main PUSH error *****************", error)
}
Ist die Erstellung eines Themas für jede Sprach-, Bundesland- und Bezirkskombination der richtige Ansatz, oder gibt es eine bessere Alternative für die Verwaltung einer solch granularen Segmentierung?
Könnte es ein Problem mit der Art und Weise geben, wie wir Token stapelweise für Themen abonnieren?
Wie können wir die aktuelle Implementierung debuggen oder optimieren, um bessere Ergebnisse zu erzielen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post