如何使用 FirebaseMessaging 的 sendToDevice 方法的响应来查找给定令牌数组中的哪个索引是错误的?

How do I use the response from sendToDevice method of FirebaseMessaging to find which index in the given tokens array was erroneous?

我正在 Cloud Function (Node Js) 中调用 Firebase Cloud Messaging (FCM) 的方法 sendToDevice

我用多个令牌传递令牌参数,例如[token1, token2, ... ]

然后我收到了 response 类型 MessagingDevicesResponse

代码是这样的:

//Array of Strings. token1-3 are strings
const tokens = [token1, token2, token3]; 

await admin
       .messaging()
       .sendToDevice(tokens, payload)
       .then((response) => { // response is type MessagingDevicesResponse

         for (let i = 0; i < response.results.length; i++) {
           const res = response.results[i];
                
           if(res.error) {
              //* If error found on index i
              //*** Do something to delete the non-registered token

           }
         }
         return { success: true };
       })
       .catch((error) => {
         console.error(
           `Error while sending notification. Code: ${error.code}, Error: ${error}`);
         return { error: error };
       });

现在,如您所见,tokens 变量是一个字符串数组。 因此,response.results 也 return 与 tokens 的长度相同。 但问题是,response.results 中的索引是否映射到与 tokens 相同的索引?

我的意思是,response.results[0]是否意味着它是向带有tokens[0]中的令牌的设备发送通知的结果,等等?

谢谢

是的,response.results 数组中的元素与 tokens 数组中的元素排列顺序相同。

这之前已记录在案,显然已被删除。请参阅此 GitHub Issue thread 的最后一条评论。

另请查看此 Cloud Function sample,它完全符合您的要求(即删除未注册的令牌)

最好先验证所有注册令牌,然后在发送之前删除无效的令牌。可以 post 每个 500 个注册令牌的块和“未知”的(如果有的话)并不是真正的“无效”,但确实属于另一个项目。一般来说,这需要一些内务管理,例如。最近刚刚清除了 27.5% 的注册令牌,因为它们不再有效。