1、极光推送的思路就是,每一个app都有一个AppKey和Master Secret,这两个值是唯一的,也就是用来标识App的唯一信息,具体怎么获取,去看极光推送官网文档,这里就不在讲解。我们在极光开发者上创建好了一个测试App后,设置好这两个值,就可以获取到如下信息。
2、此时我们已经获取到了 AppKey和Master Secret,下面就是使用java代码实现消息推送功能。我这里采用Spring Boot框架开发的。在推送消息的时候,必须得获取到当前设备的设备号deviceTagAlias,这是用来定位当前设备的App的,这样才能准确定位到App。
导入pom.xml依赖
<!-- 极光推送 -->
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jpush-client</artifactId>
<version>3.2.17</version>
</dependency>
<dependency>
<groupId>cn.jpush.api</groupId>
<artifactId>jiguang-common</artifactId>
<version>1.0.3</version>
</dependency>
用于保存推送消息各自参数的Vo类
@Data
@ApiModel
public class JdPushVo implements Serializable {
private static final long serialVersionUID = 5765482497625927662L;
@ApiModelProperty(name = "alias", value = "别名", dataType = "String")
private String alias;
@ApiModelProperty(name = "title", value = "标题", dataType = "String")
private String title;
@ApiModelProperty(name = "alert", value = "通知内容", dataType = "String")
private String alert;
@ApiModelProperty(name = "timeToLive", value = "离线消息保留时长(秒)默认 86400 (1 天)", dataType = "Integer")
private Integer timeToLive = 86400;
@ApiModelProperty(name = "deviceTagAlias", value = "设备号", dataType = "String")
private String deviceTagAlias;
}
用于保存AppKey和Master Secret的配置类
@Component
public class JdPushConfig {
public static final String MASTER_SECRET = "这里换成App对应的值";
public static final String APP_KEY = "这里换成App对应的值";
}
消息推送工具类
@Component
public class JdPushUtil {
private final static String appKey = JdPushConfig.APP_KEY;
private final static String masterSecret = JdPushConfig.MASTER_SECRET;
private final static JPushClient jpushClient = new JPushClient(masterSecret, appKey);
// 极光推送>>Android
public static void jpushAndroid(JdPushVo jdPushVo) {
try {
TagAliasResult deviceTagAlias = jpushClient.getDeviceTagAlias(jdPushVo.getDeviceTagAlias());
jdPushVo.setAlias(deviceTagAlias.alias);
System.out.println(jdPushVo.toString());
} catch (APIConnectionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (APIRequestException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 推送的关键,构造一个payload
Map<String, String> m = new HashMap<String, String>();
m.put("title", jdPushVo.getTitle());
m.put("alert", jdPushVo.getAlert());
PushPayload payload = PushPayload.newBuilder().setPlatform(Platform.android())// 指定android平台的用户
// .setAudience(Audience.all())//你项目中的所有用户
.setAudience(Audience.alias(jdPushVo.getAlias()))// 根据别名推送
.setNotification(Notification.android(m.get("alert"), m.get("title"), m))
// 发送内容,这里不要盲目复制粘贴,这里是我从controller层中拿过来的参数)
.setOptions(Options.newBuilder().setApnsProduction(false).build())
// 这里是指定开发环境,不用设置也没关系
// .setMessage(Message.content(parm.get("msg")))//自定义信息
.build();
try {
PushResult pu = jpushClient.sendPush(payload);
System.out.println(pu.toString());
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
// 极光推送>>ios
public static void jpushIOS(Map<String, String> parm) {
PushPayload payload = PushPayload.newBuilder().setPlatform(Platform.ios())// ios平台的用户
.setAudience(Audience.all())// 所有用户
.setNotification(
Notification.newBuilder()
.addPlatformNotification(IosNotification.newBuilder().setAlert(parm.get("msg"))
.setBadge(+1).setSound("happy")// 这里是设置提示音(更多可以去官网看看)
.addExtras(parm).build())
.build())
.setOptions(Options.newBuilder().setApnsProduction(false).build())
.setMessage(Message.newBuilder().setMsgContent(parm.get("msg")).addExtras(parm).build())// 自定义信息
.build();
try {
PushResult pu = jpushClient.sendPush(payload);
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
//设置别名
public static void setAlias(String deviceTagAlias, String alias) {
HashSet<String> tagsToAdd = new HashSet<>();
HashSet<String> tagsToRemove = new HashSet<>();
try {
jpushClient.updateDeviceTagAlias(deviceTagAlias, alias, tagsToAdd, tagsToRemove);
} catch (APIConnectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (APIRequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//删除别名
public static void delAlias(String username) {
try {
jpushClient.deleteAlias(username,null);
} catch (APIConnectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (APIRequestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3、代码思路是这样,首先用户登录成功以后,会调用这个工具类的setAlias方法设置别名,我这里是采用用户名设置的别名,然后参数有String deviceTagAlias, String alias,设备号前端获取到以后传给后端,后端调用此方法为该设备下的该用户设置好别名,然后才能定位到App实现消息推送。
4、当登陆成功后,别名也设置好了,然后就可以进行消息推送了
消息推送的主要步骤就是构建一个推送对象Payload,设置好推送目标(安卓、还是ios、还是所有)、推送单位(所用用户、别名、标签)、推送内容,对象构建完成后,调用sendPush方法就能实现推送了,参数自己根据项目需求进行更改。
5、如果用户退出登录以后,必须把别名信息给删除,如果不删除,用户退出后还会继续在该App上推送消息,就会显得十分恶心,在退出登录接口中调用该方法可以实现别名删除。
6、消息推送的大致功能以及实现,最后看效果图。在手机上安装极光推送开发者测试App。
采用Swagger测试接口:
最后看手机上的消息:
推送功能成功实现,欢迎大家留言讨论。