参考

UniPush 使用指南:

https://ask.dcloud.net.cn/article/35622

UniPush 开通指南:

https://ask.dcloud.net.cn/article/35716

在 uni-app 中使用 UniPush:

https://ask.dcloud.net.cn/article/35726

说明

  1. 5+ 接口 plus.push.getClientInfoAsync(successCB, errorCB),需要客户端在第一次运行时获取并提交到业务服务器绑定不需要重复获取

  2. 不集成 rom 厂商的推送,就无法在 App 离线时发送 push

  3. 个推的付费提升送达率的产品就是 vip push,而 uniPush 就是个推的 vip Push

  4. 推送通道选择逻辑

    在线走个推,离线走厂商

    • Android平台
      APP在线(个推推送通道可用)
      推送通知和透传消息都使用个推的推送通道下发推送消息。
      APP离线(个推推送通道不可用。推送通知-个推离线推送通道,透传消息-先厂商后个推离线推送通道)
      推送通知,使用个推离线推送通道,离线消息会存储在消息离线库,离线时间内APP在线后下发推送消息。
      透传消息,如果符合厂商推送的厂商手机(配置了手机厂商推送参数并且在对应厂商的手机上),则使用厂商推送通道下发推送消息;否则使用个推的离线推送通道,离线消息会存储在消息离线库,离线时间内APP在线后下发推送消息。
    • iOS平台
      推送通知,uniPush后台管理界面中不支持下发此类型,个推提供的服务端API支持下发推送通知(设置APN参数则通过苹果的APNS通道,否则使用个推通道)。
      透传消息,设置APN参数则通过苹果的APNS通道下发推送消息,没有设置APN参数则使用个推的推送通道下发。

整体架构

推送消息类型

  • 通知栏消息(推送通知)
    UniPush推送服务定义好的推送样式、后续动作的推送方式,客户端接收到后显示在系统通知栏,用户点击通知栏消息启动APP(激活到前台)

  • 透传消息
    即自定义消息,UniPush推送服务只负责消息传递,不做任何处理,客户端在接收到透传消息后需要自己去处理消息的展示方式或后续动作「消息不会出现在通知栏」
    UniPush推送服务对透传消息的数据符合以下格式时做了特殊处理,将透传消息显示到系统通知栏,前端 receive 中接收不到

    1
    {"title": "xxx","content": "xxx","payload": "xxx"}

服务端

RestAPI V2「推荐」

开发前必读-个推文档中心 (getui.com)

公共参数:公共参数-个推文档中心 (getui.com)

GetuiLaboratory/getui-pushapi-java-client-v2: 个推官方提供的推送服务端SDK(Java语言),基于全新的RestAPI V2接口(https://docs.getui.com/getui/server/rest_v2/introduction/) (github.com)

环境要求

  1. 需要配合JDK 1.6或其以上版本
  2. 使用个推PUSH SDK前,您需要先前往个推开发者中心 完成开发者接入的一些准备工作,创建应用。详细见操作步骤
  3. 准备工作完成后,前往个推开发者中心获取应用配置,后续将作为使用SDK的输入。详细见操作步骤

安装依赖

推荐通过Maven来管理项目依赖,您只需在项目的pom.xml文件中声明如下依赖

1
2
3
4
5
<dependency>
<groupId>com.getui.push</groupId>
<artifactId>restful-sdk</artifactId>
<version>1.0.0.3</version>
</dependency>

快速开始

下列代码示例向您展示了使用个推Push SDK For Java调用一个API的3个主要步骤:

  1. 设置参数,创建API
  2. 发起API调用
  3. 处理响应
创建API
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestCreatApi {
public void test() {
// 设置httpClient最大连接数,当并发较大时建议调大此参数。或者启动参数加上 -Dhttp.maxConnections=200
System.setProperty("http.maxConnections", "200");
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
//填写应用配置
apiConfiguration.setAppId("xxx");
apiConfiguration.setAppKey("xxx");
apiConfiguration.setMasterSecret("xxx");
// 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
apiConfiguration.setDomain("https://restapi.getui.com/v2/");
// 实例化ApiHelper对象,用于创建接口对象
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
// 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
PushApi pushApi = apiHelper.creatApi(PushApi.class);
}
}
根据cid进行单推
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class TestPushApi {
//pushApi的创建见上述使用示例:创建API
public PushApi pushApi;
public void test() {
//根据cid进行单推
PushDTO<Audience> pushDTO = new PushDTO<Audience>();
// 设置推送参数
pushDTO.setRequestId(System.currentTimeMillis() + "");
PushMessage pushMessage = new PushMessage();
pushDTO.setPushMessage(pushMessage);
GTNotification notification = new GTNotification();
pushMessage.setNotification(notification);
notification.setTitle("标题" + new Date());
notification.setBody("body");
notification.setClickType("url");
notification.setUrl("https://www.getui.com");
// 设置接收人信息
Audience audience = new Audience();
pushDTO.setAudience(audience);
audience.addCid("xxx");

// 进行cid单推
ApiResult<Map<String, Map<String, String>>> apiResult = pushApi.pushToSingleByCid(pushDTO);
if (apiResult.isSuccess()) {
// success
System.out.println(apiResult.getData());
} else {
// failed
System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
}
}
获取单日推送数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestStatisticApi {
//StatisticApi的创建见上述使用示例:创建API
public StatisticApi statisticApi;
public void test() {
// 获取单日推送数据
Set<String> taskIds = new HashSet<String>();
taskIds.add("xxx");
ApiResult<Map<String, Map<String, StatisticDTO>>> apiResult = statisticApi.queryPushResultByTaskIds(taskIds);
if (apiResult.isSuccess()) {
// success
System.out.println(apiResult.getData());
} else {
// failed
System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
}
}
查询用户状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class TestUserApi {
//UserApi的创建见上述使用示例:创建API
public UserApi userApi;
public void test() {
Set<String> cids = new HashSet<String>();
cids.add("xxx");
// 查询用户状态
ApiResult<Map<String, CidStatusDTO>> apiResult = userApi.queryUserStatus(cids);
if (apiResult.isSuccess()) {
// success
System.out.println(apiResult.getData());
} else {
// failed
System.out.println("code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
}
}
}

其余推送功能可参考该链接

设置代理

当需要使用代理进行http访问时,可以参考如下设置

1
2
3
4
5
6
GtApiConfiguration apiConfiguration = new GtApiConfiguration();
//设置代理对象,参数依次为host、端口、鉴权账户、鉴权密码。其中鉴权账户密码可选
GtHttpProxyConfig proxyConfig = new GtHttpProxyConfig("xxx",xxx,"xxx","xxx");
apiConfiguration.setProxyConfig(proxyConfig);
ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
PushApi pushApi = apiHelper.creatApi(PushApi.class);

已支持的API列表

以下是消息推送功能与推送API的对应关系

API类别 功能 调用的API名称
鉴权API 鉴权 com.getui.push.v2.sdk.api.AuthApi.auth
鉴权API 删除鉴权 com.getui.push.v2.sdk.api.AuthApi.close
推送API cid单推 com.getui.push.v2.sdk.api.PushApi.pushToSingleByCid
推送API 别名单推 com.getui.push.v2.sdk.api.PushApi.pushToSingleByAlias
推送API cid批量单推 com.getui.push.v2.sdk.api.PushApi.pushBatchByCid
推送API 别名批量单推 com.getui.push.v2.sdk.api.PushApi.pushBatchByAlias
推送API tolist创建消息 com.getui.push.v2.sdk.api.PushApi.createMsg
推送API cid批量推 com.getui.push.v2.sdk.api.PushApi.pushListByCid
推送API 别名批量推 com.getui.push.v2.sdk.api.PushApi.pushListByAlias
推送API 群推 com.getui.push.v2.sdk.api.PushApi.pushAll
推送API 条件筛选用户推送 com.getui.push.v2.sdk.api.PushApi.pushByTag
推送API 标签快速推送 com.getui.push.v2.sdk.api.PushApi.pushByFastCustomTag
推送API 停止任务 com.getui.push.v2.sdk.api.PushApi.stopPush
推送API 查询定时任务 com.getui.push.v2.sdk.api.PushApi.queryScheduleTask
推送API 删除定时任务 com.getui.push.v2.sdk.api.PushApi.deleteScheduleTask
统计API 获取推送结果 com.getui.push.v2.sdk.api.StatisticApi.queryPushResultByTaskIds
统计API 任务组名查报表 com.getui.push.v2.sdk.api.StatisticApi.queryPushResultByGroupName
统计API 单日推送数据 com.getui.push.v2.sdk.api.StatisticApi.queryPushResultByDate
统计API 单日用户数据接口 com.getui.push.v2.sdk.api.StatisticApi.queryUserDataByDate
统计API 24小时在线用户数 com.getui.push.v2.sdk.api.StatisticApi.queryOnlineUserData
用户API 绑定别名 com.getui.push.v2.sdk.api.UserApi.bindAlias
用户API 根据cid查询别名 com.getui.push.v2.sdk.api.UserApi.queryAliasByCid
用户API 根据别名查询cid com.getui.push.v2.sdk.api.UserApi.queryCidByAlias
用户API 批量解绑别名 com.getui.push.v2.sdk.api.UserApi.batchUnbindAlias
用户API 解绑所有别名 com.getui.push.v2.sdk.api.UserApi.unbindAllAlias
用户API 一个用户绑定一批标签 com.getui.push.v2.sdk.api.UserApi.userBindTags
用户API 一批用户绑定一个标签 com.getui.push.v2.sdk.api.UserApi.usersBindTag
用户API 一批用户解绑一个标签 com.getui.push.v2.sdk.api.UserApi.deleteUsersTag
用户API 查询标签 com.getui.push.v2.sdk.api.UserApi.queryUserTags
用户API 添加黑名单用户 com.getui.push.v2.sdk.api.UserApi.addBlackUser
用户API 移除黑名单用户 com.getui.push.v2.sdk.api.UserApi.removeBlackUser
用户API 查询用户状态 com.getui.push.v2.sdk.api.UserApi.queryUserStatus
用户API 设置角标(仅支持IOS) com.getui.push.v2.sdk.api.UserApi.setBadge
用户API 查询用户总量 com.getui.push.v2.sdk.api.UserApi.queryUser

老版本

https://docs.getui.com/getui/server/java/push/

简述

个推为开发者提供了如下3种消息推送方式

  • toSingle :简称“单推”,指向单个用户推送消息
  • toList:简称“批量推”,指向制定的一批用户推送消息
  • toApp:简称“群推”,指向APP符合筛选条件的所有用户推送消息,支持定速推送、定时推送,支持条件的交并补功能

maven 引入依赖

1
2
3
4
5
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-http</artifactId>
<version>4.1.2.0</version>
</dependency>

再增加一个repository

1
2
3
4
5
6
<repositories>
<repository>
<id>getui-nexus</id>
<url>http://mvn.gt.getui.com/nexus/content/repositories/releases/</url>
</repository>
</repositories>

示例

toSingle

简称“单推”,指向单个用户推送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.SingleMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.exceptions.RequestException;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.LinkTemplate;
import com.gexin.rp.sdk.http.Constants;

public class UniPushUtil {
// 详见【概述】-【服务端接入步骤】-【STEP1】说明,获得的应用配置
private static String appId = "";
private static String appKey = "";
private static String masterSecret = "";

static String CID = "";
// 别名推送方式
// static String Alias = "";
// 如果需要使用HTTPS,直接修改url即可
//private static String url = "https://api.getui.com/apiex.htm";
static String host = "http://api.getui.com/apiex.htm";

public static void main(String[] args) throws Exception {
// 设置后,根据别名推送,会返回每个cid的推送结果
System.setProperty(Constants.GEXIN_PUSH_SINGLE_ALIAS_DETAIL, "true");
IGtPush push = new IGtPush(host, appKey, masterSecret);
NotificationTemplate template = getNotificationTemplate();
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 getNotificationTemplate() {
NotificationTemplate template = new NotificationTemplate();
// 设置APPID与APPKEY
template.setAppId(appId);
template.setAppkey(appKey);

Style0 style = new Style0();
// 设置通知栏标题与内容
style.setTitle("请输入通知栏标题");
style.setText("请输入通知栏内容");
// 配置通知栏图标
style.setLogo("icon.png");
// 配置通知栏网络图标
style.setLogoUrl("");
// 设置通知是否响铃,震动,或者可清除
style.setRing(true);
style.setVibrate(true);
style.setClearable(true);
style.setChannel("通知渠道id");
style.setChannelName("通知渠道名称");
style.setChannelLevel(3); //设置通知渠道重要性
template.setStyle(style);

template.setTransmissionType(1); // 透传消息接受方式设置,1:立即启动APP,2:客户端收到消息后需要自行处理
template.setTransmissionContent("请输入您要透传的内容");

//template.setAPNInfo(getAPNPayload()); //详见【推送模板说明】iOS通知样式设置
return template;
}
}
toList

简称“批量推”,指向制定的一批用户推送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import java.util.ArrayList;
import java.util.List;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.ListMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.NotificationTemplate;
public class PushList {
// 详见【概述】-【服务端接入步骤】-【STEP1】说明,获得的应用配置
private static String appId = "";
private static String appKey = "";
private static String masterSecret = "";

static String CID1 = "";
static String CID2 = "";
// 别名推送方式
// static String Alias1 = "";
// static String Alias2 = "";
// 如果需要使用HTTPS,直接修改url即可
// static String host = "https://api.getui.com/apiex.htm";
static String host = "http://api.getui.com/apiex.htm";
public static void main(String[] args) throws Exception {
// 配置返回每个用户返回用户状态,可选
System.setProperty("gexin_pushList_needDetails", "true");
// 配置返回每个别名及其对应cid的用户状态,可选
// System.setProperty("gexin_pushList_needAliasDetails", "true");
IGtPush push = new IGtPush(host, appKey, masterSecret);
// 通知透传模板
NotificationTemplate template = notificationTemplateDemo();
ListMessage message = new ListMessage();
message.setData(template);
// 设置消息离线,并设置离线时间
message.setOffline(true);
// 离线有效时间,单位为毫秒
message.setOfflineExpireTime(24 * 1000 * 3600);
// 厂商通道下发策略
message.setStrategyJson("{\"default\":4,\"ios\":4,\"st\":4}");

// 配置推送目标
List targets = new ArrayList();
Target target1 = new Target();
Target target2 = new Target();
target1.setAppId(appId);
target1.setClientId(CID1);
// target1.setAlias(Alias1);
target2.setAppId(appId);
target2.setClientId(CID2);
// target2.setAlias(Alias2);
targets.add(target1);
targets.add(target2);
// taskId用于在推送时去查找对应的message
String taskId = push.getContentId(message);
IPushResult ret = push.pushMessageToList(taskId, targets);
System.out.println(ret.getResponse().toString());
}
public static NotificationTemplate notificationTemplateDemo() {
NotificationTemplate template = new NotificationTemplate();
// 设置APPID与APPKEY
template.setAppId(appId);
template.setAppkey(appKey);

Style0 style = new Style0();
// 设置通知栏标题与内容
style.setTitle("请输入通知栏标题");
style.setText("请输入通知栏内容");
// 配置通知栏图标
style.setLogo("icon.png");
// 配置通知栏网络图标
style.setLogoUrl("");
// 设置通知是否响铃,震动,或者可清除
style.setRing(true);
style.setVibrate(true);
style.setClearable(true);
style.setChannel("通知渠道id");
style.setChannelName("通知渠道名称");
style.setChannelLevel(3); //设置通知渠道重要性
template.setStyle(style);

// 透传消息接受方式设置,1:立即启动APP,2:客户端收到消息后需要自行处理
template.setTransmissionType(2);
template.setTransmissionContent("请输入您要透传的内容");

//template.setAPNInfo(getAPNPayload()); //详见【推送模板说明】iOS通知样式设置
return template;
}
}
toApp

简称“群推”,指向APP符合筛选条件的所有用户推送消息,支持定速推送、定时推送,支持条件的交并补功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.AppMessage;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.LinkTemplate;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;


public class AppPush {

// STEP1:获取应用基本信息
private static String appId = "";
private static String appKey = "";
private static String masterSecret = "";
// 如果需要使用HTTPS,直接修改url即可
//private static String url = "https://api.getui.com/apiex.htm";
private static String url = "http://api.getui.com/apiex.htm";

public static void main(String[] args) throws IOException {

IGtPush push = new IGtPush(url, appKey, masterSecret);

Style0 style = new Style0();
// STEP2:设置推送标题、推送内容
style.setTitle("请输入通知栏标题");
style.setText("请输入通知栏内容");
style.setLogo("push.png"); // 设置推送图标
// STEP3:设置响铃、震动等推送效果
style.setRing(true); // 设置响铃
style.setVibrate(true); // 设置震动


// STEP4:选择通知模板
NotificationTemplate template = new NotificationTemplate();
template.setAppId(appId);
template.setAppkey(appKey);
template.setStyle(style);

// STEP5:定义"AppMessage"类型消息对象,设置推送消息有效期等推送参数
List<String> appIds = new ArrayList<String>();
appIds.add(appId);
AppMessage message = new AppMessage();
message.setData(template);
message.setAppIdList(appIds);
message.setOffline(true);
message.setOfflineExpireTime(1000 * 600); // 时间单位为毫秒

// STEP6:执行推送
IPushResult ret = push.pushMessageToApp(message);
System.out.println(ret.getResponse().toString());
}
}

web 自助发送界面

在DCloud的开发者后台:https://dev.dcloud.net.cn/

客户端调用的 js API

https://www.html5plus.org/doc/zh_cn/push.html

  • 服务端发送通知消息,出现在通知栏,通过 click 监听点击事件,并解析通知内容
  • 服务端发送透传消息时,不会出现在通知栏,通过 receive 接收。透传消息 json 结构自定义,。注意:如果透传消息结构为 {"title": "xxx","content": "xxx","payload": "xxx"} ,则会被解析为通知消息,在通知栏出现,receive 则接收不到
1
2
3
4
5
6
7
8
9
10
11
12
13
 // 添加监听从系统消息中心点击某条消息启动应用事件
plus.push.addEventListener('click', function(msg){
// 分析msg.payload处理业务逻辑
mui.toast('You clicked: ' + msg.content);
console.log( 'You clicked: ' + msg.content );
}, false );

// 服务端发送透传消息时,通过 receive 接收。透传消息 json 结构自定义,但如果为 {"title": "xxx","content": "xxx","payload": "xxx"} ,则会解析为通知消息,在通知栏出现,receive 则接收不到
plus.push.addEventListener('receive', function(msg){
// 分析msg.payload处理业务逻辑
mui.toast('You received: ' + msg.content);
console.log( 'You received: ' + msg.content );
}, false );