1. 程式人生 > >dcloud開發混合app-訊息推送push

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();
        }
    }

}