#android #pubnub
#Android #pubnub
Вопрос:
Я подписываюсь на все необходимые каналы в 2 местах:
// For receiving real time (regular) messages
pubnub.subscribe().channels(channels).execute();
и для Push
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())...
Ожидаемое поведение:
- Когда клиент Android находится на переднем плане, сообщения доставляются в режиме реального времени
- Когда приложение было закрыто / убито, сообщения доставляются как Push
Текущее поведение:
Когда приложение запущено, сообщения доставляются как в виде Push (вызывается метод службы Firebase Push)
, так и в режиме реального времени ( public void message(@NotNull PubNub pubnub, @NotNull PNMessageResult message)
вызывается метод)
Что я делаю не так? Не удалось найти ничего об этом в официальной документации.
Ответ №1:
PubNub Сообщения в реальном времени и мобильные Push-уведомления
подпишитесь на все необходимые каналы в 2 местах
Во-первых, чтобы сохранить терминологию в порядке, вы подписываетесь на каналы для сообщений в режиме реального времени и регистрируете устройства в каналах для мобильных push-уведомлений. Подписка применяется только к сообщениям в режиме реального времени. Это придирка, но важно прояснить ситуацию, когда мы говорим об этом.
И да, каждый раз, когда вы публикуете сообщение, содержащее полезную нагрузку для мобильных устройств, оно доставляется активным подписчикам канала и доставляется в виде мобильного push-уведомления на устройства, зарегистрированные для push на этом канале. Это ожидаемо и необходимо.
Хитрость в том, что когда приложение находится на переднем плане (активно), вы просто не отображаете push-уведомление, потому что вы получили его в обработчике addListener''s
сообщений.
Итак, вопрос в том, как выглядит ваш обработчик «mobile push message receiver»?
Вот действительно старый блог / видео, который объясняет все это. Хотя ему уже более 5 лет, он по-прежнему актуален.
Комментарии:
1. Спасибо, теперь все понятно с терминологией. Я просто ожидал другого поведения от PubNub. Раньше я думал, что PubNub попытается доставить сообщение через Push-канал, только если доставка сообщений через подписной канал сейчас недоступна (приложение было убито). Таким образом, одновременно используется только один способ доставки. В статье 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
2. Мне нужна одна простая вещь — я хочу, чтобы сообщения доставлялись независимо от того, в каком состоянии находится приложение. Вот почему я всегда буду включать push-полезную нагрузку. Мой вопрос — есть ли какой-нибудь способ заставить PubNub использовать только 1 метод одновременно? Например. когда приложение активно / активно — тогда только через подписной канал.
3. Нет, не совсем. Из-за ограничений TCP / HTTP вы не можете точно знать, действительно ли устройство подключено или нет в любом данном экземпляре. Вот почему есть что-то, что называется
presenceTimeout
. Если сеть устройства отключается или устройство просто внезапно отключается, то нет гарантированного способа узнать, что они действительно ушли в этот момент. В некоторых сценариях, да, вы можете знать, что это осталось, но только не в каждом сценарии. Поэтому вы не можете выполнитьif connected, send via realtime, else send via push notification
оптимизацию типа. Если бы вы могли, мы бы это сделали.4. Кроме того, почему получение push-уведомления «независимо от того, что» является проблемой. У нас есть клиенты большого размера, использующие это без проблем. Опять же, просто игнорируйте push-уведомление, когда приложение активно / подписано.