java集成极光推送实现Android的消息推送

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测试接口:

最后看手机上的消息:

 

 

推送功能成功实现,欢迎大家留言讨论。 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值