服务端整合极光推送
一、前言
1.1 推送目标
极光文档:http://docs.jiguang.cn/jpush/guideline/intro/
通过使用标签,别名,Registration ID 和用户分群,开发者可以向特定的一个或多个用户推送消息。
-
标签
为安装了应用程序的用户打上标签,其目的主要是方便开发者根据标签,来批量下发 Push 消息。 可为每个用户打多个标签。 举例: game, old_page, women -
别名
每个用户只能指定一个别名。 同一个应用程序内,对不同的用户,建议取不同的别名。这样,尽可能根据别名来唯一确定用户。 -
Registration ID
客户端初始化 JPush 成功后,JPush 服务端会分配一个 Registration ID,作为此设备的标识(同一个手机不同 App 的 Registration ID 是不同的)。开发者可以通过指定具体的 Registration ID 来进行对单一设备的推送。 -
用户分群
用户分群的筛选条件有:标签、地理位置、活跃用户、系统版本、智能标签。 比如,开发者可以设置这样的用户分群:位于北京、上海、广州和深圳,并且最近 7 天内的活跃用户。 开发者可以通过在控制台设置好用户分群之后,在控制台推送时指定该分群的名称或使用 API 调用该分群的 id 发送。
1.2 推送方式
这里只是对具体场景应用简单描述,设计一下。
我们的消息分为三类,一类是通知消息,给所有人。另一类是具体的工作安排,给某一部门的人。还有一类是具体的个人消息,如给领导发请假通知等。所以我们最终决定使用的方式包括一下方式:
1) 广播:顾名思义就是给所有人群发消息
2) 别名(alias):给指定id的终端设备发送消息。别名需要客户端进行设置。
3) 标签(tag):分组发送消息,理解起来应该类似于微信建了一个群聊的赶脚。标签需要客户端进行设置。
1.3 设计规则
客户端开发步骤简述
-
集成SDK(之前已经完成)
-
启动后,到服务器上注册,并获取注册ID(RegistrationID)
-
调用Method - setAliasAndTags (with Callback)函数完成别名和标签的设置。
注1:这里,我们应用的别名就是员工ID,标签就是部门ID。以此来进行分类推送
使用员工ID别名推送给具体某一个用户,使用部门ID推送给某一类人
二、服务端开发
2.1 极光推送maven包
<!-- 极光推送 -->
<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>
<!-- netty -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.6.Final</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
2.2 极光推送工具类
appkey和master_secert获取教程:http://docs.jiguang.cn/jpush/console/Instructions/
import cn.jiguang.common.resp.APIConnectionException;
import cn.jiguang.common.resp.APIRequestException;
import cn.jpush.api.JPushClient;
import cn.jpush.api.push.PushResult;
import cn.jpush.api.push.model.Message;
import cn.jpush.api.push.model.Options;
import cn.jpush.api.push.model.Platform;
import cn.jpush.api.push.model.PushPayload;
import cn.jpush.api.push.model.audience.Audience;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
import java.util.Map;
/**
* 极光推送工具类
*/
public class JpushUtils {
// 设置好账号的app_key和masterSecret是必须的
private static String APP_KEY = "XXXX";
private static String MASTER_SECRET = "XXXX";
//极光推送>>Android
//Map<String, String> parm是我自己传过来的参数,可以自定义参数
public static void jpushAndroid(Map<String, String> parm) {
//创建JPushClient(极光推送的实例)
JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY);
//推送的关键,构造一个payload
PushPayload payload = PushPayload.newBuilder()
.setPlatform(Platform.android())//指定android平台的用户
.setAudience(Audience.all())//你项目中的所有用户
// .setAudience(Audience.alias(parm.get("alias")))//设置别名发送,单发,点对点方式
//.setAudience(Audience.tag("tag1"))//设置按标签发送,相当于群发
// .setAudience(Audience.registrationId(parm.get("id")))//registrationId指定用户
.setNotification(Notification.android(parm.get("msg"), parm.get("title"), parm)) //发送内容
.setOptions(Options.newBuilder().setApnsProduction(true).setTimeToLive(7200).build())
// apnProduction指定开发环境 true为生产模式 false 为测试模式 (android不区分模式,ios区分模式) 不用设置也没关系
// TimeToLive 两个小时的缓存时间
.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
//Map<String, String> parm是我自己传过来的参数,可以自定义参数
public static void jpushIOS(Map<String, String> parm) {
//创建JPushClient
JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY);
PushPayload payload = PushPayload.newBuilder()
.setPlatform(Platform.ios())//ios平台的用户
.setAudience(Audience.all())//所有用户
//.setAudience(Audience.registrationId(parm.get("id")))//registrationId指定用户
.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);
System.out.println(pu.toString());
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
//极光推送>>All所有平台
public static void jpushAll(Map<String, String> parm) {
//创建JPushClient
JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY);
//创建option
PushPayload payload = PushPayload.newBuilder()
.setPlatform(Platform.all()) //所有平台的用户
.setAudience(Audience.registrationId(parm.get("id")))//registrationId指定用户
.setNotification(Notification.newBuilder()
.addPlatformNotification(IosNotification.newBuilder() //发送ios
.setAlert(parm.get("msg")) //消息体
.setBadge(+1)
.setSound("happy") //ios提示音
.addExtras(parm) //附加参数
.build())
.addPlatformNotification(AndroidNotification.newBuilder() //发送android
.addExtras(parm) //附加参数
.setAlert(parm.get("msg")) //消息体
.build())
.build())
.setOptions(Options.newBuilder().setApnsProduction(true).build())//指定开发环境 true为生产模式 false 为测试模式 (android不区分模式,ios区分模式)
.setMessage(Message.newBuilder().setMsgContent(parm.get("msg")).addExtras(parm).build())//自定义信息
.build();
try {
PushResult pu = jpushClient.sendPush(payload);
System.out.println(pu.toString());
} catch (APIConnectionException e) {
e.printStackTrace();
} catch (APIRequestException e) {
e.printStackTrace();
}
}
}
2.3 推送数据
@RestController
@RequestMapping("jpush")
public class JpushController {
@RequestMapping("/pushAndroid")
public JsonData pushMessageToAndroid(){
//设置推送参数
//这里可以自定义推送参数了
Map<String, String> parm = new HashMap<>();
//设置提示信息,内容是文章标题
parm.put("msg","胡传磊 回家吃饭了");
parm.put("title","回家吃饭");
parm.put("alias","abc");
JpushUtils.jpushAndroid(parm);
return JsonData.buildSuccess();
}
}
如果极光推送没有用户会报错误码:1011
查看教程:http://docs.jiguang.cn/jpush/client/Android/android_3m/
错误码定义
HTTP 返回码为 200 时,是业务相关的错误。
错误码 | 错误描述 |
---|---|
0 | 调用成功 |
10 | 系统内部错误 |
1001 | 只支持 HTTP Post 方法,不支持 Get 方法 |
1002 | 缺少了必须的参数 |
1003 | 参数值不合法 |
1004 | verification_code 验证失败 |
1005 | 消息体太大 |
1007 | receiver_value 参数 非法 |
1008 | appkey参数非法 |
1010 | msg_content 不合法 |
1011 | 没有满足条件的推送目标 |
1012 | iOS 不支持推送自定义消息。只有 Android 支持推送自定义消息。 |
1013 | content-type 只支持 application/x-www-form-urlencoded |
1014 | 消息内容包含敏感词汇。 |
1030 | 内部服务超时。稍后重试。 |
返回 1011 时:
如果群发:则此应用还没有一个客户端用户注册。请检查 SDK 集成是否正常。
如果是推送给某别名或者标签:则此别名或者标签还没有在任何客户端 SDK 提交设置成功。
来源:CSDN
作者:han949417140
链接:https://blog.csdn.net/han949417140/article/details/103994300