[Практика] Springboot представляет отправку сообщений

Spring Boot задняя часть
[Практика] Springboot представляет отправку сообщений

сообщение

Что такое push сообщений?

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

На рынке существует множество толкающих платформ, и процесс стыковки Jiguang Push выглядит следующим образом:

JPush — это проверенная крупномасштабная платформа для отправки приложений, которая ежедневно отправляет десятки миллиардов сообщений. После интеграции SDK разработчики могут отправлять сообщения, вызывая API. В то же время JPush предоставляет визуальную веб-консоль для отправки уведомлений и статистического анализа эффекта push. JPush полностью поддерживает три платформы мобильных телефонов Android, iOS, Winphone.

Подготовить

  • Войдите на официальный сайт Авроры:www.jiguang.cn/
  • Зарегистрировать аккаунт
  • Выберите Услуги для разработчиков
  • Нажмите Jiguang Push и создайте приложение после ввода
  • Выберите созданное приложение, чтобы получить AppKey и Master Secret.

应用信息.png

Интеграция 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/генеалогическое древо есть/обслуживать…