最近做了个极光推送的功能,一下是我对这个功能的一点理解;

首先要先介入极光的包,通过maven加载包:jiguang-common,gson,log4j,slf4j,导入的方法官网上都有,直接去极光API文档上复制就行;导入完成之后在Service层添加推送方法

public Integer sendPush(String operatorId, String taskId) { ... }

首先要先添加两个重要的对象ClientConfig,JPushClient;ClientConfig是客户端配置的一些参数和极光推送需要访问的一些url;JPushClient就是极光推送的核心类。

ClientConfig clientConfig = ClientConfig.getInstance();

JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null, clientConfig);

ClientConfig.getInstance();   获取对象的实例;

MASTER_SECRET,APP_KEY,这两个字段是注册极光推送账号的时候分配给你的,复制上去即可;

接下来是获取regId和cid;regId是当客户端接入了极光的代码之后,会自动生成一个编码,需要服务端这边记录下来,我自己建了一张表,通过客户的手机号码和regId建立管理关系,依次来推送。注:极光推送的时候,极光推送的服务端是不认手机号码的,他们是根据regId来进行推送,所以regId至关重要;由于我有多个推送方法,而regId和cid是都需要获取的,所以我把他提出来写;

MapresultMap = regIdAndCid(operatorId);

public MapregIdAndCid(String operatorId) {

String result = "0";

ClientConfig clientConfig = ClientConfig.getInstance();

JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null,         clientConfig);Mapmap = new HashMap();

PbRegist pbRegist = new PbRegist();

pbRegist.setUserId(operatorId);

PbRegist regist = pbRegistDao.load(pbRegist);

String regId = "";

if (null != regist) {

regId = regist.getRegId();

} else {

_logger.info("regId未生成");

map.put("result", "2");

return map;

}

//获取cid

CIDResult result_cidList = null;

String cid = "";

try {

result_cidList = jpushClient.getCidList(1, "push");

//切割cid

String a = result_cidList.toString();

cid = a.substring(13,a.length()-3);

} catch (APIConnectionException | APIRequestException e1) {

_logger.info("cid获取错误");

e1.printStackTrace();

map.put("result", "1");

return map;

}

map.put("regId", regId);

map.put("cid", cid);

map.put("result", result);

return map;

}

operatorId是手机号码,通过手机号码查询到表里面的regId;cid是通过jpushClient.getCidList方法获得。其中result的编码:0-成功,1-cid获取失败,2-该用户未登录没有regId;

在都获取完成之后,需要构建一个push的对象:PushPayload payload = buildPushObject_to_do_task(regId,cid);

//创建一个推送-待办任务的推送

public static PushPayload buildPushObject_to_do_task(String regId, String cid) {

return PushPayload.newBuilder()

.setPlatform(Platform.all())

.setAudience(Audience.registrationId(regId))

.setNotification(Notification.alert(ALERT))

.setCid(cid)

.setOptions(Options.newBuilder()

//提交生产的时候需要切换

//.setApnsProduction(true)

.setApnsProduction(false)

.setTimeToLive(864000)

.build())

.build();

}

推送对象需要的元素是:Platform.all()推送的平台,可以设置仅推ios,仅推and,和全平台都推;Audience.registrationId(regId)这个就是客户端登录的时候,极光后台分配给你的编码,需要你自己保存的;.setNotification(Notification.alert(ALERT)),推送通知的内容,ALERT可以在类的顶部自己定义一段话;.setCid(cid) 通过 jpushClient.getCidList(...);方法获取;Options选项Production:环境,true生产环境;false开发、测试环境;TimeToLive保留多少天,默认1天,最多10天,86400*10 = 10天;

推送对象完成后,进入最后一步,推送:

PushResult result = jpushClient.sendPush(payload);    要用try - catch

//推送

try {

PushResult result = jpushClient.sendPush(payload);

_logger.info("Got result - " + result);

return 0;

} catch (APIConnectionException e) {

_logger.error("Connection error. Should retry later. ", e);

return 1;

} catch (APIRequestException e) {

_logger.error("Error response from JPush server. Should review and fix it. ", e);

_logger.info("HTTP Status: " + e.getStatus());

_logger.info("Error Code: " + e.getErrorCode());

_logger.info("Error Message: " + e.getErrorMessage());

return 1;

}

备注:0-推送成功;1-推送失败;

以下为整个类的完整代码:

//极光推送 收到待办任务 1-推送失败,0-推送成功,2-该用户未登录,没有生成regid没有regId@Override

public Integer sendPush(String operatorId, String taskId) {

ClientConfig clientConfig = ClientConfig.getInstance();JPushClient jpushClient = new         JPushClient(MASTER_SECRET, APP_KEY, null, clientConfig);MapresultMap =             regIdAndCid(operatorId);

String resultFlag = resultMap.get("result")+"";

if("1".equals(resultFlag)){

return 1;

}

if("2".equals(resultFlag)){

return 2;

}

String regId = resultMap.get("regId")+"";

String cid = resultMap.get("cid")+"";

//构建一个push对象

PushPayload payload = buildPushObject_to_do_task(regId,cid);

_logger.info("payload - " + payload);

//推送

try {

PushResult result = jpushClient.sendPush(payload);

_logger.info("Got result - " + result);

return 0;

} catch (APIConnectionException e) {

_logger.error("Connection error. Should retry later. ", e);

return 1;

} catch (APIRequestException e) {

_logger.error("Error response from JPush server. Should review and fix it. ", e);

_logger.info("HTTP Status: " + e.getStatus());

_logger.info("Error Code: " + e.getErrorCode());

_logger.info("Error Message: " + e.getErrorMessage());

return 1;

}

}

//创建一个推送-待办任务的推送

public static PushPayload buildPushObject_to_do_task(String regId, String cid) {

return PushPayload.newBuilder()

.setPlatform(Platform.all())

.setAudience(Audience.registrationId(regId))

.setNotification(Notification.alert(ALERT))

.setCid(cid)

.setOptions(Options.newBuilder()

//提交生产的时候需要切换

//.setApnsProduction(true)

.setApnsProduction(false)

.        setTimeToLive(864000)

.build())

.build();

}

//获取regId和cid方法

public MapregIdAndCid(String operatorId) {

String result = "0";

ClientConfig clientConfig = ClientConfig.getInstance();

JPushClient jpushClient = new JPushClient(MASTER_SECRET, APP_KEY, null,             clientConfig);

Mapmap = new HashMap();

PbRegist pbRegist = new PbRegist();

pbRegist.setUserId(operatorId);

PbRegist regist = pbRegistDao.load(pbRegist);

String regId = "";

if (null != regist) {

regId = regist.getRegId();

} else {

_logger.info("regId未生成");

map.put("result", "2");

return map;

}

//获取cid

CIDResult result_cidList = null;

String cid = "";

try {

result_cidList = jpushClient.getCidList(1, "push");

//切割cid

String a = result_cidList.toString();

cid = a.substring(13,a.length()-3);

} catch (APIConnectionException | APIRequestException e1) {

_logger.info("cid获取错误");

e1.printStackTrace();

map.put("result", "1");

return map;

}

map.put("regId", regId);

map.put("cid", cid);

map.put("result", result);

return map;

}

第一次用极光推送,还有很多瑕疵,希望大家多多指点 ~

推送成功后的json:

Got result - {"msg_id":1141315895,"sendno":1718225847,"statusCode":0}

payload 推送对象的json:

payload -

{"platform":"all",

"audience":{"registration_id":["13065ffa4e0c9ea0662"]},

"notification":{"alert":"您有一条交办任务于3小时后截止,记得去完成哦!",

"android":{"alert":"您有一条交办任务于3小时后截止,记得去完成哦!",

"extras":{"taskId":"JB00013420171114011"},

"title":"任务到期推送"},"ios":{"alert":"您有一条交办任务于3小时后截止,记得去完成哦!",

"extras":{"taskId":"JB00013420171114011"},"badge":"+1","sound":""}},

"options":{"sendno":1718225847,"time_to_live":864000,"apns_production":false},

"cid":"8c393f1fcc57e465e84019d5-d9f7fbc8-7cab-4447-aab4-350ab55c67ac"}

php极光推送获取cid返回404错误,极光推送心得相关推荐

  1. php连接数据库404错误代码,访问编码后的中文URL返回404错误的解决方法,url404_PHP教程...

    访问编码后的中文URL返回404错误的解决方法,url404 昨天做一个项目,其中有一个需求是每一张图片对应一小段文字对图片的说明,普通的做法是新建一个表然后把图片名与说明文字都记录到数据库内.仔细考 ...

  2. springboot返回404错误页面

    springboot返回404错误页面 1.HandlerInterceptor 拦截器的使用 实现HandlerInterceptor 接口,或者继承重写了HandlerInterceptor 接口 ...

  3. php获取prepay_id时报错,微信支付获取prepay_id返回签名错误,官方demo中的签名方法MD5验证有问题...

    引用官方V3微信支付PHP版的demo做的改动,在获取prepay_id发现总是返回签名错误,经与腾讯官方的"微信公众平台支付接口调试工具"对比发现MD5不一样,找到demo中代码 ...

  4. IIS基础:返回404错误页面的合理设置方式

    IIS默认的错误页是很不友好的,很多人看到默认的错误页时都会说:网站打不开了!白白损失了这部分流量.而如果错误页直接跳转到首页又对搜索引擎很不友好,搞不好首页还会被封掉.所以根据情况,有两个方法解决这 ...

  5. 安全狗php站点404,访问编码后的中文URL返回404错误的解决方法

    昨天做一个项目,其中有一个需求是每一张图片对应一小段文字对图片的说明,普通的做法是新建一个表然后把图片名与说明文字都记录到数据库内.仔细考虑后感觉这个应用不要数据库也能完成,我实现的方案是把说明文字U ...

  6. 404 jpeg图片_nginx中获取图片抛404错误

    问题是这样的,用的是TP框架,web服务器是nginx.重写了uri使其请求时过滤了/index.php/* 上线后,页面获取js正常,获取css也正常,但在读取css中设好的png,jpg等图片时报 ...

  7. Ajax提交post请求返回404错误

    最近使用ajax提交表单的时候,发现无法执行success函数,后台的代码也正常执行了,但是就是无法执行success函数,执行error函数,返回的错误代码时404.显然是找不到请求的url. 可是 ...

  8. 【自动化测试】Postman工具,Tests中获取response返回值错误的问题,显示为[object Object]

    前言 记录下学习自动化过程中,遇到的一些问题,也希望自己能够坚持下去,小海加油冲呀,第一篇博客,不好之处请多海涵,笔芯! 一.问题出现背景 自动化测试需要,要求编写test,获取postman的返回值 ...

  9. 如何获取ffmpeg返回的错误信息

    1.通常可以使用函数av_strerror来获取详细信息: 2.如果(1)不能获取到信息,请参照errno.h中错误码定义

  10. WEB主机没有正确返回“404”错误页面

    nginx.conf修改每个server{}模块中添加:         error_page 404 /404.html;         location = /404.html {       ...

最新文章

  1. 参数等效模型可以用于_等效媒质理论(介电参数反演)
  2. APP时代,市场选择是个技术活
  3. python csv数据处理_Python数据处理(1) —CSV文件数据处理
  4. 纯c语言实现动态分配多维数组的方法
  5. 八皇后问题分析与Java实现
  6. 钉钉怎么查看收到的文件 钉钉查看文件的方法
  7. C++——获取array,vector,string的元素个数
  8. Python使用openpyxl和pandas处理学生成绩Excel文件实用案例
  9. Python 对象和类
  10. bootstrap datetimepicker日期插件使用方法
  11. 光环PMP 二模错题知识点
  12. 【转】小谈PNG转SVG的方法 在线转换网站与illustrator
  13. Mac 下载破译版本 secureFX 和 secureCRT
  14. 语义分割-FCNs in the wild: Pixel-level adversarial and constraint-based adaptation 对抗方法实现不同数据集语义分割
  15. postgres 坐标_用postgreSQL做基于地理位置的app(zz)
  16. java 月初_Java用于取得当前日期相对应的月初,月末,季初,季末,年初,年末时间...
  17. httprunner(9)运行测试用例的方式总结
  18. PHP反序列化字符串逃逸
  19. html5游戏占内存和cpu,IIS解决CPU和内存占用率太高的问题
  20. 网易2018校园招聘编程题真题集合1魔法币

热门文章

  1. 腾讯微云 for Mac v
  2. 吉他指弹特殊调弦的方法及基础音阶知识
  3. 深入解析淘宝Diamond之客户端架构
  4. 计算机网络启动项,怎样设置电脑启动项_怎么设置电脑开机启动项-win7之家
  5. 樊登读书会掌控读后感_在樊登读书会读《掌控习惯》(读后感)
  6. python读书心得体会范文_读书心得体会范文5篇
  7. 切尔诺贝利_切尔诺贝利泰坦尼克号的自然恢复历史以及复杂系统的课程
  8. Java入门案例:模拟纸牌游戏拖拉机(升级)
  9. oracle聚合函数count,聚合函数count里面加条件
  10. 为啥要看javac源代码