title: "Схема отправки push-сообщений в uni-app"
author: silianpan
date: 2019-11-05
output: word_document
uni-app поддерживает отправку push-сообщений, см. следующие документы:
Руководство по использованию UniPush
[Руководство по активации UniPush](https://ask.dcloud.net.cn/article/ Yöntem 35716)
Как настроить иконку для push-сообщений?
Использование UniPush в uni-app
Пользователи разных ролей получают различные напоминания о задачах при входе в приложение. То есть тот, кто выполняет задачу, получает это напоминание. Отправка напоминаний о задачах пользователям различных ролей
Поскольку push-уведомления в uni-app используют Getui, следует изучить документацию Getui.
Так как сервер написан на Java, то посмотрите руководство по интеграции Java
Скачайте пакет SDK для сервера, адрес скачивания: http://www.getui.com/download/docs/getui/server/GETUI_JAVA_SDK_4.1.0.5.zip
Включите все jar-файлы из директории "GETUI_SERVER_SDK/resources".```bash
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.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
},
Приложение действительно получает сообщение, но все роли пользователей получают уведомления о задачах, которые им не предназначены. Это противоречит требованиям! Поэтому автор исследовал принцип отправки сообщений от сервера до клиента:
На самом деле, независимо от того, является ли это одиночной или групповой отправкой, цель отправки — это 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
Сервер принимает информацию и сохраняет или обновляет её в соответствии с бизнес-логикой. Логика обработки автора состоит в том, чтобы не добавлять новые записи для уже существующих 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; // роль пользователя
// Другие объекты
// Пропущены, геттеры и сеттеры методы
}
Добавьте следующую конфигурацию в файл 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 )