友盟umeng消息推送直接复制就能用(纯干货)

时间:2024-02-01 10:02:12

一. 单播推送(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