您的位置:首页 > 移动开发

dcloud开发混合app-消息推送push

2017-03-18 07:45 429 查看
一、这里使用个推,先注册个推账号,申请一个应用。



二、在manifest.json中添加sdk配置和模块权限配置





三、添加推送消息事件监听器

先看一下官方文档:

void plus.push.addEventListener( event, listener, Boolean );

说明:

添加推送消息事件监听器,当指定推送事件发出时触发。

参数:

type: ( String ) 必选 事件类型

支持事件类型:”click”-从系统消息中心点击消息启动应用事件;”receive”-应用从推送服务器接收到推送消息事件。

listener: ( PushReceiveCallback ) 必选 事件监听器回调函数,在接收到推送消息时调用

capture: ( Boolean ) 可选 是否捕获事件,此处可忽略

返回值:

void : 无

PushReceiveCallback

客户端接收到推动消息的回调函数

void onReceive( msg ) {

// Recieved push message code.

}

参数:

msg: ( String ) 必选 接收到的推送信息msg

返回值:

void : 无

PushMessage

JSON对象,推送消息对象

属性:

title: (String 类型 )推送消息显示的标题

平台支持

Android - 2.2+ (支持)

iOS - ALL (支持): 。

content: (String 类型 )推送消息显示的内容

payload: (JSON 类型 )推送消息承载的数据

如果推送消息中传输的数据不符合JSON格式,则作为String类型数据保存。

aps: (JSON 类型 )Apple APNS推送协议数据

平台支持

Android - 2.2+ (不支持): 不支持此数据,返回值为undefined。

iOS - 5.0+ (支持): 仅封装标准APNS协议中的数据,其它数据封装在payload中。如果是通过本地API创建的消息此属性值则为undefined。

实际代码使用的情况是,PushReceiveCallback中的msg最好是PushMessage的格式,在使用苹果或者安卓才都比较符合type自己的对receive或者click的说明。

//推送 添加监听从系统消息中心收到某条消息启动应用事件
//使用dcloud固定json格式“{title:'',content:'',payload:''}”时,
//安卓无效,苹果有效但是不会有在消息中心显示
plus.push.addEventListener("receive", receiveOrClickPushMessage, false);
//推送 添加监听从系统消息中心点击某条消息启动应用事件
//使用dcloud固定json格式“{title:'',content:'',payload:''}”时,
//安卓会在消息中心显示且点击有效,苹果离线状态下点击有效
plus.push.addEventListener("click", receiveOrClickPushMessage, false);
/**
* 接收或点击推送来的消息
*/
var receiveOrClickPushMessage = function(msg){
...
}


四、要对单个设备进行推送,还要先绑定clientid。

//获取个推客户端信息主要是clientid,并提交给服务器与绑定用户

//如果有多个设备用同一个账号登录了,保证用户最后打开的设备收到推送或者都收到推送,而不需要重新登录

/**
* 获取个推clientinfo,绑定用户信息
*/
var t = 0;
var getuiCliendInfo = function(){
var clientInfo = plus.push.getClientInfo();//获取clientinfo
if(isValidObject(clientInfo) && isValidString(clientInfo.clientid) && isValidString(clientInfo.token)){
var clientId = clientInfo.clientid;//clientid需要发给服务器与用户进行绑定
var osname = plus.os.name;//plus.os.name如果消息要区分系统,还需要绑定设备系统
mui.ajax(...);//提交服务器绑定用户信息,退出时最好还要解绑
}else{//有时也不是一次就能获取成功,可能会没有clientid,重新获取
if(t<200){//最多循环200次
var m=10,n=2;
var sec = parseInt(Math.random()*(m-n)+n,10);//2-10秒
mui.later(getuiCliendInfo, sec*1000);//延后执行。
t++;
}
}
}


注意:后台服务器的代码虽然个推提供了很多方法推送,但是只有一种在苹果安卓都可以接收,而且一定要是固定的json格式“{title:”,content:”,payload:”}”,大小写都不能错,而且不要使用苹果的消息记数功能,因为只能加没办法控制减。

五、服务器发送单个用户推送

message {title:”通知标题”,content:”通知内容”,payload:”通知去干嘛这里可以自定义”}

package com.chhuang.huaao.thread;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.alibaba.fastjson.JSONObject;
import com.chhuang.huaao.consts.HaConstact;
import com.chhuang.utils.Assert;
import com.chhuang.utils.config.SysConfig;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.SingleMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.exceptions.RequestException;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.TransmissionTemplate;

/**
* 个推线程
* @author CHHUANG
*
*/
public class GeTuiThread implements Runnable {
private static final Log log = LogFactory.getLog(GeTuiThread.class);

private String clientId;
private JSONObject message;

/**
*
* @param clientId
* @param message {title:"通知标题",content:"通知内容",payload:"通知去干嘛这里可以自定义"}
*/
public GeTuiThread(String clientId, JSONObject message){
this.clientId = clientId;
this.message = message;
}

@Override
public void run() {
try {
if(Assert.isInvalidString(clientId) || message==null){
log.debug("客户端还不支持推送或消息为空");
return ;
}

String host = SysConfig.getValue(HaConstact.GETUI_URL);
String appId = SysConfig.getValue(HaConstact.GETUI_APP_ID);
String appKey = SysConfig.getValue(HaConstact.GETUI_APP_KEY);
String masterSecret = SysConfig.getValue(HaConstact.GETUI_MASTER_SECRET_);

//消息模板
TransmissionTemplate template = new TransmissionTemplate();
template.setAppId(appId);
template.setAppkey(appKey);
// 透传消息设置,1为强制启动应用,客户端接收到消息后就会立即启动应用;2为等待应用启动
template.setTransmissionType(1);
template.setTransmissionContent(message.toString());

//消息体
SingleMessage message = new SingleMessage();
message.setOffline(true);
// 离线有效时间,单位为毫秒,可选
message.setOfflineExpireTime(7 * 24 * 3600 * 1000);
message.setData(template);
// 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发
message.setPushNetWorkType(0);

//目标对象
Target target = new Target();
target.setAppId(appId);
target.setClientId(clientId);

IGtPush push = new IGtPush(host, appKey, masterSecret);

IPushResult ret = null;
try {
ret = push.pushMessageToSingle(message, target);
} catch (RequestException e) {
e.printStackTrace();
ret = push.pushMessageToSingle(message, target, e.getRequestId());
}
if (ret != null) {
log.debug("推送结果:"+ret.getResponse().toString());
} else {
log.debug("推送服务器响应异常");
}
} catch (Exception e) {
e.printStackTrace();
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息