APICloud(十三):使用jpush进行消息推送

前言:

最近APP上要添加推送的功能,而APICloud的模板库中有推送的模块,比较之后决定用极光推送,模块名称叫ajpush,添加到自己的项目就可以用了。使用文档官方也有,虽说方法讲的比较细,但是感觉缺少连贯性,做了第一步下一步应该干什么用什么方法就迷茫了。同样的极光推送官网的API也写的很详细,奈何也没有连贯性的例子可以参考,这两个迷茫的东东让我跌跌撞撞了好几天都没有进展,而网上基本上都是代码没有这种入门级别的例子,后来看到了一篇讲入门的例子(连接如下:http://blog.csdn.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发送一条消息,测试手机能否收到推送消息。

至此整个推送功能完成,希望对大家有所帮助。

最后祝大家好运!

猜你喜欢

转载自1017401036.iteye.com/blog/2377148