Construí un sistema de notificaciones automáticas en mi backend usando expo-server-sdk-node . Cuando quiero enviar notificaciones, busco el expoPushToken en mi base de datos. Los documentos indican que se deben manejar los siguientes errores:
DeviceNotRegistered: el dispositivo ya no puede recibir notificaciones automáticas y debe dejar de enviar mensajes al token de inserción Expo correspondiente.
Sin embargo, no estoy seguro de cómo manejar este error ya que no hay pushTokens directos disponibles en el mensaje de error. Vea el siguiente ejemplo:
[{ status: 'error', message: '"ExponentPushToken[XXXXXXXXXXXXXXX]" is not a registered push notification recipient', details: { error: 'DeviceNotRegistered' } }] Este dispositivo ahora debería eliminarse de mi base de datos, pero para hacerlo necesito el valor ExponentPushToken[XXXXXXXXXXXXXXX] . Y como las notificaciones se envían por lotes, pierdo la referencia al usuario. ¿Cuál es la forma apropiada de hacer esto?
Pensé en las siguientes dos formas:
1: Simplemente split(") y filtre el valor, pero esto depende del mensaje de error.
2: Recorra todos mis pushTokens y encuentre dónde includes(originalValue) en message , pero esto significaría que tendría que recorrer una cantidad excesiva de usuarios cada vez que falla.
¿Alguna recomendación?
Enfrenté el mismo problema, y esto es lo que hice.
Teniendo en cuenta este código
for (let chunk of chunks) { try { let ticketChunk = await expo.sendPushNotificationsAsync(chunk); console.log(ticketChunk); tickets.push(...ticketChunk); // If a ticket contains an error code in ticket.details.error // } catch (error) { console.error(error); } }ticket.status === 'error' y ticket.details.error === 'DeviceNotRegistered' como en el código anterior. for (let chunk of chunks) { try { let ticketChunk = await expo.sendPushNotificationsAsync(chunk); tickets.push(...ticketChunk); // If a ticket contains an error code in ticket.details.error let ticketIndex = 0; for (let ticket of tickets) { if (ticket.status === 'error' && ticket.details.error === 'DeviceNotRegistered') { // Get the expo token from the `chunk` using `ticketIndex` // Unsubscribe the token or do whatever you want to } ticketIndex++; } } catch (error) { console.error(error); } }NB: El código puede contener errores de sintaxis, es la idea que estoy tratando de transmitir. Hice lo mismo con php