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