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

一、这里使用个推,先注册个推账号,申请一个应用。
这里写图片描述
二、在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();
        }
    }

}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值