友盟umeng訊息推送直接複製就能用(純乾貨)

知曉汝名,嚇吾一跳!發表於2021-06-05

一. 單播推送(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     }
 1     public String getPushStatus(String appkey,String task_id,String appMasterSecret) throws Exception {
 2         JSONObject getStatus = new JSONObject();
 3 
 4         getStatus.put("appkey", appkey);
 5 
 6         String timestamp = Integer.toString((int)(System.currentTimeMillis() / 1000));
 7 
 8         getStatus.put("timestamp", timestamp);
 9 
10         getStatus.put("task_id",task_id);
11 
12         String url = host + statusPath;
13 
14         String postBody = getStatus.toString();
15 
16         String sign = DigestUtils.md5Hex(("POST" + url + postBody + appMasterSecret).getBytes("utf8"));
17 
18         url = url + "?sign=" + sign;
19 
20         HttpPost post = new HttpPost(url);
21 
22         post.setHeader("User-Agent", USER_AGENT);
23 
24         StringEntity se = new StringEntity(postBody, "UTF-8");
25 
26         post.setEntity(se);
27 
28         // post請求獲取響應
29         HttpResponse response = client.execute(post);
30 
31         System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
32 
33         BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
34 
35         StringBuffer result = new StringBuffer();
36         String line = "";
37         while ((line = rd.readLine()) != null) {
38             result.append(line);
39         }
40 
41         return result.toString();
42     }

 

 

檔案播類似於列播, 區別是 列播用英文逗號分隔, 而檔案播用 \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

相關文章