сообщение
Что такое push сообщений?
В настоящее время многие мобильные приложения время от времени отправляют сообщения пользователям.Например, некоторые новостные приложения будут отправлять пользователям новости, которые могут их заинтересовать, или, если приложение было обновлено, оно подталкивает пользователей к выбору обновления Новости. Нажав на это сообщение, вы перейдете на соответствующую страницу приложения, и всегда будет отображаться подсказка «маленькая красная точка» и т. д.сообщение, иногда вы будете рассматривать, как можно реализовать эту функцию push-сообщения, и теперь эту функцию можно просто реализовать, подключившись к третьей стороне.
На рынке существует множество толкающих платформ, и процесс стыковки Jiguang Push выглядит следующим образом:
JPush — это проверенная крупномасштабная платформа для отправки приложений, которая ежедневно отправляет десятки миллиардов сообщений. После интеграции SDK разработчики могут отправлять сообщения, вызывая API. В то же время JPush предоставляет визуальную веб-консоль для отправки уведомлений и статистического анализа эффекта push. JPush полностью поддерживает три платформы мобильных телефонов Android, iOS, Winphone.
Подготовить
- Войдите на официальный сайт Авроры:www.jiguang.cn/
- Зарегистрировать аккаунт
- Выберите Услуги для разработчиков
- Нажмите Jiguang Push и создайте приложение после ввода
- Выберите созданное приложение, чтобы получить AppKey и Master Secret.
Интеграция SpringBoot
maven-зависимости
Введите зависимость от полярного сияния
<!-- 极光推送依赖 -->
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jpush-client</artifactId>
<version>3.3.10</version>
</dependency>
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jiguang-common</artifactId>
<version>1.1.4</version>
</dependency>
Инструменты
Создайте класс JPushUtil, который дает методы для использования с Android и ios, а также методы, применимые к обоим, код выглядит следующим образом
@Slf4j
@Component
public class JPushUtil {
@Value(value="${jpush.appKey}")
private String appKey;
@Value(value="${jpush.masterSecret}")
private String masterSecret;
@Resource
private JpushFeign jpushFeign;
@Value(value = "${jpush.send.titleLimit:75}")
private Integer titleLimit;
@Value(value = "${jpush.send.contentLimit:150}")
private Integer contentLimit;
@Async
public void appSendPushWithCallback( List<String> registrationIds, MessageBodyVO2 request, String messageId, int sendno) {
try {
if (CollectionUtils.isEmpty(registrationIds)) {
log.info("推送registrationId集合为空!");
return;
}
PushModel pushModel = this.buildPushObject(registrationIds, request, messageId, sendno);
String authString = ServiceHelper.getBasicAuthorization(appKey, masterSecret);
log.info("推送:" + JSONObject.toJSONString(pushModel));
Map<String, Object> resultModel = jpushFeign.push(authString, JSONObject.parseObject(JSONObject.toJSONString(pushModel)));
log.info("回参: {}", JSONObject.toJSONString(resultModel));
}catch (Exception e){
log.error("消息发送失败!", e);
}
}
/**
*
* @param registrationIds 注册ID数组
* @param request 传入参数
* @param messageId 本地消息ID
* @param sendno 极光发送ID
*/
private PushModel buildPushObject(List<String> registrationIds, MessageBody request, String messageId, int sendno){
PushModel pushModel = new PushModel();
pushModel.setPlatform(Arrays.asList(PushConstans.JPUSH_PLATFORM_ALL));
//推送目标
AudienceModel audience = new AudienceModel();
audience.setRegistration_id(registrationIds);
pushModel.setAudience(audience);
AndroidModel android = new AndroidModel();
//安卓平台参数
android.setAlert(request.getLimitContent(contentLimit));
android.setTitle(request.getLimitTitle(titleLimit));
// 设置安卓跳转节点
Optional.ofNullable(((Map)(request.getPayload().get("android"))).get("uri_activity")).ifPresent(u->
android.setUri_activity(u.toString()));
Optional.ofNullable(((Map)(request.getPayload().get("android"))).get("uri_action")).ifPresent(u->
android.setUri_action(u.toString()));
//安卓扩展字段
JSONObject androidExtras = new JSONObject();
androidExtras.put("payload_protocol", MapUtils.getString(request.getPayload_protocol(), "type"));
androidExtras.put("message_id", messageId);
androidExtras.put("link_type", String.valueOf(request.getLink_type()));
androidExtras.put("uri", request.getUri());
android.setExtras(androidExtras);
//IOS平台参数
IosModel ios = new IosModel();
JSONObject alert = new JSONObject();
alert.put("title", request.getLimitTitle(titleLimit));
alert.put("body", request.getLimitContent(contentLimit));
ios.setAlert(alert);
ios.setBadge(1);
//ios扩展字段
JSONObject iosExtras = new JSONObject();
iosExtras.put("payload_protocol", MapUtils.getString(request.getPayload_protocol(), "type"));
iosExtras.put("message_id", messageId);
iosExtras.put("link_type", String.valueOf(request.getLink_type()));
iosExtras.put("uri", request.getUri());
ios.setExtras(iosExtras);
//消息通知
NotificationModel notification = new NotificationModel();
notification.setAndroid(android);
notification.setIos(ios);
pushModel.setNotification(notification);
//可选参数
OptionsModel options = new OptionsModel();
options.setSendno(sendno);
pushModel.setOptions(options);
return pushModel;
}
}
Инкапсуляция параметров сообщения
@Getter
@Setter
public class MessageBody {
@NotBlank(message = "消息唯一标识不能为空!")
@ApiParam(value = "消息唯一标识", required = true)
private String sid;
@NotBlank(message = "推送平台不能为空!")
@ApiParam(value = "推送平台", required = true)
private String platform;
@NotBlank(message = "应用id不能为空!")
@ApiParam(value = "应用id", required = true)
private String appid;
@NotBlank(message = "项目名不能为空!")
@ApiParam(value = "项目名", required = true)
private String source;
@NotNull(message = "数据体协议不能为空!")
@ApiParam(value = "数据体协议", required = true)
private Map<String,Object> payload_protocol;
@NotNull(message = "发送方式不能为空!")
@ApiParam(value = "发送方式", required = true)
private Integer recipient_type;
@ApiParam(value = "用户", required = true)
private List<String> recipient;
@NotBlank(message = "应用id不能为空!")
@ApiParam(value = "标题", required = true)
private String title;
@NotBlank(message = "消息内容不能为空!")
@ApiParam(value = "消息内容", required = true)
private String content;
@ApiParam(value = "图片url", required = false)
private String picPath;
@ApiParam(value = "链接类型", required = true)
private Integer link_type;
@ApiParam(value = "App具体业务连接地址", required = true)
private String uri;
@ApiParam(value = "PC具体业务连接地址", required = true)
private String uri_pc;
@ApiParam(value = "自定义消息体", required = true)
private Map<String,Object> payload;
@ApiParam(value = "设置", required = false)
private Map<String,Object> options;
@ApiParam(value = "回调URL", required = false)
private String callback;
}
контрольная работа
@RunWith(SpringRunner.class)
@SpringBootTest(classes = {App.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class TestJPush {
@Autowired
private JPushUtil jpushRestUtil;
@Test
public void test() {
List users = new ArrayList();
MessageBody request = new MessageBody();
request.setSid("56318723912");
request.setAppid("dqw1233132");
request.setContent("么么么么");
request.setTitle("标题");
request.setPicPath("img...");
jpushRestUtil.appSendPushWithCallback(users, request, "1", 1);
}
}
Примечание. Заголовок и содержание должны иметь содержание, иначе отправка Jiguang завершится ошибкой.
Параметр Описание
ключевые слова | опции | значение |
---|---|---|
platform | необходимые | Push-настройки платформы |
audience | необходимые | Обозначение толкающего устройства |
notification | по желанию | Тело уведомления. это содержимое, которое передается клиенту. Вместе с сообщением должен существовать один из двух, и оба могут сосуществовать |
message | по желанию | тело сообщения. это содержимое, которое передается клиенту. Вместе с уведомлением должен существовать один из двух, и оба могут сосуществовать |
notification_3rd | по желанию | Пользовательское сообщение передается в тело уведомления производителя. использовать с сообщением |
sms_message | по желанию | Дополнительный контент доставки SMS-канала |
options | по желанию | push-параметры |
callback | по желанию | параметр обратного вызова |
cid | по желанию | Идентификатор, определенный для предотвращения повторных попыток вызова API и повторных отправок на сервер. |
Ссылаться на
Документ Jiguang push:docs.laser.talent/генеалогическое древо есть/обслуживать…