Локализация пуш-сообщений в мобильных приложениях

  • Tutorial
Получив на поддержку очередной проект бэкенда мобильного приложения, я, к сожалению, столкнулся с тем, что массовая рассылка пуш-сообщений в топики (topics) не локализована. В интернете я также не нашел подробного материала по этому вопросу. И все, что я нашел, относилось к локализации на стороне клиента, а это не всегда удобно, т.к. требует заранее определить все возможные варианты сообщений и создать для них ресурсные файлы со всеми возможными переводами.

В своем сообщении я расскажу, как можно сделать локализацию пуш-сообщений в топиках на стороне бэкенда мобильного приложения.

Я буду в примерах использовать библиотеку firebase-admin для node.js.

Предположим, нам необходимо отправить пуш-сообщение о публикации новости в приложении. Естественно, что это лучше всего сделать через топик. В настоящее время подписывать устройство на топик можно с сервера:

admin.messaging().subscribeToTopic(tokens, 'news'),

Итак, вы подписали устройство на новости. Но есть проблема. Все клиенты, вне зависимости от выбранной локали, получат один и тот же текст пуш-сообщения. Тут на помощь может придти относительно новая возможность firebase — отправка сообщений с фильтрами.

Это реализовать очень просто. При смене клиентом локали приложения, необходимо подписать клиента на топик с новой локалью и (увы) отписать от топика с предыдущей локалью

 admin.messaging().subscribeToTopic(tokens, req.prams.lang),
 admin.messaging().unsubscribeFromTopic(user.lang),
 user.save({ lang: req.prams.lang });

Теперь, все, что осталось сделать — отправить сообщения в топики с заданными фильтрами:

 admin.messaging().send({ ...payloadRu, condition: "'news' in topics && 'ru' in topics" }),
 admin.messaging().send({ ...payloadEs, condition: "'news' in topics && 'es' in topics" }),
 admin.messaging().send({ ...payloadEn, condition: "'news' in topics && 'en' in topics" }),

Такое вот нехитрое сообщение получилось, в отличие от того, что мне предстоит с делать по рефакторингу проекта. Потому собственно и сообщение.

apapacy@gmail.com
20 октября 2019 года
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 4

    0

    А чем локализация пушей на стороне бекенда должна отличаться от любой другой локализации на стороне бекенда?

      0

      В данной статье описывается как можно отправить в топик клиенту сообщение через пересечение двух топиков news & locale. В этом смысл предлагаемой локализации. Например когда сообщения до firebase отправлялись через google cloud messaging то там не было возможности отправки сообщений на пересечение двух топиков. Поэтому аналогичный вариант можно было достигнуть или подписавшись с клиента на топик с конкретной локалью или же создав на сервере группу девайсов и послав сообщение в эту группу. Последний вариант отсутствует в api firebase хотя поддерживается для совместимости. Но появилась новая возможность посылать сообщение на conditions вместо топика

        +1

        А если топику не выставили язык, или не все поддерживаемые языки выставили — клиент ничего не получит? А если клиент переключит язык — он снова получит те же самые уведомления?

          0

          Если говорить о конкретных кейсах, я например делаю так. Локаль присутсвует в каждом запросе клиента. Кроме того есть отдельное api на смену локали на которое я особенно не рассчитаю тк на момент вызова может отсутствовать интернет. При смене локали клиентом или устройством я изменяю сохранённую текущую локаль на новую и тут же подписываю клиента на новую локаль и отписываю от старой локали. Конечно есть небольшая вероятность о том что сообщение протиснется в тот промежуток когда активны две локали или не активна ни одна из локалей. В этом случае я наверное сделал бы дополнительно запаздывание на несколько секунд отписывается от подписки. При этом остаётся вероятность получения пуша сразу на двух локалях. Но по крайней мере все сообщения будут доставлены.

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое