纯讨论我也是第一次对接,有更好的优化方案一起讨论
前提准备工作
官网根据流程注册账号与创建应用获取对应的appkey与secret
引入极光对应的依赖
<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);
}
}
还有很多扩展字段,具体文档都有,还有很多厂商对接,由于作者对接的客户端是原生的安卓所以就没有对接到厂商。纯分享,有更好方案也分享一下谢谢。