如何使用 Java GCM API 在 android 设备上获取失败推送通知的注册 ID

Posted

技术标签:

【中文标题】如何使用 Java GCM API 在 android 设备上获取失败推送通知的注册 ID【英文标题】:How to get registration id of failure push notification on android device using Java GCM API 【发布时间】:2017-09-18 10:49:19 【问题描述】:

我使用 GCM API 在 Java 中实现了以下代码,以便在 android 设备上发送通知。

    Sender sender = new Sender(GCM_API_KEY);
    Message.Builder builder = new Message.Builder();
    builder.collapseKey(collpaseKey);
    builder.timeToLive(TTL_HOURS * 3600);
    if (data != null) 
        for (PushData messageData : data) 
            builder.addData(messageData.getKey(), messageData.getValue());
        
    
    if (StreamType.CALL == type) 
        for (PushData pushData : message) 
            builder.addData(pushData.getKey(), pushData.getValue());
        
    
    Message msg = builder.build();
    try 
        System.out.println(msg.toString());
        MulticastResult result = sender.send(msg, pushId, MAX_RETRY);
        log.infof("result %s", result.toString());
        return true;
    

这里pushId是List的类型,里面包含了所有设备的push id,在那个时候,要发送通知。

问题是,结果不包含失败推送 ID 或任何设备标识,以便我可以识别哪个设备没有收到通知。 注意:- 我不想一一发送通知

响应 - 结果

MulticastResult(multicast_id=7588781423174816193,total=5,success=1,failure=4,canonical_ids=0,结果: [[错误代码=未注册],[ messageId=0:1505731620878025%f02bfbe47eeff668], [ 错误代码=未注册],[错误代码=未注册],[ errorCode=未注册]]

其中不包含任何注册 ID 或其他内容,以便我可以在 db 中识别设备。

请建议, 提前致谢。

【问题讨论】:

【参考方案1】:

响应间接告诉您推送 ID 失败。

在你的例子中:

[[ errorCode=NotRegistered ], 
 [ messageId=0:1505731620878025%f02bfbe47eeff668 ], 
 [ errorCode=NotRegistered ],
 [ errorCode=NotRegistered ], 
 [ errorCode=NotRegistered ]]

您可以看到第 1、3、4 和 5 次推送 ID 失败。由于您应该知道您在请求中发送推送 ID 的顺序,因此您应该知道哪些推送 ID 失败。

这是来自documentation 的相关示例:

以下是 6 个收件人(ID 4、8、15、16、23 和 42)的 JSON 结果 分别)成功处理了 3 条消息,1 条规范消息 注册令牌返回,3 个错误:

"multicast_id": 216, "success": 3, "failure": 3, "canonical_ids": 1, "results": [ "message_id": "1:0408" , “错误”:“不可用”, “错误”:“无效注册”, "message_id": "1:1516" , "message_id": "1:2342", "registration_id": "32" , “错误”:“未注册” ]

在这个例子中:

第一条消息:成功,不需要。 第二条消息:应该重新发送(到注册令牌 8)。 第三条消息:出现不可恢复的错误(可能数据库中的值已损坏)。 第四条消息:成功,不需要任何东西。 第五条消息:成功,但是注册令牌应该在服务器数据库中更新(从 23 到 32)。 第六条消息:注册令牌 (42) 应从服务器数据库中删除,因为应用程序已从 设备。

【讨论】:

以上是关于如何使用 Java GCM API 在 android 设备上获取失败推送通知的注册 ID的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 GCM 和 java 向多个设备发送推送通知

gcm 被微信弃用的原因

GCM 通知 setAutoCancel(true) 在 Android 5.1.1 中不起作用

如何获取 GCM API Key,菜单中没有注册的应用程序

如何在基于 Java 的应用服务器上使用 GCM 向 iOS 设备发送推送通知

(iOS) GCM 静默推送通知以在应用程序终止时触发调用另一个 API