一. 單播推送(unicast)
1.1 圖
1.2 代碼
1 /** 2 * 根據設備的deviceToken, 去給指定的設備推送消息 3 * 4 * @param deviceToken 單個deviceToken, 指定設備 5 */ 6 public void sendAndroidUnicast(String deviceToken) throws Exception { 7 8 AndroidUnicast unicast = new AndroidUnicast(appkey, appMasterSecret); 9 10 // Android端會獲取到 device_token, 直接找Android工程師要就行 11 unicast.setDeviceToken(deviceToken); 12 13 // 當你沒有下拉通知欄的時候, 寫入的文字會在頂端翻轉顯示 14 unicast.setTicker("看這里"); 15 16 // 標題 17 unicast.setTitle("單播推送"); 18 19 // 內容 20 unicast.setText("今晚啤酒小燒烤"); 21 22 // 修改以后, 使用過程中需要跟Android商量好 23 unicast.goAppAfterOpen(); // 點擊"通知"的后續行為,默認為打開app。 24 // unicast.goUrlAfterOpen("127.0.0.1"); // 點擊"通知"的后續行為,跳轉到URL。 25 // unicast.goActivityAfterOpen(""); // 點擊"通知"的后續行為,打開特定的activity。 26 // unicast.goCustomAfterOpen(""); // 點擊"通知"的后續行為,用戶自定義內容, 可傳輸JSONObject, 也可傳輸String。 27 28 /** 29 * NOTIFICATION 是友盟做處理在通知欄上顯示通知內容 30 * MESSAGE 是傳給應用自身進行解析處理 31 */ 32 unicast.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION); 33 34 // 測試模式使用false, 正式模式使用true 35 unicast.setProductionMode(); 36 37 // 自定義的一些東西 38 unicast.setExtraField("test", "helloworld"); 39 unicast.setChannelActivity("your channel activity"); 40 unicast.setChannelProperties("abc"); 41 42 client.send(unicast); 43 }
二. 列播推送(listcast)
由於列播推送, 友盟當中的SDK 並沒有給, 所以后面自己寫了一份
1.1 圖
2.2 代碼(包括所用實體類)
2.2.1 實體類
1 import push.AndroidNotification; 2 3 /** 4 * 列播(要求不超過500個device_token) 用英文逗號隔開 5 */ 6 public class AndroidColumnOn extends AndroidNotification { 7 8 public AndroidColumnOn(String appkey,String appMasterSecret) throws Exception { 9 setAppMasterSecret(appMasterSecret); 10 setPredefinedKeyValue("appkey", appkey); 11 this.setPredefinedKeyValue("type", "listcast"); // type = listcast 是群體發送 12 } 13 14 public void setDeviceToken(String token) throws Exception { 15 setPredefinedKeyValue("device_tokens", token); 16 } 17 18 }
2.2.2 推送代碼
1 /** 2 * 列播推送 3 * 4 * @param deviceToken 多個device_tokens是用英文逗號間隔, 不能超過五百個 5 */ 6 public void sendAndroidColumnOn(String deviceToken) throws Exception { 7 // 自定義實體類, 附有代碼 8 AndroidColumnOn columnOn = new AndroidColumnOn(appkey, appMasterSecret); 9 10 // 列播中 傳入的deviceToken類似於 1,2,3,4,5 11 columnOn.setDeviceToken(deviceToken); 12 13 // 當你沒有下拉通知欄的時候, 寫入的文字會在頂端翻轉顯示, 有的可以顯示有的不可以顯示, 看你設置和設備的允許情況 14 columnOn.setTicker("看過來"); 15 16 // 標題 17 columnOn.setTitle("群體推送"); 18 19 // 內容 20 columnOn.setText("魚香肉絲"); 21 22 // 點擊"通知"的后續行為,默認為打開app。 23 columnOn.goAppAfterOpen(); 24 25 /** 26 * NOTIFICATION 是友盟做處理在通知欄上顯示通知內容 27 * MESSAGE 是傳給應用自身進行解析處理 28 */ 29 columnOn.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION); 30 31 // 測試模式使用false, 正式模式使用true 32 columnOn.setProductionMode(); 33 34 // Set customized fields 35 columnOn.setExtraField("test", "helloworld"); 36 37 // 自定義的一些東西 38 columnOn.setChannelActivity("your channel activity"); 39 columnOn.setChannelProperties("abc"); 40 client.send(columnOn); 41 }
三. 廣播推送(boradcast)
廣播推送只有 setProductionMode 是ture , 也就是正式模式才可以使用,只會將消息發送給測試設備
3.1 圖
3.2 代碼
1 /** 2 * 廣播模式不需要device_tokens, 應該是根據你的 appkey 和 appMasterSecret 找到你所存儲在這兩里面的device_tokens, 然后整個推送 3 */ 4 public void sendAndroidBroadcast() throws Exception { 5 AndroidBroadcast broadcast = new AndroidBroadcast(appkey, appMasterSecret); 6 broadcast.setTicker("Android broadcast ticker"); 7 broadcast.setTitle("這是廣播"); 8 broadcast.setText("廣播數據"); 9 broadcast.goAppAfterOpen(); 10 11 broadcast.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION); 12 // 默認ture, 如果是false的話是收不到推送的 13 broadcast.setProductionMode(); 14 // 自定義信息 15 broadcast.setExtraField("test", "helloworld"); 16 //廠商通道相關參數 17 broadcast.setChannelActivity("your channel activity"); 18 broadcast.setChannelProperties("abc"); 19 client.send(broadcast); 20 }
四. 廣播推送狀態(參數為task_id)
4.1 圖
4.2 代碼
1 /** 2 * 廣播推送狀態 根據taskId 獲取推送成功以后數量 3 */ 4 private void pushStatus(String taskId){ 5 try { 6 String s = client.getPushStatus(appkey, taskId, appMasterSecret); 7 System.out.println(s); 8 UMengStatusResult result = JSON.parseObject(s, UMengStatusResult.class); 9 //推送接收統計數目 10 Map<String, Object> data = result.getData(); 11 System.out.println("推送接收統計數目 -> " + data.get("sent_count")); 12 System.out.println("推送打開統計數目 -> " + data.get("open_count")); 13 System.out.println("推送被忽略統計數目 -> " + data.get("dismiss_count")); 14 } catch (Exception e) { 15 e.printStackTrace(); 16 } 17 }
protected static final String host = "http://msg.umeng.com"; protected static final String statusPath = "/api/status"; public String getPushStatus(String appkey,String task_id,String appMasterSecret) throws Exception { JSONObject getStatus = new JSONObject(); getStatus.put("appkey", appkey); String timestamp = Integer.toString((int)(System.currentTimeMillis() / 1000)); getStatus.put("timestamp", timestamp); getStatus.put("task_id",task_id); String url = host + statusPath; String postBody = getStatus.toString(); String sign = DigestUtils.md5Hex(("POST" + url + postBody + appMasterSecret).getBytes("utf8")); url = url + "?sign=" + sign; HttpPost post = new HttpPost(url); post.setHeader("User-Agent", USER_AGENT); StringEntity se = new StringEntity(postBody, "UTF-8"); post.setEntity(se); // post請求獲取響應 HttpResponse response = client.execute(post); System.out.println("Response Code : " + response.getStatusLine().getStatusCode()); BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); StringBuffer result = new StringBuffer(); String line = ""; while ((line = rd.readLine()) != null) { result.append(line); } return result.toString(); }
1 @Data 2 public class UMengStatusResult { 3 4 private String ret; 5 6 private Map<String, Object> data; 7 8 }
文件播類似於列播, 區別是 列播用英文逗號分隔, 而文件播用 \n 分隔(文件播使用就是把所有device_tokens用 \n分隔, 然后存入文件中, 發送給友盟)
關於 alias 這些播送的, 可以試着自己寫一下, 總體辦法就是將 device_tokens 綁定設置的 alias , 然后把 傳送給友盟的 device_token變成了 alias傳送。
附加友盟開發者中心鏈接:
https://developer.umeng.com/docs/66632/detail/68343#h1-u6D88u606Fu53D1u90014
參數文檔:
https://developer.umeng.com/docs/67966/detail/149296#h1--g-7