一、ios和android,接收個推推送的測試狀況:前端
測試機型和版本:
ios: iphone 6s plus,ios12.1.4
android: 紅米5plus, android 8.1.0android
注意:
1.一、根據項目需求,選擇推送的消息類型。
好比,咱們的項目需求是,ios和android在前臺運行時,能彈出通知。在後臺和退出時,系統能收到推送通知。
綜合考慮,咱們選擇推送的消息格式爲 標準的透傳消息。ios
1.二、標準的透傳消息格式如:{"title":"1","content":"2","payload":"數據"} ajax
非標準的透傳消息格式如: {"title":"1","content":"2""payload":"數據"} json
二、先後端分工後端
咱們的項目需求是,將 clientid 和 手機號 綁定起來,後臺設置推送。服務器
前端:獲取clientid 和 手機號,提交至後臺綁定(需後臺同事提供接口)。剛下載app後,打開第一次,有時會獲取不到clientid。網絡
我這邊的處理是,第一次獲取失敗後,嘗試10次請求。經測試,重獲取一次,就很快獲取到clientid。app
plusready.js 是進入app,就調用的js。而綁定手機號和clientid的函數,是在另外一個單獨的js裏定義的。調用時間在 plusready.js 以後。iphone
下圖是plusready.js中關於clientid的獲取:
document.addEventListener('plusready', function(){ // 獲取客戶端標識信息 var info = plus.push.getClientInfo(); window.regid = info.clientid; }, false);
下圖是綁定手機號和clientid的函數:
function bindTelAndCid(tel) { // 獲取clientId 和 手機號,發至後臺綁定。 if(window.plus) { getCidAgain(); } else { document.addEventListener('plusready',getCidAgain,false); } function getCidAgain() { //首次進入app獲取clientId失敗,再次獲取 var count = 0; //若是cid不存在,就每隔1秒從新獲取,嘗試最多10次。 if(!window.regid || window.regid == 'null') { var timer = window.setInterval(function(){ if(count > 9) return false; var info = plus.push.getClientInfo(); window.regid = info.clientid; if(window.regid && window.regid != 'null') { clearInterval(timer); sendTelAndCid(); } count++; }, 1000); } else { sendTelAndCid(); } } //發送手機號和cid至後臺,綁定和推送 function sendTelAndCid() { $.ajax({ type:"get", data: {phone: tel, clientId: window.regid}, dataType: "json", url: "http://xxxxxxxxxxxxxx", success:function(res){ } }) } }
後臺:調用個推文檔中相關的推送接口,進行推送。個推文檔:http://docs.getui.com/getui/more/word/
下面是後臺同事(JAVA)提供的推送設置示例代碼:
public static TransmissionTemplate getTemplate2(String title,String content) { TransmissionTemplate template = new TransmissionTemplate(); template.setAppId(appId); template.setAppkey(appKey); template.setTransmissionContent("{\"title\":\""+title+"\",\"content\":\""+content+"\",\"payload\":{\"type\":1,\"total_count\":5}}"); template.setTransmissionType(2); APNPayload payload = new APNPayload(); //在已有數字基礎上加1顯示,設置爲-1時,在已有數字上減1顯示,設置爲數字時,顯示指定數字 payload.setAutoBadge("0"); payload.setContentAvailable(1); //ios 12.0 以上能夠使用 Dictionary 類型的 sound payload.setSound("default"); payload.setCategory("$由客戶端定義"); payload.addCustomMsg("payload", "payload"); //簡單模式APNPayload.SimpleMsg payload.setAlertMsg(new APNPayload.SimpleAlertMsg(content)); //hello //字典模式使用APNPayload.DictionaryAlertMsg //payload.setAlertMsg(getDictionaryAlertMsg()); //設置語音播報類型,int類型,0.不可用 1.播放body 2.播放自定義文本 //payload.setVoicePlayType(0); //設置語音播報內容,String類型,非必須參數,用戶自定義播放內容,僅在voicePlayMessage=2時生效 //注:當"定義類型"=2, "定義內容"爲空時則忽略不播放 //payload.setVoicePlayMessage("定義內容"); // 添加多媒體資源 payload.addMultiMedia(new MultiMedia().setResType(MultiMedia.MediaType.video) .setResUrl("http://www.baidu.com") .setOnlyWifi(true)); //須要使用IOS語音推送,請使用VoIPPayload代替APNPayload // VoIPPayload payload = new VoIPPayload(); // JSONObject jo = new JSONObject(); // jo.put("key1","value1"); // payload.setVoIPPayload(jo.toString()); // template.setAPNInfo(payload); return template; } public static Map<String, Object> pushToApp(String CID1,String title,String content) { IGtPush push = new IGtPush(host, appKey, masterSecret); TransmissionTemplate template = getTemplate2(title,content); SingleMessage message = new SingleMessage(); message.setOffline(true); // 離線有效時間,單位爲毫秒,可選 message.setOfflineExpireTime(24 * 3600 * 1000); message.setData(template); // 可選,1爲wifi,0爲不限制網絡環境。根據手機處於的網絡狀況,決定是否下發 message.setPushNetWorkType(0); Target target = new Target(); target.setAppId(appId); target.setClientId(CID1); //target.setAlias(Alias); IPushResult ret = null; try { ret = push.pushMessageToSingle(message, target); } catch (RequestException e) { e.printStackTrace(); ret = push.pushMessageToSingle(message, target, e.getRequestId()); } Map<String, String> mapOne = new HashMap<>(); Map<String, String> mapTwo = new HashMap<>(); Map<String, Object> map= new HashMap<>(); if (ret != null) { Map<String, Object> resultMap = ret.getResponse(); System.out.println("resultMap=" + resultMap); String result = resultMap.get("result").toString(); String taskId = ""; String status = ""; if(Constant.IS_OK.equals(result)){ taskId = resultMap.get("taskId").toString(); status = resultMap.get("status").toString(); } System.out.println("resultMap.get(\"result\")=" + result); GeTuiResult geTuiResult = GeTuiResult.getGeTuiResult(result); System.out.println("code=" + geTuiResult.code + ";reason=" + geTuiResult.reason); mapOne.put(geTuiResult.code, geTuiResult.reason); mapTwo.put("taskId",taskId); mapTwo.put("status",status); map.put("mapOne",mapOne); map.put("mapTwo",mapTwo); return map; } else { map.put("500", "服務器響應異常"); return map; } }