前言
今天突然要做一个手机的推送消息功能,综合了网上各路大神的意见最终选择了极光推送。然而作为一个从来没开发过web项目的人来说,大神们说的很简单的官网教程让我看的一头雾水。找了几篇大牛写的教程,里面基本忽略了像我这种连html调用servlet都需要百度的菜鸟。于是将所有过程记录下来,希望对后来人有帮助。
一、 准备工作
1. 登录极光推送官网https://www.jpush.cn/,注册账号并登录
2. 创建应用
创建应用过程,详见百度经验:http://jingyan.baidu.com/article/4f34706ecf2664e387b56d98.html
3. 获取appkey和masterSecret
二、 服务端开发
1. 创建java web工程
2. 在WEB-INF路径下的lib路径下,导入相关jar包,相关jar包可以在极光推送官网获取。
3. 到官网下载java服务器sdk压缩包。
4. 将官网例子中\jpush-api-java-client-3.2.9\src\main\java路径下cn文件夹整个拖入到src中。
注1:这是一种折中方案,我看大神们基本没有导入这个包,也正常使用了,但是我如果不这样做,就会报各种import错误,也是无奈之举
注2:这一过程可能会报错,不要紧张,一个个的点进去看,应该都是告诉你@overRide标签有问题,删掉就好
5. 创建一个新的包com.weiwend.jdpush,创建class文件Jdpush.java
package com.weiwend.jdpush;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import cn.jpush.api.JPushClient;
import cn.jpush.api.common.resp.APIConnectionException;
import cn.jpush.api.common.resp.APIRequestException;
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.audience.AudienceTarget;
import cn.jpush.api.push.model.notification.AndroidNotification;
import cn.jpush.api.push.model.notification.IosNotification;
import cn.jpush.api.push.model.notification.Notification;
public class Jdpush {
protected static final Logger LOG = LoggerFactory.getLogger(Jdpush.
class);
public static final String TITLE =
"申通快递";
public static final String ALERT =
"祝大家新春快乐";
public static final String MSG_CONTENT =
"申通快递祝新老客户新春快乐";
public static final String REGISTRATION_ID =
"0900e8d85ef";
public static final String TAG =
"tag_api";
public static JPushClient jpushClient=
null;
public static void testSendPush(String appKey ,String masterSecret) { jpushClient =
new JPushClient(masterSecret, appKey,
3); PushPayload payload=buildPushObject_all_alias_alert();
try { System.out.println(payload.toString()); PushResult result = jpushClient.sendPush(payload); System.out.println(result+
"................................"); LOG.info(
"Got result - " + result); }
catch (APIConnectionException e) { LOG.error(
"Connection error. Should retry later. ", e); }
catch (APIRequestException e) { 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()); } }
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()) .setNotification(Notification.alert(ALERT)) .build(); }
public static PushPayload buildPushObject_android_tag_alertWithTitle() {
return PushPayload.newBuilder() .setPlatform(Platform.android()) .setAudience(Audience.all()) .setNotification(Notification.android(ALERT, TITLE,
null)) .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(); } }
6. 创建一个新的包com.weiwend.jdpush.servlet,创建class文件tuisong.java
package com.weiwend.jdpush.servlet;
import Java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.org.apache.xml.internal.serializer.utils.Utils;
import com.weiwend.jdpush.Jdpush;
import cn.jpush.*;
/**
* Servlet implementation class tuisong
*/
public class tuisong extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final String appKey ="84cf5ee2099c654aa03a5d70";
private static final String masterSecret = "7cf23f25a41806d5fd29e3c5";
public tuisong() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Jdpush.testSendPush(appKey,masterSecret);
System.out.println("sucess");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
}
7. 修改web.xml,增加servlet描述
<servlet>
<servlet-name >tuisong</servlet-name>
<servlet-class>com.weiwend.jdpush.servlet.tuisong</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name >tuisong</servlet-name>
<url-pattern>/tuisong</url-pattern>
</servlet-mapping>
8. 修改index.jsp,增加servlet调用
<form action="tuisong" method="get">
<input type="text" name="username"></input>
<input type="password" name="userpassword"></input>
<br><input type="submit" value="denglu">
9. 将项目部署到tomcat下,启动tomcat
10. 通过网页进行访问,触发servlet
点击登录按钮,触发servlet。界面样式就不改了,我相信除了处女座的程序员,没有人会在意这个。
11. 在console中查看推送结果。
log4j:WARN No appenders could be found for logger (cn.jpush.api.common.connection.NativeHttpClient).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
{"platform":"all","audience":"all","notification":{"alert":"祝大家新春快乐"},"options":{"sendno":34919015,"apns_production":false}}
{"msg_id":3270259240,"sendno":34919015}................................
sucess
发送失败的原因是因为我们的应用并没有绑定某一个具体的客户端应用,所以推送失败了。但是本地服务器与推送服务器之间的通讯是完好的。