【问题标题】:PubNub - Messages are received both as Push and as realtime [Android]PubNub - 消息以推送和实时方式接收 [Android]
【发布时间】:2021-02-10 20:48:38
【问题描述】:

我在两个地方订阅了所有必要的频道:

// For receiving real time (regular) messages
pubnub.subscribe().channels(channels).execute();

对于推送

pubnub.addPushNotificationsOnChannels()
                            .pushType(PNPushType.FCM)
                            .channels(channels)
                            .deviceId(firebaseMessageingTokenForThisUser)

当我发送消息时,我也会为 Push 指定数据:

PushPayloadHelper pushPayloadHelper = new PushPayloadHelper();

// set FCM payload
pushPayloadHelper.setFcmPayload(fcmPayload);

// Set APNs payload
pushPayloadHelper.setApnsPayload(apnsPayload);

// Common payload for realtime PubNub subscribe
Map<String, Object> commonPayload = new HashMap<>();
commonPayload.put("message", jsonPayload);
pushPayloadHelper.setCommonPayload(commonPayload);

pubnub.publish()
                .channel(channelName)
                .message(pushPayloadHelper.build())...

预期行为:

  1. 当 Android 客户端在前台时,消息会实时传递
  2. 当应用程序关闭/终止时,消息作为推送传递

当前行为:

当应用程序运行时,消息以 Push 方式传递(调用 Firebase Push 服务方法)
实时(public void message(@NotNull PubNub pubnub, @NotNull PNMessageResult message) 方法被调用)

我做错了什么?在官方文档中找不到任何相关信息。

【问题讨论】:

    标签: android pubnub


    【解决方案1】:

    PubNub 实时消息传递和移动推送通知

    在两个地方订阅所有必要的频道

    首先,为了保持术语井井有条,您订阅频道以获取实时消息并注册设备移动推送通知频道上的。订阅仅适用于实时消息。当我们谈论这个时,保持清楚是一个挑剔但很重要的事情。

    是的,每次您发布包含移动推送负载的消息时,它都会传递给频道的活动订阅者,并作为移动推送通知传递给在该频道上注册推送的设备。这是预期和必要的。

    诀窍在于,当应用程序处于前台(活动)时,您只是不显示推送通知,因为您在 addListener''s message` 处理程序中收到了它。

    所以问题是,您的“移动推送消息接收器”处理程序是什么样的?

    这是really old blog/video that explains all this。虽然它已超过 5 年,但它仍然具有相关性。

    【讨论】:

    • 谢谢,现在用术语一切都清楚了。我只是期待 PubNub 的不同行为。我曾经认为 PubNub 会尝试通过推送通道来传递消息,前提是现在无法通过订阅通道传递消息(应用程序被杀死)。 所以一次只有一种交付方式。 在 5 年前的文章中有以下几行:For example, if you were to register on an APNS channel on Apple’s network, but if we also subscribe to a PubNub channel, we’ll receive the data on both of the networks depending on the state of the application
    • 我需要一件简单的事情——无论应用程序处于什么状态,我都希望消息能够被传递。这就是为什么我将始终包含推送有效负载的原因。我的问题 - 有没有办法让 PubNub 一次只使用一种方法?例如。当应用程序处于活动/活动状态时 - 仅通过订阅频道。
    • 不,不是。由于 TCP/HTTP 的限制,您无法确定在任何给定实例中设备是否实际连接。这就是为什么有一个叫做presenceTimeout 的东西。如果设备的网络中断或设备突然离开,则无法保证知道他们当时确实离开了。在某些情况下,是的,您可以知道它离开了,但不是所有情况。因此,您不能进行 if connected, send via realtime, else send via push notification 类型优化。如果可以,我们会的。
    • 此外,为什么接收推送通知“无论如何”都是一个问题。我们有大型客户毫无问题地使用它。同样,当应用程序处于活动/订阅状态时,只需忽略推送通知。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多