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)
}
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?