准备工作

1.申请推送服务需要在oppo官网上架自己的app(比较蛋疼),需要一些资料,上架以后app评级为A/B的应用方可申请推送服务,获取到app_key和app_secret。

2.oppo官网下载sdk包,api文档,将jar包引入到自己的项目即可,sdk内部已经维护每次请求所需的auth_token(有效期默认1天),所以不需要开发者自己维护。

测试代码块

/**
 * oppo推送测试类
 * 
 */
public class Oppo {

	private static final String APP_KEY = "APP_KEY";

	private static final String APP_SECRET = "APP_SECRET";

	/**
	 * 通知栏消息tile
	 */
	private static final String TITLE = "通知栏消息tile";

	/**
	 * 通知栏消息内容
	 */
	private static final String CONTENT = "通知栏消息内容";

	public static void main(String[] args) {
		// 单推
		unicastNotification("regId");
		// 群推
		List<String> regIds = new ArrayList<String>();
		regIds.add("regId1");
		regIds.add("regId2");
		unicastBatchNotification(regIds);
		// 广播(多个用;号隔开)
		broadcastNotification("regId1;regId2;regId3");
	}

	/**
	 * 创建通知栏消息体
	 * 
	 * @return
	 */
	private static Notification getNotification() {
		Notification notification = new Notification();

		/**
		 * 以下参数必填项
		 */
		notification.setTitle(TITLE);
		notification.setContent(CONTENT);

		/**
		 * 以下参数非必填项, 如果需要使用可以参考OPPO push服务端api文档进行设置
		 */
		// subTitle - 子标题 设置在通知栏展示的通知栏标题, 【非必填,字数限制1~10,中英文均以一个计算】
		notification.setSubTitle("sub tile");

		// App开发者自定义消息Id,OPPO推送平台根据此ID做去重处理,对于广播推送相同appMessageId只会保存一次,对于单推相同appMessageId只会推送一次
		notification.setAppMessageId("test");

		// 应用接收消息到达回执的回调URL,字数限制200以内,中英文均以一个计算
		notification.setCallBackUrl("http://www.test.com");
		// App开发者自定义回执参数,字数限制50以内,中英文均以一个计算
		notification.setCallBackParameter("");

		// 点击动作类型0,启动应用;1,打开应用内页(activity的intent
		// action);2,打开网页;4,打开应用内页(activity);【非必填,默认值为0】;5,Intent scheme URL
		notification.setClickActionType(4);
		// 应用内页地址【click_action_type为1或4时必填,长度500】
		notification.setClickActionActivity("com.coloros.push.demo.component.InternalActivity");
		// 网页地址【click_action_type为2必填,长度500】
		notification.setClickActionUrl("http://www.test.com");

		// 动作参数,打开应用内页或网页时传递给应用或网页【JSON格式,非必填】,字符数不能超过4K,示例:{"key1":"value1","key2":"value2"}
		notification.setActionParameters("{\"key1\":\"value1\",\"key2\":\"value2\"}");

		// 展示类型 (0, “即时”),(1, “定时”)
		notification.setShowTimeType(1);
		// 定时展示开始时间(根据time_zone转换成当地时间),时间的毫秒数
		notification.setShowStartTime(System.currentTimeMillis() + 1000 * 60 * 3);
		// 定时展示结束时间(根据time_zone转换成当地时间),时间的毫秒数
		notification.setShowEndTime(System.currentTimeMillis() + 1000 * 60 * 5);

		// 是否进离线消息,【非必填,默认为True】
		notification.setOffLine(true);
		// 离线消息的存活时间(time_to_live) (单位:秒), 【off_line值为true时,必填,最长3天】
		notification.setOffLineTtl(24 * 3600);

		// 时区,默认值:(GMT+08:00)北京,香港,新加坡
		notification.setTimeZone("GMT+08:00");

		// 0:不限联网方式, 1:仅wifi推送
		notification.setNetworkType(0);

		return notification;
	}

	/**
	 * 发送单推通知栏消息
	 */
	public static void unicastNotification(String regId) {
		try {
			Sender sender = new Sender(APP_KEY, APP_SECRET);
			// 创建通知栏消息体
			Notification notification = getNotification();
			// 创建发送对象
			Target target = Target.build(regId);
			// 发送单推消息
			Result result = sender.unicastNotification(notification, target);
			// 获取http请求状态码
			System.out.println(result.getStatusCode());
			// 获取平台返回码
			System.out.println(result.getReturnCode());
			// 获取平台返回的messageId
			System.out.println(result.getMessageId());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 发送批量单推通知栏消息
	 * 
	 * @param regIds
	 *            需要推送的regId
	 */
	public static void unicastBatchNotification(List<String> regIds) {
		try {
			Sender sender = new Sender(APP_KEY, APP_SECRET);
			Map<Target, Notification> batch = new HashMap<Target, Notification>();
			// batch最大为1000
			for (String regId : regIds) {
				batch.put(Target.build(regId), getNotification());
			}
			// 发送批量单推消息
			Result result_unicast = sender.unicastBatchNotification(batch);
			// 获取http请求状态码
			System.out.println(result_unicast.getStatusCode());
			// 获取平台返回码
			System.out.println(result_unicast.getReturnCode());

			List<Result.UnicastBatchResult> batchResult = result_unicast.getUnicastBatchResults(); // 批量单推结果
			for (Result.UnicastBatchResult record : batchResult) {
				record.getErrorCode();
				record.getErrorMessage();
				record.getMessageId();
				record.getTargetValue();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 发送广播消息
	 */
	public static void broadcastNotification(String regIds) {
		try {
			Sender sender = new Sender(APP_KEY, APP_SECRET);
			// 创建通知栏消息体
			Notification broadNotification = getNotification();
			// 发送保存消息体请求
			Result saveResult = sender.saveNotification(broadNotification);
			// 获取http请求状态码
			System.out.println(saveResult.getStatusCode());
			// 获取平台返回码
			System.out.println(saveResult.getReturnCode());
			// 获取messageId
			String messageId = saveResult.getMessageId();
			// 创建广播目标
			Target target = new Target();
			target.setTargetValue(regIds);
			// 发送广播消息
			Result broadResult = sender.broadcastNotification(messageId, target);
			// 获取广播taskId
			broadResult.getTaskId();
			List<Result.BroadcastErrorResult> errorList = broadResult.getBroadcastErrorResults();
			if (errorList.size() > 0) { // 如果大小为0,代表所有目标发送成功
				for (Result.BroadcastErrorResult error : errorList) {
					error.getErrorCode(); // 错误码
					error.getTargetValue(); // 目标
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}