最近需求往指定app用户发推送,app采用的是uniapp,后端采用Java,最初使用DCloud的开发者后台(https://dev.dcloud.net.cn/)发送很顺畅,但是调用api遇到很多坑,网上搜索一圈方案都不ok。折腾许久,完美兼容Android、ios。
前端直接参考https://ask.dcloud.net.cn/article/35622
准备:pom.xml文件
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-http</artifactId>
<version>4.1.1.4</version>
</dependency>
<repositories>
<repository>
<id>getui-nexus</id>
<url>http://mvn.gt.getui.com/nexus/content/repositories/releases/</url>
</repository>
</repositories>
后端Java:
import com.gexin.rp.sdk.base.IPushResult; import com.gexin.rp.sdk.base.impl.AppMessage; import com.gexin.rp.sdk.base.impl.SingleMessage; import com.gexin.rp.sdk.base.impl.Target; import com.gexin.rp.sdk.base.notify.Notify; import com.gexin.rp.sdk.base.payload.APNPayload; import com.gexin.rp.sdk.base.uitls.AppConditions; import com.gexin.rp.sdk.exceptions.RequestException; import com.gexin.rp.sdk.http.Constants; import com.gexin.rp.sdk.http.IGtPush; import com.gexin.rp.sdk.template.AbstractTemplate; import com.gexin.rp.sdk.template.LinkTemplate; import com.gexin.rp.sdk.template.NotificationTemplate; import com.gexin.rp.sdk.template.TransmissionTemplate; import com.gexin.rp.sdk.template.style.AbstractNotifyStyle; import com.gexin.rp.sdk.template.style.Style0; import org.springframework.stereotype.Service;
public class UninAppNews {
//参照上方链接获取
private static String appId = "";
private static String appKey = "";
private static String masterSecret = "";
// 如果需要使用HTTPS,直接修改url即可
//private static String host = "https://api.getui.com/apiex.htm";
private static String host = "http://api.getui.com/apiex.htm";
private static String CID = "";//前端获取
//指定用户推送
public void sendNews() {
// 设置后,根据别名推送,会返回每个cid的推送结果
System.setProperty(Constants.GEXIN_PUSH_SINGLE_ALIAS_DETAIL, "true");
IGtPush push = new IGtPush(host, appKey, masterSecret);
NotificationTemplate template = getNotificationTemplate2();
SingleMessage message = new SingleMessage();
message.setOffline(true);
// 离线有效时间,单位为毫秒
message.setOfflineExpireTime(24 * 3600 * 1000);
message.setData(template);
// 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发
message.setPushNetWorkType(0);
// 厂商通道下发策略
message.setStrategyJson("{\"default\":4,\"ios\":4,\"st\":4}");
Target target = new Target();
target.setAppId(appId);
target.setClientId(CID);
//target.setAlias(Alias);
IPushResult ret = null;
try {
ret = push.pushMessageToSingle(message, target);
} catch (RequestException e) {
e.printStackTrace();
ret = push.pushMessageToSingle(message, target, e.getRequestId());
}
if (ret != null) {
System.out.println(ret.getResponse().toString());
} else {
System.out.println("服务器响应异常");
}
}
//通知模板
public static NotificationTemplate getNotificationTemplate2() {
NotificationTemplate template = new NotificationTemplate();
// 设置APPID与APPKEY
template.setAppId(appId);
template.setAppkey(appKey);
Style0 style = new Style0();
// 设置通知栏标题与内容
style.setTitle("咚咚咚咚咚");//Android消息标题
style.setText("动咚1119");//Android消息内容
// 配置通知栏图标
style.setLogo("icon.png");
// 配置通知栏网络图标
// style.setLogoUrl("");
// 设置通知是否响铃,震动,或者可清除
style.setRing(true);
style.setVibrate(true);
style.setClearable(false);
// style.setChannel("通知渠道id");
// style.setChannelName("通知渠道名称");
style.setChannelLevel(4); //设置通知渠道重要性
template.setStyle(style);
template.setTransmissionType(2); // 透传消息设置,收到消息是否立即启动应用: 1为立即启动,2则广播等待客户端自启动
template.setTransmissionContent("请输入您要透传的内容");
template.setAPNInfo(getAPNPayload()); //详见【推送模板说明】iOS通知样式设置
return template;
}
//ios样式模板
private static APNPayload getAPNPayload() {
APNPayload payload = new APNPayload();
//在已有数字基础上加1显示,设置为-1时,在已有数字上减1显示,设置为数字时,显示指定数字
payload.setAutoBadge("+1");
payload.setContentAvailable(0);
//ios 12.0 以上可以使用 Dictionary 类型的 sound
payload.setSound("default");
payload.setCategory("$由客户端定义");
payload.addCustomMsg("由客户自定义消息key", "由客户自定义消息value");
//简单模式APNPayload.SimpleMsg
// payload.setAlertMsg(new APNPayload.SimpleAlertMsg("给你发消息了"));
payload.setAlertMsg(getDictionaryAlertMsg()); //字典模式使用APNPayload.DictionaryAlertMsg
return payload;
}
//ios消息体
private static APNPayload.DictionaryAlertMsg getDictionaryAlertMsg() {
APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();
alertMsg.setBody("小何给你发消息了");//ios消息内容
alertMsg.setActionLocKey("显示关闭和查看两个按钮的消息");
alertMsg.setLocKey("loc-key1");
alertMsg.addLocArg("loc-ary1");
// alertMsg.setLaunchImage("调用已经在应用程序中绑定的图形文件名");
// iOS8.2以上版本支持
alertMsg.setTitle("通知标题");//ios消息标题
// alertMsg.setTitleLocKey("自定义通知标题");
// alertMsg.addTitleLocArg("自定义通知标题组");
return alertMsg;
}
}
不出意外复制即用。
官网文档http://docs.getui.com/getui/server/java/template/
在DCloud的开发者后台:https://dev.dcloud.net.cn/