UniPush安卓App信息推送

974 阅读2分钟

配置厂商通道

1.小米通道

1.1 上线应用并开通消息推送 得到应用信息

image.png

1.2 将小米应用信息配置到unipush

image.png

1.3 新增小米消息通道

image.png

uniapp前端获取应用CID 和 token

plus.push.getClientInfoAsync(function(info){
    if (info.clientid && info.clientid != 'null') {
        console.log(info)
        Storage.set("clientInfo", info)
        if(Storage.getToken()){
            // 其他业务...
        }
    }
}, function(e){
    console.log('Failed');
    console.log(JSON.stringify(e));
})

Java后台推送透传消息

/**
 * uniApp 的 uniPush 是基于个推的消息推送服务,所以直接可以调用个推的API
 */
@Component
public class GeTuiUtil {

	private static RedisTemplate redisTemplate;

	@Autowired
	private void setRedisTemplate(RedisTemplate redisTemplate){
		GeTuiUtil.redisTemplate = redisTemplate;
	}
        //填写应用配置,参数在“Uni Push”下的“应用配置”页面中获取
	private static final String APP_ID = "AppId";
	private static final String APP_KEY = "AppKey";
	private static final String APP_SECRET = "APP_SECRET";
	private static final String MASTER_SECRET = "MASTER_SECRET";
	private static final String REDIS_TOKEN_KEY = "getui_token_" + APP_ID;

	private static final String baseUrl = "https://restapi.getui.com/v2/" + APP_ID;

	private static final PushApi pushApi = getPushApi();

	public static PushApi getPushApi(){
		GtApiConfiguration apiConfiguration = new GtApiConfiguration();
		apiConfiguration.setAppId(APP_ID);
		apiConfiguration.setAppKey(APP_KEY);
		apiConfiguration.setMasterSecret(MASTER_SECRET);
		apiConfiguration.setDomain("https://restapi.getui.com/v2/");
		ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
		return apiHelper.creatApi(PushApi.class);
	}

	public static void pushToSingleByCid(String cid, String title, String content, String payload){
		PushDTO<Audience> pushDTO = new PushDTO<Audience>();
		// 设置推送参数,requestid需要每次变化唯一
		pushDTO.setRequestId(System.currentTimeMillis() + "");
		Settings settings = new Settings();
		pushDTO.setSettings(settings);
		// 消息有效期,走厂商消息必须设置该值
		settings.setTtl(3600000);
		// 在线走个推通道时推送的消息体
		PushMessage pushMessage = new PushMessage();
		pushDTO.setPushMessage(pushMessage);
		JSONObject transmissionJson = new JSONObject();
		transmissionJson.set("title", title);
		transmissionJson.set("content", content);
		transmissionJson.set("payload", payload);
		// 此格式的透传消息由 unipush 做了特殊处理,会自动展示通知栏。开发者也可自定义其它格式,在客户端自己处理。
		pushMessage.setTransmission(JSONUtil.toJsonStr(transmissionJson));
		// 设置接收人信息
		Audience audience = new Audience();
		audience.addCid(cid);
		pushDTO.setAudience(audience);

		ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
		if (apiResult.isSuccess()) {
			// success
			System.err.println("推送成功");
			System.out.println(apiResult.getData());
			String clientStatus = getClientStatus(apiResult.getData(), cid);
			if ("successed_offline".equals(clientStatus)){
				// 应用不在线 厂商通道下发
				//设置离线推送时的消息体
				PushChannel pushChannel = new PushChannel();
			}
		} else {
			// failed
			System.err.println("推送失败");
			System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
		}
	}

	public static void pushToListByCid(List<String> cid, String title, String content, String payload){
		// 批量发送
		AudienceDTO audienceDTO = new AudienceDTO();
		PushDTO<Audience> pushDTO = buildPushDTO(title, content, payload);
		ApiResult<TaskIdDTO> createApiResult = pushApi.createMsg(pushDTO);
		if (!createApiResult.isSuccess()) {
		}
		// 设置接收人信息
		Audience audience = new Audience();
		audience.setCid(cid);
		pushDTO.setAudience(audience);

		audienceDTO.setAudience(audience);
		audienceDTO.setTaskid(createApiResult.getData().getTaskId());
		audienceDTO.setAsync(true);
		// 设置推送参数,requestid需要每次变化唯一
		pushDTO.setRequestId(System.currentTimeMillis() + "");
		Settings settings = new Settings();

		pushDTO.setSettings(settings);
		// 消息有效期,走厂商消息必须设置该值
		settings.setTtl(3600000);

		ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushListByCid(audienceDTO);
		if (apiResult.isSuccess()) {
			// success
			System.err.println("推送成功");
		} else {
			// failed
			System.err.println("推送失败");
			System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
		}
	}

	private static PushDTO<Audience> buildPushDTO(String title, String content, String payload) {
		PushDTO<Audience> pushDTO = new PushDTO<>();
		// 设置推送参数
		// requestid需要每次变化唯一
		pushDTO.setRequestId(System.currentTimeMillis() + "");
		pushDTO.setGroupName("wxb-group");

		//配置推送条件
		// 1: 表示该消息在用户在线时推送个推通道,用户离线时推送厂商通道;
		// 2: 表示该消息只通过厂商通道策略下发,不考虑用户是否在线;
		// 3: 表示该消息只通过个推通道下发,不考虑用户是否在线;
		// 4: 表示该消息优先从厂商通道下发,若消息内容在厂商通道代发失败后会从个推通道下发。
		Strategy strategy = new Strategy();
		strategy.setDef(1);
		Settings settings = new Settings();
		settings.setStrategy(strategy);
		pushDTO.setSettings(settings);
		//消息有效期,走厂商消息需要设置该值
		settings.setTtl(3600000);

		//推送苹果离线通知标题内容
		Alert alert = new Alert();
		//苹果离线通知栏标题
		alert.setTitle(title);
		//苹果离线通知栏内容
		alert.setBody(content);
		Aps aps = new Aps();
		//1表示静默推送(无通知栏消息),静默推送时不需要填写其他参数。
		//苹果建议1小时最多推送3条静默消息
		aps.setContentAvailable(0);
		aps.setSound("default");
		aps.setAlert(alert);
		IosDTO iosDTO = new IosDTO();
		iosDTO.setAps(aps);
		iosDTO.setType("notify");
		PushChannel pushChannel = new PushChannel();
		pushChannel.setIos(iosDTO);
		//安卓离线厂商通道推送消息体
		AndroidDTO androidDTO = new AndroidDTO();
		Ups ups = new Ups();
		ThirdNotification notification1 = new ThirdNotification();
		ups.setNotification(notification1);
		//安卓离线展示的标题
		notification1.setTitle(title);
		//安卓离线展示的内容
		notification1.setBody(content);
		notification1.setClickType("intent");
		// component=io.dcloud.HBuilder/io.dcloud.PandoraEntry,其中 io.dcloud.HBuilder 为 App 包名,需要替换为自己 App 的包名,与 App 云端打包界面设置的 Android 包名一致
		notification1.setIntent("intent://io.dcloud.unipush/?#Intent;scheme=unipush;launchFlags=0x4000000;component=com.xinxiaobao.xxb.gys/io.dcloud.PandoraEntry;S.UP-OL-SU=true;S.title=" + title + ";S.content=" + content + ";S.payload=test;end");
		//各厂商自有功能单项设置
		ups.addOption("HW", "/message/android/notification/badge/class", "io.dcloud.PandoraEntry");
		ups.addOption("HW", "/message/android/notification/badge/add_num", 1);
		ups.addOption("HW", "/message/android/notification/importance", "HIGH");
		ups.addOption("VV","classification",1);
                // 配置小米消息通道channel_id
		ups.addOption("XM","extra.channel_id","xxb_gys");
		androidDTO.setUps(ups);
		pushChannel.setAndroid(androidDTO);
		pushDTO.setPushChannel(pushChannel);

		// PushMessage在线走个推通道才会起作用的消息体
		PushMessage pushMessage = new PushMessage();
		pushDTO.setPushMessage(pushMessage);

		JSONObject transmissionJson = new JSONObject();
		transmissionJson.set("title", title);
		transmissionJson.set("content", content);
		transmissionJson.set("payload", payload);
		pushMessage.setTransmission(JSONUtil.toJsonStr(transmissionJson));
		return pushDTO;
	}

	private static String getClientStatus(Map<String, Map<String, String>> resultBody, String cid){
		Map<String, String> map = new HashMap<>();
		Set<String> strings = resultBody.keySet();
		for (String key : strings) {
			map = resultBody.get(key);
		}
		return map.get(cid);
	}

	private static Map<String, String> getClientStatus(Map<String, Map<String, String>> resultBody){
		Map<String, String> map = new HashMap<>();
		Set<String> strings = resultBody.keySet();
		for (String key : strings) {
			map = resultBody.get(key);
		}
		return map;
	}