APICloud(十三):使用jpush进行消息推送
前言:
最近APP上要添加推送的功能,而APICloud的模板库中有推送的模块,比较之后决定用极光推送,模块名称叫ajpush,添加到自己的项目就可以用了。使用文档官方也有,虽说方法讲的比较细,但是感觉缺少连贯性,做了第一步下一步应该干什么用什么方法就迷茫了。同样的极光推送官网的API也写的很详细,奈何也没有连贯性的例子可以参考,这两个迷茫的东东让我跌跌撞撞了好几天都没有进展,而网上基本上都是代码没有这种入门级别的例子,后来看到了一篇讲入门的例子(连接如下:http://blog.****.net/xuexiiphone/article/details/51252796。),终于知道是怎么回事了,在此表示感谢。这里做个记录希望能够帮助到当初像我一样迷茫的小白兔们。
先来说一下它的基本过程:它主要涉及到三个方面,
第一客户端:这个在APICloud中进行配置并添加检测代码即可完成
第二极光推送第三方:主要用来为客户端推送服务器端要求推送的东东,起桥梁作用
第三服务器:APP作为客户端安装在手机上,需要从服务器端请求数据。同样,推送什么样的消息也通过这个服务器进行配置。
接下来讲作为第三方的极光推送,因为它衔接着客户端和服务器端,也就是两者都要用它,所以先讲它。
1、登录极光推送官网https://www.jiguang.cn/,注册账号并登录
2、创建应用:登陆进去之后,可能会看到三个选项:“极光开发者服务”、“极光数据服务”、“极光精确广告”,选第一个“进入后台”。在页面上找“创建应用”,输入“应用名称”然后“创建我的应用”。
3、获取AppKey和Master Secret:应用创建成功后,通过在当前页就能看到AppKey和Master Secret。若是看不到,可以点击左侧的“应用信息”找到刚刚创建的应用,点一下应用右下角的设置,获取AppKey和Master Secret,Master Secret通常是隐藏的,需要点击“查看”才能显示出来。
4、推送配置:在“获取AppKey和Master Secret”页面的下方,找到“推送配置”,点击右侧的“完成推送配置”,在打开的页面中选择“Android”,“应用包名”输入APICloud中APP的包名,获取方法如图:
这些信息有点隐秘,通常概览中都只是显示少量的APP信息,点击右下角的^才能看到更全的。
输入包名之后,点击“提交” 。
到这里第三方极光推送配置基本上完成了。
第三步讲在手机APP中嵌入极光推送:
1、在模块库中添加“ajpush”到自己的APP中;
2、在config.xml中注册,添加如下代码:
<feature name="ajpush">
<param name="app_key" value="上一步获取到的AppKey"/>
<param name="channel" value="随便填,最好不要用中文"/>
</feature>
3、在APP中引入极光推送并添加监听——最好是在首页添加——我这里是消息推送,具体代码如下:
apiready=function(){ noticePush(); } var jpush = null; //该方法用来进行公告推送 function noticePush(){ jpush = api.require('ajpush'); //初始化 jpush.init(function(ret) { //alert(ret.status);//若返回1说明初始化成功 if (ret && ret.status) { /* jpush.setListener(function(ret) { var id = ret.id;//消息ID var title = ret.title; //消息标题 var content = ret.content; //消息内容 var extra = ret.extra; //额外键值对 console.log("id=" + id + ",title=" + title + ",content=" + content + ",extra=" + extra); }); */ } }); //监听状态栏上消息被点击的事件 api.addEventListener({name:'appintent'}, function(ret,err) { //alert('通知被点击,收到数据:\n' + JSON.stringify(ret));//监听通知被点击后收到的数据 var extra = ret.appParam.ajpush.extra; extra = eval('('+extra+')'); //console.log("extra.user_id=" + extra.user_id + ",extra.notice_id=" + extra.notice_id); api.openWin({ name: 'noticedetails_win', url: 'noticedetails.html', allowEdit : true, pageParam:{ 'notice_id':extra.notice_id }, progress:{ type:"default", title:"玩命加载中..." } }); }) api.addEventListener({name:'pause'}, function(ret,err) { onPause();//监听应用进入后台,通知jpush暂停事件 }); api.addEventListener({name:'resume'}, function(ret,err) { onResume();//监听应用恢复到前台,通知jpush恢复事件 }); } //统计-app恢复 function onResume(){ jpush.onResume(); console.log('JPush onResume'); } //统计-app暂停 function onPause(){ jpush.onPause(); console.log('JPush onPause'); }
4、测试:重新登录“极光推送“官网,进入到后台,从“左上角”选择刚刚创建的app,再点击与APP名称平行的“推送”选项卡,点击左侧的“发送通知”,输入短信内容,平台选“Android”,目标人群选“广播(所有人)”,发送时间选“立即”,最后点“立即发送”。查看安装了APP的手机上是否收到推送消息。
第四步讲搭建自己的服务器发送消息,我这里用的是Java版。
1、从极光官网下载“服务器SDK”,链接如下:https://docs.jiguang.cn/jpush/resources/#sdk_1,选择Java版本的,下载下来之后进行解压。这个SDK我下载过好几个版本的,前一阵子下载的时候有Java代码还有jar包但是没有最关键的两个jar包,今天下载的只有2个关键jar包,没有例子也没有其他需要的jar包,大家注意。
需要的jar包总共有6个:gson-2.2.2.jar、jiguang-common-1.0.6.jar、jpush-client-3.2.19.jar、slf4j-api-1.6.1.jar、slf4j-api-1.7.5.jar、slf4j-log4j12-1.5.2.jar,其中jiguang-common-1.0.6.jar、jpush-client-3.2.19.jar两个是关键,已经上传到附件有需要的可以下载。
说到这个JAR包有句题外话想说:因为开始弄的时候并不知道有多少个包,网上也只是有Java代码并没有说需要用到哪些包更别提从哪里弄了,有些有说到下载极光推送官网的Example从中导入需要用到的jar包,我并不知道从哪里下载这个Example(极光的API太多且不够系统)以为是“进行推送配置时给的demo”,就下载了demo参考官网的信息进行了配置,那个demo是关于安卓的,而我从来没用过安卓,就照葫芦画瓢的搭建了安卓环境,就为这个环境浪费了2天时间,期间磕磕碰碰的遇到了各种问题,后来看了上面提到的文章弄完了这个推送功能才明白:这个“进行推送配置时给的demo”对于使用APICloud的我来说根本就不需要去研究,它只不过是一个插件用来安装到APP所在的手机用来接收消息,而APICloud中的ajpush模块就是干这个用的,已经集成了就不需要再安装了。
所以在这里提醒使用ajpush模块实现推送功能的童鞋们,这个该死的demo跟咱们的APP没有半毛钱关系,也不要想着从这里去找咱们需要的jar包因为它根本就没有。
好啦, 废话说到这里,言归正传。
2、新建web项目,导入上面的6个jar包,并build-path
3、将官网例子中\jpush-api-java-client-xxx\src\main\java路径下cn文件夹整个拖入到src中,参考一下官网的例子。可能官方下载的没有例子(我下载jpush-api-java-client-3.2.20.zip就没有),jpush-api-java-client-3.2.19的有,已经上传到附件,有需要的可以下载。
4、根据Example写的自己的推送:
public class JpushInstance {
protected static final Logger LOG = LoggerFactory.getLogger(JpushInstance.class);
// demo App defined in resources/jpush-api.conf
private static String appKey="xxxxxx";
private static String masterSecret="xxxxxx";
//long 可选
//保存离线消息的时长。秒为单位。最多支持10天(864000秒)。
//0 表示该消息不保存离线。即:用户在线马上发出,当前不在线用户将不会收到此消息。
//此参数不设置则表示默认,默认为保存1天的离线消息(86400秒)。
private static int timeToLive=3;
private static String TITLE = "wjl";
private static String ALERT = "发布了公告";
private static String MSG_CONTENT = TITLE+":"+ALERT;
private static JPushClient jpushClient=null;
private static Map<String,String> extrasMap = null;//用来保存需要用的参数
/**
* 该方法用来推送消息
* @param title:通知标题,如果指定了,则通知里原来展示 App名称的地方,将展示成这个字段。
* @param alert:通知内容,这里指定了,则会覆盖上级统一指定的 alert 信息;内容可以为空字符串,则表示不展示到通知栏。
* @param extras:拓展字段这里自定义 JSON 格式的 Key/Value 信息,以供业务使用。
* **/
public static void sendPush(String title,String alert,Map<String,String> extras) {
jpushClient = new JPushClient(masterSecret, appKey, timeToLive);
TITLE = title;
ALERT = alert;
if(extras!=null)extrasMap = extras;
//生成推送的内容,全部推送
PushPayload payload=buildPushObject_android_tag_alertWithTitle();
try {
//System.out.println(payload.toString());
PushResult result = jpushClient.sendPush(payload);
// System.out.println(result+"................................");
LOG.info("/******************************极光推送开始******************************/");
LOG.info("时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\r\n");
LOG.info("极光推送:发送状态: " + result);
LOG.info("/******************************极光推送结束******************************/");
} catch (APIConnectionException e) {
LOG.error("极光推送:Connection error. Should retry later. ", e);
} catch (APIRequestException e) {
LOG.info("/******************************极光推送开始******************************/");
LOG.info("时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"\r\n");
LOG.error("Error response from JPush server. Should review and fix it. ", e);
LOG.info("HTTP Status: " + e.getStatus());
LOG.info("Error Code: " + e.getErrorCode());
LOG.info("Error Message: " + e.getErrorMessage());
LOG.info("Msg ID: " + e.getMsgId());
LOG.info("/******************************极光推送结束******************************/");
}
}
public static PushPayload buildPushObject_all_all_alert() {
return PushPayload.alertAll(ALERT);
}
public static PushPayload buildPushObject_all_alias_alert() {
return PushPayload.newBuilder()
.setPlatform(Platform.all())//设置接受的平台
.setAudience(Audience.all())//Audience设置为all,说明采用广播方式推送,所有用户都可以接收到
.setNotification(Notification.alert(ALERT))
.build();
}
public static PushPayload buildPushObject_android_tag_alertWithTitle() {
return PushPayload.newBuilder()
.setPlatform(Platform.android())//安卓平台
.setAudience(Audience.all())//Audience设置为all,说明采用广播方式推送,所有用户都可以接收到
.setNotification(Notification.android(ALERT, TITLE, extrasMap))
.build();
}
public static PushPayload buildPushObject_android_and_ios() {
return PushPayload.newBuilder()
.setPlatform(Platform.android_ios())
.setAudience(Audience.tag("tag1"))
.setNotification(Notification.newBuilder()
.setAlert("alert content")
.addPlatformNotification(AndroidNotification.newBuilder()
.setTitle("Android Title").build())
.addPlatformNotification(IosNotification.newBuilder()
.incrBadge(1)
.addExtra("extra_key", "extra_value").build())
.build())
.build();
}
public static PushPayload buildPushObject_ios_tagAnd_alertWithExtrasAndMessage() {
return PushPayload.newBuilder()
.setPlatform(Platform.ios())
.setAudience(Audience.tag_and("tag1", "tag_all"))
.setNotification(Notification.newBuilder()
.addPlatformNotification(IosNotification.newBuilder()
.setAlert(ALERT)
.setBadge(5)
.setSound("happy")
.addExtra("from", "JPush")
.build())
.build())
.setMessage(Message.content(MSG_CONTENT))
.setOptions(Options.newBuilder()
.setApnsProduction(true)
.build())
.build();
}
public static PushPayload buildPushObject_ios_audienceMore_messageWithExtras() {
return PushPayload.newBuilder()
.setPlatform(Platform.android_ios())
.setAudience(Audience.newBuilder()
.addAudienceTarget(AudienceTarget.tag("tag1", "tag2"))
.addAudienceTarget(AudienceTarget.alias("alias1", "alias2"))
.build())
.setMessage(Message.newBuilder()
.setMsgContent(MSG_CONTENT)
.addExtra("from", "JPush")
.build())
.build();
}
}
5、在需要推送消息的地方进行调用,我这里是手机APP上发布一条消息,通过ajax传到后台,服务器将数据保存到数据库之后,调用推送程序进行推送:
Map<String,String> extrasMap = new HashMap<String,String>();
extrasMap.put("user_id", user_id);
extrasMap.put("notice_id",(result2)+"");
com.tzj.tsp.admin.jpush.JpushInstance.sendPush("wjl","发布了公告",extrasMap);
6、测试:手机APP发送一条消息,测试手机能否收到推送消息。
至此整个推送功能完成,希望对大家有所帮助。
最后祝大家好运!