如何避免用户在Pubnub上收到自己的聊天GCM通知

4
我们使用PubNub API在PhoneGap上创建了一个聊天应用程序。我们使用一个共同的唯一频道来让两个用户(比如A和B)发送和接收消息。

此外,我们还启用了PubNub GCM通知,以便用户在应用程序处于后台或关闭状态时可以接收通知。

现在,当用户A向B发送PubNub消息并立即更改应用程序或隐藏它时,用户A本人也会收到自己消息的GCM通知。

这是唯一困扰我们的问题。其他都正常工作。
2个回答

0

我遇到了与你类似的问题,所以我拼凑了一些东西让它对我有用。

private boolean isFromSelf(final Object msgSent){
    boolean isEcho = false;
    String msgText = msgSent.toString();
    JSONObject j;
    String receiver = currentUserId; //a unique string ID for each user
    try
    {
        j = new JSONObject(msgText);
        String senderID = j.get("senderID").toString();
        if (senderID.equals(receiver)){
            isEcho = true;
    }
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }

        return isEcho;
}

它假设每个发布消息到频道的用户都会在负载中发送他们的唯一ID作为“senderID”。然后,当接收到消息时,从负载中提取它并将其与用户的ID进行检查。因此,当我接收到消息时,我首先调用isFromSelf方法,如下所示:

pN = new Pubnub(pub_key, sub_key);
    try {
        pN.subscribe(CHANNEL_NAME, new Callback() {
            public void successCallback(String channel, Object msg) {

                if (!isFromSelf(msg)) {
                    //Now add here what you want to do with the message
                }
            }

            public void errorCallback(String channel, PubnubError error) {
                Toast.makeText(MainActivity.this, "there was an error connecting", Toast.LENGTH_SHORT).show();
            }
        });
    } catch (PubnubException e) {
        e.printStackTrace();
    }

所以在你的情况下,也许可以组合一个senderID检查,这样如果你收到了来自自己的GCM,则不显示任何通知,即使应用程序在后台运行。


0
在您的订阅回调函数中,您能否检测应用程序是否不在前台,并且如果不在前台,则立即返回?
这样,只有当您处于前台时,接收到的消息才会传递到您的应用程序逻辑中,否则该逻辑就不会触发...?

在处理GCM通知的回调中,我们可以检测应用程序是在前台还是后台运行。但这并没有什么帮助!因为这部分代码只有在您点击接收到的通知时打开应用程序时才会运行。我说的是根本就没有接收到通知。因此,在回调中编写的任何代码都不会在应用程序在后台或关闭时运行。请提出其他建议。 - Sangeet Aggarwal
你正在使用在线状态功能吗? - Geremy
是的,我们正在使用“正在输入...”和在线/离线状态的存在功能,并像WhatsApp一样显示它们。如果你想使用存在功能来检测是否发送GCM部分,那行不通,因为存在检测无法快速检测到用户的实际存在。请知会。 - Sangeet Aggarwal
你能否增加客户端的心跳频率以减少出席检测时间? - Geremy
我已经将此作为功能请求提交,以过滤掉自己的消息。 - Craig Conover

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接