【问题标题】:How to avoid a user receiving his own chat gcm notification on Pubnub如何避免用户在 Pubnub 上收到自己的聊天 gcm 通知
【发布时间】:2015-05-11 15:03:23
【问题描述】:

我们在 phonegap 上使用 pubnub api 创建了一个聊天应用程序。我们为两个用户(比如 A 和 B)使用一个共同的唯一通道来发送和接收消息。

此外,除此之外,我们还启用了 pubnub gcm 通知,以便用户可以在他们的应用程序处于后台或关闭时收到通知。

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

这是困扰我们的唯一问题。其余一切正常。

【问题讨论】:

    标签: android cordova pubnub


    【解决方案1】:

    在你的订阅回调中,能否检测应用程序是否不在前台,如果不在前台,则立即返回?

    这样,除非您在前台,否则将接收到的消息传递到您的应用程序逻辑的逻辑根本不会触发...?

    【讨论】:

    • 是的,在gcm通知的回调中,我们可以检测应用程序是在前台还是后台。但这不会有帮助!因为这部分代码仅在您点击收到的通知时打开应用程序时运行。我说的是根本没有收到通知。因此,当应用程序在后台或关闭时,基本上我在回调中编写的任何代码都不会运行。请提出其他建议。
    • 您在使用状态功能吗?
    • 是的,我们正在使用在线状态功能来检测“正在输入..”和在线/离线状态,并像 whatsapp 一样显示。如果您正在考虑使用存在来检测是否发送 gcm 部分,它不会起作用,因为存在检测不够快,无法检测到用户的实际存在。请告诉。
    • 能否增加客户端的心跳以减少存在检测时间?
    • 我已将此作为功能请求提交,以过滤给自己的消息。
    【解决方案2】:

    我遇到了与您相同的类似问题,因此我将一些对我有用的东西组装在一起。

    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,即使应用程序在后台,也根本不显示通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多