1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/twofloor-uniapp-admin

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
PUSH_MESSAGE.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 16.03.2025 18:15 e185f4e
title: "Схема отправки push-сообщений в uni-app"
author: silianpan
date: 2019-11-05
output: word_document

Схема отправки push-сообщений в uni-app

Основание

uni-app поддерживает отправку push-сообщений, см. следующие документы:

Обзор UniPush

Руководство по использованию UniPush

[Руководство по активации UniPush](https://ask.dcloud.net.cn/article/ Yöntem 35716)

Как настроить иконку для push-сообщений?

Использование UniPush в uni-app

Эффект

Открытый проект uniapp-admin

Требования

Пользователи разных ролей получают различные напоминания о задачах при входе в приложение. То есть тот, кто выполняет задачу, получает это напоминание. Отправка напоминаний о задачах пользователям различных ролей

Шаги реализации

4.1 Изучение документации Getui

Поскольку push-уведомления в uni-app используют Getui, следует изучить документацию Getui.

Так как сервер написан на Java, то посмотрите руководство по интеграции Java

uni-push

mvn install:install-file -Dfile="gexin-rp-fastjson-1.0.0.3.jar" -DgroupId=com.gexin.platform -DartifactId=gexin-rp-fastjson -Dversion=1.0.0.3 -Dpackaging=jar mvn install:install-file -Dfile="gexin-rp-sdk-base-4.0.0.30.jar" -DgroupId=com.gexin.platform -DartifactId=gexin-rp-sdk-base -Dversion=4.0.0.30 -Dpackaging=jar mvn install:install-file -Dfile="gexin-rp-sdk-http-4.1.0.5.jar" -DgroupId=com.gexin.platform -DartifactId=gexin-rp-sdk-http -Dversion=4.1.0.5 -Dpackaging=jar mvn install:install-file -Dfile="gexin-rp-sdk-template-4.0.0.24.jar" -DgroupId=com.gexin.platform -DartifactId=gexin-rp-sdk-template -Dversion=4.0.0.24 -Dpackaging=jar mvn install:install-file -Dfile="protobuf-java-2.5.0.jar" -DgroupId=com.google.protobuf -DartifactId=protobuf-java -Dversion=2.5.0 -Dpackaging=jar


```xml
<!-- uni push -->
<dependency>
    <groupId>com.gexin.platform</groupId>
    <artifactId>gexin-rp-sdk-base</artifactId>
    <version>4.0.0.30</version>
</dependency>
<dependency>
    <groupId>com.gexin.platform</groupId>
    <artifactId>gexin-rp-sdk-template</artifactId>
    <version>4.0.0.24</version>
</dependency>
<dependency>
    <groupId>com.gexin.platform</groupId>
    <artifactId>gexin-rp-sdk-http</artifactId>
    <version>4.1.0.5</version>
</dependency>
<dependency>
    <groupId>com.gexin.platform</groupId>
    <artifactId>gexin-rp-fastjson</artifactId>
    <version>1.0.0.3</version>
</dependency>
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>2.5.0</version>
</dependency>

4.2 Создание простого примера серверной частиСледуя руководству по настройке UniPush, активируйте UniPush и получите appId, appKey и другие данные. Напишите следующий простой пример, и клиентская часть будет получать сообщения!

Код приема сообщений на стороне клиента см. в разделе 4.3

public class AppPush {

    // ШАГ 1: Получение основной информации о приложении
    private static String appId = "";
    private static String appKey = "";
    private static String masterSecret = "";
    private static String url = "http://sdk.open.api.igexin.com/apiex.htm";

    public static void main(String[] args) throws IOException {

        IGtPush push = new IGtPush(url, appKey, masterSecret);

        Style0 style = new Style0();
        // ШАГ 2: Установка заголовка и содержимого уведомления
        style.setTitle("Введите заголовок уведомления");
        style.setText("Введите содержимое уведомления");
        // Примечание: используется стандартное изображение
        // style.setLogo("push.png");  // Установка изображения уведомления
        // ШАГ 3: Установка звуковых эффектов и вибрации
        style.setRing(true);  // Включение звука
        style.setVibrate(true);  // Включение вибрации

        // ШАГ 4: Выбор шаблона уведомления
        NotificationTemplate template = new NotificationTemplate();
        template.setAppId(appId);
        template.setAppkey(appKey);
        template.setStyle(style);
        // Открытие приложения при нажатии на уведомление
        template.setTransmissionType(1);
        // Передача пользовательского сообщения
        template.setTransmissionContent("Пользовательское сообщение, может быть JSON-строка");
}
``````markdown
#### 4.3 Добавление логики обработки сообщений в App.vue клиента```js
/**
  * Обработка推送消息
  */
handlePush() {
  // #ifdef APP-PLUS
  const _self = this;
  const _handlePush = function(message) {
    // 获取用户数据
    let payload = message.payload;
    try {
      // 解析JSON
      payload = JSON.parse(payload);
      // 跳转到页面并传递用户数据
      uni.navigateTo({
        url: '/pages/xxx?data=' + JSON.stringify(payload),
      });
    } catch (e) {}
  };
  // 添加事件监听器
  plus.push.addEventListener("click", _handlePush);
  plus.push.addEventListener("receive", _handlePush);
  // #endif
},

5. Размышления

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

На самом деле, независимо от того, является ли это одиночной или групповой отправкой, цель отправки — это clientid, который идентифицирует каждого клиента.


### 6. Конечное решение

#### 6.1 Получение **clientid** клиента

После изучения материалов было выявлено, что существует API `getClientInfo`, который позволяет получить информацию о клиенте. Однако его использование требует условной компиляции, так как он относится к интерфейсу plus.

Ниже представлен код, который при завершении входа пользователя собирает информацию о клиенте (`appid`, `appkey`, `clientid`), информацию о пользователе (`имя пользователя`, `роль`) и другие данные, а затем отправляет запрос API на сервер для сохранения информации о связях между `clientid` и ролью пользователя.

```js
// Сохранение clientid на сервере
// #ifdef APP-PLUS
const clientInfo = plus.push.getClientInfo();
let pushUser = {
  clientid: clientInfo.clientid,
  appid: clientInfo.appid,
  appkey: clientInfo.appkey,
  userName: 'Имя пользователя',
  userRole: 'Роль пользователя'
};
// Отправка запроса API для сохранения информации о роли пользователя на сервере
Vue.prototype.$minApi.savePushUser(pushUser);
// #endif

6.2 Обработка информации о роли пользователя на сервере

Сервер принимает информацию и сохраняет или обновляет её в соответствии с бизнес-логикой. Логика обработки автора состоит в том, чтобы не добавлять новые записи для уже существующих clientid, а обновлять информацию о роли.

Структура таблицы базы данных для связи между clientid и ролью

Структура таблицы базы данных#### 6.3 Отправка уведомлений о задачах различным ролям на сервере

Улучшение способа отправки сообщений, используя GeTui toList: сокращённое "пакетная отправка", указывает на конкретную группу пользователей для отправки сообщений

/**
 * @param pushMessage - сообщение для отправки
 * @param appPushList - список ролей для отправки
 */
public static void pushMessage(PushMessage pushMessage, List<AppPush> appPushList) {
    IGtPush push = new IGtPush(url, appKey, masterSecret);

    Style0 style = new Style0();
    // ШАГ 2: Установка заголовка и содержимого сообщения
    style.setTitle(pushMessage.getTitle());
    style.setText(pushMessage.getContent());
    //        style.setLogo("push.png"); // Установка логотипа сообщения
    // ШАГ 3: Установка звуковых эффектов и вибрации
    style.setRing(true);  // Включение звука
    style.setVibrate(true);  // Включение вибрации
}

ШАГ 4: Выбор шаблона уведомления NotificationTemplate шаблон = new NotificationTemplate(); шаблон.setAppId(appId); шаблон.setAppkey(appKey); шаблон.setStyle(style); // При нажатии на уведомление открыть приложение шаблон.setTransmissionType(1); // Передача пользовательского сообщения шаблон.setTransmissionContent(JSONUtil.toJsonStr(pushMessage));

ШАГ 5: Определение объекта типа "AppMessage", установка срока действия и других параметров отправки // Используется toList схема, определяется тип сообщения ListMessage // List appIds = new ArrayList(); // appIds.add(appId); ListMessage сообщение = new ListMessage(); сообщение.setData(шаблон); // сообщение.setAppIdList(appIds); сообщение.setOffline(true); сообщение.setOfflineExpireTime(1000 * 600); // Время в миллисекундах String contentId = push.getContentId(сообщение); // Получение целей отправки List цели = new ArrayList<>(); for (AppPush ap : appPushList) { Target цель = new Target(); цель.setAppId(appId); цель.setClientId(ap.getClientid()); цели.add(цель); }

// IPushResult ret = push.pushMessageToApp(сообщение); IPushResult ret = push.pushMessageToList(contentId, цели); System.out.println(ret.getResponse().toString()); }


Класс `PushMessage` является моделью:

```java
public class PushMessage {
    private String title;
    private String content;
    // Роль пользователя
    private String userRole;
    // Другие объекты

    // Пропущены, геттеры и сеттеры методы
}

Класс AppPush - это класс отображения таблицы базы данных:

public class AppPush {
  private String appid; // appId
  private String appkey; // appKey
  private String clientid; // clientId
  private String userName; // имя аккаунта
  private String userRole; // роль пользователя
  // Другие объекты

  // Пропущены, геттеры и сеттеры методы
}

VII. Настройка пользовательской иконки уведомления

Добавьте следующую конфигурацию в файл manifest.json клиента в разделе sdkConfigs. Иконку добавьте самостоятельно.```json { /* Конфигурация SDK */ "sdkConfigs" : { "push" : { "unipush" : { "icons": { "push": { "ldpi": "unpackage/res/icons/48x48.png", "mdpi": "unpackage/res/icons/48x48.png", "hdpi": "unpackage/res/icons/72x72.png", "xhdpi": "unpackage/res/icons/96x96.png", "xxhdpi": "unpackage/res/icons/144x144.png", "xxxhdpi": "unpackage/res/icons/192x192.png" }, "small": { "ldpi": "unpackage/res/icons/18x18.png", "mdpi": "unpackage/res/icons/24x24.png", "hdpi": "unpackage/res/icons/36x36.png", "xhdpi": "unpackage/res/icons/48x48.png", "xxhdpi": "unpackage/res/icons/72x72.png" } } } } } }


#### <center>Development of open-source software requires effort, cherish it!</center>

<br>
<center style="font-size:20px">Support the author</center>
<br>
<center class="half">
<img src="http://silianpan.cn/wp-content/uploads/2019/10/b9c369443b192642f975be9020b3234e.png" width="240"/>

<img src="http://silianpan.cn/wp-content/themes/yusi1.0/img/weixin.gif" width="240" />
</center>

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/twofloor-uniapp-admin.git
git@api.gitlife.ru:oschina-mirror/twofloor-uniapp-admin.git
oschina-mirror
twofloor-uniapp-admin
twofloor-uniapp-admin
master