JAVA极光推送集成(笔记记录)

极光推送官网

纯讨论我也是第一次对接,有更好的优化方案一起讨论

前提准备工作

官网根据流程注册账号与创建应用获取对应的appkey与secret
引入极光对应的依赖 

极光推送github地址

       <dependency>
            <groupId>io.github.jpush</groupId>
            <artifactId>jiguang-sdk</artifactId>
            <version>5.2.3</version>
        </dependency>

注意事项

客户端需要集成相应的极光的SDK,集成之后用户安装客户端之后可以获取到一个RegistrationID我们发生信息就是根据这个RegistrationID 来做推送的。所以我们需要在我们后台把这个ID做一个保存,对应用户登录的信息,一对一做绑定。一个设备对应一个ID,如果重新安装客户端这个ID就会刷新,所以还会有一个方法去发送信息,根据自己设置的别名去做发送alias。每当绑定RegistrationID的时候我们需要根据这个ID去设置对应的别名,具体可以看文档设备管理 API - 极光文档

代码对接

极光config类与bean类

config

@Configuration
public class JiGuangConfig {
    /**
     * 极光官网-个人管理中心-appkey
     */
    @Value("${jpush.appkey}")
    private String appkey;

    /**
     * 极光官网-个人管理中心-点击查看-secret
     */
    @Value("${jpush.secret}")
    private String secret;

    private PushApi pushApi;

    private DeviceApi deviceApi;

    /**
     * 推送客户端
     *
     * @return
     */
    @PostConstruct
    public void initJPushClient() {
        pushApi = new PushApi.Builder()
                .setAppKey(appkey)
                .setMasterSecret(secret)
                .build();

        deviceApi = new DeviceApi.Builder()
                .setAppKey(appkey)
                .setMasterSecret(secret)
                .build();
    }

    /**
     * 获取推送设备
     *
     *
     * @return
     */
    public DeviceApi getJDeviceClient() {
        return deviceApi;
    }

    /**
     * 获取推送客户端
     *
     * @return
     */
    public PushApi getJPushClient() {
        return pushApi;
    }

bean 

@Data
public class PushBean {

    // 必填, 通知内容, 内容可以为空字符串,则表示不展示到通知栏。
    private String alert;
    // 可选, 附加信息, 供业务使用。
    private Map<String, Object> extras;
    //android专用// 可选, 通知标题	如果指定了,则通知里原来展示 App名称的地方,将展示成这个字段。
    private String title;
    private String subtitle;
}

根据自己业务需要我这边只需要对接设备功能推送功能  具体可以看github上面的文档

极光推送功能的工具service与实现类
public interface JiGuangPushService {


    /**
     * 推送全部ios ios广播
     *
     * @return
     */
    public PushSendResult pushIos(PushBean pushBean);

    /**
     * 推送ios 指定id
     *
     * @return
     */
    public boolean pushIos(PushBean pushBean, List<String> rids, List<String> alias);

    /**
     * 推送全部android
     *
     * @return
     */
    public PushSendResult pushAndroid(PushBean pushBean);

    /**
     * 推送android 指定id
     *
     * @return
     */
    public boolean pushAndroid(PushBean pushBean, List<String> rids, List<String> alias);

    /**
     * 调用api推送
     *
     * @param param 推送实体
     * @return
     */
    public PushSendResult sendPush(PushSendParam param);
}
@Service
public class JiGuangPushServiceImpl implements JiGuangPushService {
    private static final Logger log = LoggerFactory.getLogger(JiGuangPushServiceImpl.class);

    // 极光推送一次最大数量限制(官方限制1000,设置为800留有缓冲空间)
    private static final int MAX_BATCH_SIZE = 800;

    @Autowired
    private JiGuangConfig jPushConfig;

    /**
     * 推送全部iOS设备(广播)
     *
     * @param pushBean 推送内容实体
     * @return 推送结果
     */
    @Override
    public PushSendResult pushIos(PushBean pushBean) {
        PushSendParam param = buildIosPushParam(pushBean, null, null);
        param.setAudience(ApiConstants.Audience.ALL);
        return sendPush(param);
    }

    /**
     * 推送指定iOS设备
     *
     * @return 是否推送成功
     */
    @Override
    public boolean pushIos(PushBean pushBean, List<String> rids, List<String> alias) {
        if (!CollectionUtils.isEmpty(alias)) {
         
            // 分批处理
            batchProcessRegistrationIds(alias, chunk -> {
                PushSendParam param = buildIosPushParam(pushBean, null, chunk);
                sendPush(param);
            });
            return true;
        }
        if (!CollectionUtils.isEmpty(rids)) {
            // 分批处理
            batchProcessRegistrationIds(rids, chunk -> {
                PushSendParam param = buildIosPushParam(pushBean, chunk, null);
                sendPush(param);
            });
        }


        return true;
    }

    /**
     * 推送全部Android设备(广播)
     *
     * @param pushBean 推送内容实体
     * @return 推送结果
     */
    @Override
    public PushSendResult pushAndroid(PushBean pushBean) {
        PushSendParam param = buildAndroidPushParam(pushBean, null, null);
        param.setAudience(ApiConstants.Audience.ALL);
        return sendPush(param);
    }

    /**
     * 推送指定Android设备
     *
     * @param pushBean 推送内容实体
     * @return 是否推送成功
     */
    @Override
    public boolean pushAndroid(PushBean pushBean, List<String> rids, List<String> alias) {
        if (!CollectionUtils.isEmpty(alias)) {
         
            // 分批处理
            batchProcessRegistrationIds(alias, chunk -> {
                PushSendParam param = buildAndroidPushParam(pushBean, null, chunk);
                sendPush(param);
            });
            return true;
        }
        if (!CollectionUtils.isEmpty(rids)) {
            // 分批处理
            batchProcessRegistrationIds(rids, chunk -> {
                PushSendParam param = buildAndroidPushParam(pushBean, chunk, null);
                sendPush(param);
            });
        }
        return true;
    }


    /**
     * 构建iOS推送参数
     *
     * @param pushBean        推送内容
     * @param registrationIds 设备ID列表(为null表示广播)
     * @return 推送参数对象
     */
    private PushSendParam buildIosPushParam(PushBean pushBean, List<String> registrationIds, List<String> alias) {
        PushSendParam param = new PushSendParam();

        // iOS通知配置
        NotificationMessage.IOS ios = new NotificationMessage.IOS();
        Map<String, String> iosAlert = new HashMap<>();
        iosAlert.put("title", pushBean.getTitle());
        iosAlert.put("subtitle", pushBean.getSubtitle());
        ios.setAlert(iosAlert);

        if (pushBean.getExtras() != null) {
            ios.setExtras(pushBean.getExtras());
        }

        NotificationMessage notificationMessage = new NotificationMessage();
        notificationMessage.setAlert(pushBean.getAlert());
        notificationMessage.setIos(ios);
        param.setNotification(notificationMessage);

        // 设置目标设备(如果指定了设备ID)
        if (registrationIds != null) {
            Audience audience = new Audience();
            audience.setRegistrationIdList(registrationIds);
            param.setAudience(audience);
        }

        if (alias != null) {
            Audience audience = new Audience();
            audience.setAliasList(alias);
            param.setAudience(audience);
        }

        param.setPlatform(Collections.singletonList(Platform.ios));
        return param;
    }

    /**
     * 构建Android推送参数
     *
     * @param pushBean        推送内容
     * @param registrationIds 设备ID列表(为null表示广播)
     * @return 推送参数对象
     */
    private PushSendParam buildAndroidPushParam(PushBean pushBean, List<String> registrationIds, List<String> alias) {
        PushSendParam param = new PushSendParam();

        // Android通知配置
        NotificationMessage.Android android = new NotificationMessage.Android();
        android.setAlert(pushBean.getAlert());
        android.setTitle(pushBean.getTitle());
        android.setBadgeAddNumber(1);
//        NotificationMessage.Android.Intent intent = new NotificationMessage.Android.Intent();
//        intent.setUrl("/pages/preempt/index?type=1");
//        android.setIntent(intent);
        if (pushBean.getExtras() != null) {
            android.setExtras(pushBean.getExtras());
        }

        NotificationMessage notificationMessage = new NotificationMessage();
        notificationMessage.setAlert(pushBean.getAlert());
        notificationMessage.setAndroid(android);
        param.setNotification(notificationMessage);

        // 设置目标设备(如果指定了设备ID)
        if (registrationIds != null) {
            Audience audience = new Audience();
            audience.setRegistrationIdList(registrationIds);
            param.setAudience(audience);
        }

        if (alias != null) {
            Audience audience = new Audience();
            audience.setAliasList(alias);
            param.setAudience(audience);
        }

        param.setPlatform(Collections.singletonList(Platform.android));
        return param;
    }



    /**
     * 分批处理设备注册ID列表
     *
     * @param allIds    所有设备ID列表
     * @param processor 处理逻辑
     */
    private void batchProcessRegistrationIds(List<String> allIds, BatchProcessor processor) {
        if (allIds == null || allIds.isEmpty()) {
            return;
        }

        int total = allIds.size();
        int fromIndex = 0;

        while (fromIndex < total) {
            int toIndex = Math.min(fromIndex + MAX_BATCH_SIZE, total);
            List<String> batchIds = allIds.subList(fromIndex, toIndex);
            processor.process(batchIds);
            fromIndex = toIndex;
        }
    }

    /**
     * 执行推送
     *
     * @param param 推送参数
     * @return 推送结果
     */
    @Override
    public PushSendResult sendPush(PushSendParam param) {
        log.info("sendPush 开始极光推送: {}", JSON.toJSONString(param));
        try {
            PushSendResult result = jPushConfig.getJPushClient().send(param);
            log.info("极光推送成功: {}", result);
            return result;
        } catch (Exception e) {
            log.error("极光推送发生未知异常", e);
        }
        return null;
    }

    /**
     * 批量处理接口
     */
    @FunctionalInterface
    private interface BatchProcessor {
        void process(List<String> batchIds);
    }
极光设备工具service与实现类

public interface JiGuangDeviceService {

    /**
     * 推送设备别名
     * @param deviceBean
     */
    public void setDevice(DeviceBean deviceBean);
    /**
     * 删除设备别名
     * @param
     */
    public void clearDevice(String jpushRid, String alias);
}
@Service
public class JiGuangDeviceServiceImpl implements JiGuangDeviceService {

    private static final Logger log = LoggerFactory.getLogger(JiGuangDeviceServiceImpl.class);

    @Autowired
    private JiGuangConfig jPushConfig;

    @Override
    public void setDevice(DeviceBean deviceBean) {
        log.info("setDevice:{}", deviceBean);
        DeviceSetParam.Tags tags = new DeviceSetParam.Tags();
        tags.setAdd(Arrays.asList(jPushConfig.getEnvironment() + deviceBean.getJpushRid()));
//        tags.setRemove(new ArrayList<>());
        DeviceSetParam param = new DeviceSetParam();
        param.setTags(tags);
        param.setAlias(jPushConfig.getEnvironment() + deviceBean.getAlias());
        param.setMobile(deviceBean.getMobile());
        jPushConfig.getJDeviceClient().setDevice(deviceBean.getJpushRid(), param);
    }

    @Override
    public void clearDevice(String jpushRid, String alias) {
        if (alias != null) {
            jPushConfig.getJDeviceClient().deleteAlias(jPushConfig.getEnvironment() + alias);
        }
        if (jpushRid != null) {
            boolean clearTag = true;
            boolean clearAlias = true;
            boolean clearMobile = true;
            DeviceClearParam param = DeviceClearParam.of(clearTag, clearAlias, clearMobile);
            jPushConfig.getJDeviceClient().clearDevice(jpushRid, param);
            jPushConfig.getJDeviceClient().deleteTag(jpushRid);
        }
    }

还有很多扩展字段,具体文档都有,还有很多厂商对接,由于作者对接的客户端是原生的安卓所以就没有对接到厂商。纯分享,有更好方案也分享一下谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值