java集成个推推送V2 uni-push1.0

java springboot集成个推推送V2

前端使用的为uni-push1.0

UniPush 是 DCloud 联合个推公司推出的集成型统一推送服务,内建了苹果、华为、小米、OPPO、VIVO、魅族、谷歌 FCM 等手机厂商的系统级推送和个推等第三方推送。

本文不做前端记录

服务器端使用的为个推RestApi V2

  • 严格按照RestFul风格设计接口,包括url路径的调整,method的区别使用等
  • 入参更合理,减少了结构嵌套,分类更清晰,默认值更合理,开发者使用更聚焦
  • 出参结构更统一,方便开发者做解析
  • 接入更简便,文档结构进行了重新整理

该套配置信息的appid、appkey等都应该由前端uni-push提供,用作调试

Android和IOS 效果图

 1、第一步引入pom依赖

<!--个推-->
<!-- https://mvnrepository.com/artifact/com.getui.push/restful-sdk -->
<dependency>
    <groupId>com.getui.push</groupId>
    <artifactId>restful-sdk</artifactId>
    <version>1.0.0.8</version>
</dependency>

 2、yml配置文件

# 个推推送
getui:
  app:
    appId: *********************                #应用ID
    appKey: *********************             #密钥key
    appSecret: *********************        #密钥secret
    masterSecret: *********************
    host: https://restapi.getui.com/v2    #推送接口地址 sdk里面默认就是这个可以选择不配

3、个推配置类

import com.getui.push.v2.sdk.ApiHelper;
import com.getui.push.v2.sdk.GtApiConfiguration;
import com.getui.push.v2.sdk.api.PushApi;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

/**
 * 个推应用信息
 *
 * @author Ivan
 * @date 2022/9/20 16:50
 */

@Data
@Component
@ConfigurationProperties(prefix = "getui.app")
public class GeTuiConfig {

    private String appId;

    private String appKey;

    private String appSecret;

    private String masterSecret;

    private String host;

    /**
     * 个推接口实例化
     * @return
     */
    @Bean(name = "onlyPushApi")
    public PushApi pushApi() {
        GtApiConfiguration apiConfiguration = new GtApiConfiguration();
        //填写应用配置,参数在“Uni Push”下的“应用配置”页面中获取
        apiConfiguration.setAppId(appId);
        apiConfiguration.setAppKey(appKey);
        apiConfiguration.setMasterSecret(masterSecret);
        //实例化ApiHelper对象,用于创建接口对象
        ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
        //创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
        PushApi pushApi = apiHelper.creatApi(PushApi.class);
        return pushApi;
    }

}

4、个推推送工具类

import com.getui.push.v2.sdk.api.PushApi;
import com.getui.push.v2.sdk.common.ApiResult;
import com.getui.push.v2.sdk.dto.req.Audience;
import com.getui.push.v2.sdk.dto.req.AudienceDTO;
import com.getui.push.v2.sdk.dto.req.Settings;
import com.getui.push.v2.sdk.dto.req.message.PushChannel;
import com.getui.push.v2.sdk.dto.req.message.PushDTO;
import com.getui.push.v2.sdk.dto.req.message.PushMessage;
import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
import com.getui.push.v2.sdk.dto.req.message.android.Ups;
import com.getui.push.v2.sdk.dto.req.message.ios.Alert;
import com.getui.push.v2.sdk.dto.req.message.ios.Aps;
import com.getui.push.v2.sdk.dto.req.message.ios.IosDTO;
import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

/**
 * 个推工具类
 *
 * @author Ivan
 * @date 2022/9/21 9:27
 */
@Slf4j
@Component
public class GeTuiUtils {

    @Autowired
    PushApi pushApi;

    /**
     * 单cid推送
     *
     * @param cid
     * @param title
     * @param content
     * @return
     */
    public boolean pushToSingleByCid(String cid, String title, String content) {
        //推送消息体
        PushDTO<Audience> pushDTO = this.buildPushDTO(title, content);
        //设置接收人信息
        Audience audience = new Audience();
        pushDTO.setAudience(audience);
        audience.addCid(cid);// cid
        //进行cid单推
        ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
        if (apiResult.isSuccess()) {
            log.info("Push succeeded. cid:" + cid + ",msg:" + apiResult.getMsg() + ",data:" + apiResult.getData());
            return true;
        } else {
            log.info("Push failed. cid:" + cid + ",code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
            return false;
        }
    }

    /**
     * cid批量推送
     *
     * @param cidList
     * @param title
     * @param content
     * @return
     */
    public boolean pushListByCid(List<String> cidList, String title, String content) {
        //批量发送
        AudienceDTO audienceDTO = new AudienceDTO();

        PushDTO<Audience> pushDTO = this.buildPushDTO(title, content);

        //创建消息
        ApiResult<TaskIdDTO> createApiResult = pushApi.createMsg(pushDTO);
        if (!createApiResult.isSuccess()) {
            log.info("批量推送:创建消息失败" + createApiResult.getMsg());
            return false;
        }
        // 设置接收人信息
        Audience audience = new Audience();
        pushDTO.setAudience(audience);
        audience.setCid(cidList);

        audienceDTO.setAudience(audience);
        audienceDTO.setTaskid(createApiResult.getData().getTaskId());
        audienceDTO.setAsync(true);

        ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushListByCid(audienceDTO);
        if (apiResult.isSuccess()) {
            log.info("Batch push succeeded. msg:" + apiResult.getMsg() + ",data:" + apiResult.getData());
            return true;
        } else {
            log.info("Batch push failed. code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
            return false;
        }
    }

    /**
     * 构建推送消息体
     *
     * @param title
     * @param content
     * @return
     */
    private PushDTO<Audience> buildPushDTO(String title, String content) {
        PushDTO<Audience> pushDTO = new PushDTO<>();
        // 设置推送参数
        pushDTO.setRequestId(System.currentTimeMillis() + "");
        pushDTO.setGroupName("test-group");

        //配置推送条件
        Settings settings = new Settings();
        pushDTO.setSettings(settings);
        //消息有效期,走厂商消息需要设置该值
        settings.setTtl(3600000);

        //安卓在线通道走个推推送时的消息体(在线通道不支持ios)
        PushMessage pushMessage = new PushMessage();
        pushDTO.setPushMessage(pushMessage);
        //通知消息
        GTNotification notification = new GTNotification();
        pushMessage.setNotification(notification);
        notification.setTitle(title + "在线通道通知消息标题");
        notification.setBody(content + "在线通道通知消息内容");
        notification.setClickType("intent");
        notification.setIntent("intent://com.getui.push/detail?#Intent;scheme=gtpushscheme;launchFlags=0x4000000;package=com.getui.demo;component=com.getui.demo/com.getui.demo.DemoActivity;S.payload=payloadStr;end");
        //透传消息 此格式的透传消息由 unipush 做了特殊处理,会自动展示通知栏。开发者也可自定义其它格式,在客户端自己处理。
//        pushMessage.setTransmission(" {title:\"个推通道透传消息标题\",content:\"个推通道透传消息内容\",payload:\"自定义数据\"}");

        //设置离线推送时的消息体
        PushChannel pushChannel = new PushChannel();

        //安卓离线厂商通道推送的消息体
        AndroidDTO androidDTO = new AndroidDTO();
        Ups ups = new Ups();
        //通知消息
        ThirdNotification thirdNotification = new ThirdNotification();
        ups.setNotification(thirdNotification);
        thirdNotification.setTitle(title + "安卓离线厂商通道通知消息标题");
        thirdNotification.setBody(content + "安卓离线厂商通道通知消息内容");
        thirdNotification.setClickType("intent");
        thirdNotification.setIntent("intent://com.getui.push/detail?#Intent;scheme=gtpushscheme;launchFlags=0x4000000;package=com.getui.demo;component=com.getui.demo/com.getui.demo.DemoActivity;S.payload=payloadStr;end");
        //透传消息
//        ups.setTransmission(" {title:\"安卓离线厂商通道透传消息标题\",content:\"安卓离线厂商通道透传消息内容\",payload:\"自定义数据\"}");

        androidDTO.setUps(ups);
        pushChannel.setAndroid(androidDTO);

        //ios离线apn通道推送的消息体
        Alert alert = new Alert();
        alert.setTitle(title+"苹果离线通知栏标题");
        alert.setBody(content+"苹果离线通知栏内容");
        Aps aps = new Aps();
        aps.setContentAvailable(0);//0表示普通通知消息(默认为0);1表示静默推送(无通知栏消息),静默推送时不需要填写其他参数。苹果建议1小时最多推送3条静默消息
        aps.setSound("default");//自定义铃声:系统铃声设置为:default; 无声设置为:com.gexin.ios.silence,或不填
        aps.setAlert(alert);
        IosDTO iosDTO = new IosDTO();
        iosDTO.setAps(aps);
        iosDTO.setType("notify");
        pushChannel.setIos(iosDTO);

        pushDTO.setPushChannel(pushChannel);
        return pushDTO;
    }
}

5、测试类

@SpringBootTest
class GetuiTests {

    @Autowired
    private GeTuiUtils geTuiUtils;


    @Test
    void pushV2() {
        //单个推送
        geTuiUtils.pushToSingleByCid("xxx","单个cid推送","单个cid推送");
        //批量推送
//        List<String> list = new ArrayList<>();
//        list.add("xxx");
//        geTuiUtils.pushListByCid(list,"批量推送","批量推送");
    }

}

总结:

几个注意的点(代码均有注释)

1、首先区分安卓和ios,两种系统封装的方式和消息体不同

2、区分在线和离线(个推的在线通道只有安卓能做,ios只能走厂商离线通道)

3、区分通知消息和透传消息(透传就是自定义消息,后端啥都不做直接把所有信息通过json格式发给前端做个性化处理)

4、cid要找前端拿,并且服务端需要做存储,用户每次登录app都更新一遍

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值