zoukankan      html  css  js  c++  java
  • 个推推送模板详解

    背景
    不少APP开发者在使用个推推送模板的时候疑问比较多,经常存在误用推送模板的情况。因此,我们写下这篇个推推送模板教学普及贴,来帮助大家根据你所希望实现的效果来选择适宜的模板。

    推送样式
    个推提供了不同的推送样式,比如系统样式、展开式通知样式。
    ps. setLogo的图片需要在客户端开发时嵌入(main-res),否则展示不了;
    pps. setLogo 和 setLogoUrl 可以二选一,如果都设置了 setLogoUrl 优先级比setLogo高,但是小米、华为有些机型并不支持,所以慎用;
    ppps. small logo图片是没有服务端接口可以修改的,直接拿的客户端内置的图片展示,默认值是push_small.png,很多手机(比如小米)改过展示效果的,这部分的小图标不一定能显示出来;

    ppps. channel设置完后,就不能再修改它的channelLevel了,除非新建一个新的channel,这是安卓原生的限制;

    系统样式,展开式通知样式具体代码如下:
    //系统样式
    public static AbstractNotifyStyle getStyle0() {
    Style0 style = new Style0();
    style.setTitle("这是你想要的标题");
    style.setText("这是你想要的内容");
    style.setLogo("push.png");//配置通知栏图标,需要在客户端开发时嵌入
    style.setLogoUrl("");//配置通知栏网络图标
    style.setRing(true); //设置通知是否响铃
    style.setVibrate(true); //设置通知是否震动
    style.setClearable(true); //设置通知是否可清除
    //Android 8.0 以上支持的
    style.setChannel("通知渠道id");
    style.setChannelName("通知渠道名称");
    style.setChannelLevel(3);
    return style;
    }

    //展开式通知样式
     public static AbstractNotifyStyle getStyle6() {
        Style6 style = new Style6();
        style.setTitle("这是你想要的标题");
        style.setText("这是你想要的内容");
        style.setLogo("push.png"); //配置通知栏图标,需要在客户端开发时嵌入
        style.setLogoUrl(""); //配置通知栏网络图标
        // 两种方式选一种
        style.setBigStyle1("bigImageUrl"); //设置大图+文本样式
    			//style.setBigStyle2("bigText"); //设置长文本+文本样式
        style.setRing(true);
        style.setVibrate(true);
        style.setClearable(true);
        style.setChannel("通知渠道id");
        style.setChannelName("通知渠道名称");
        style.setChannelLevel(3);
        return style;
    }
    

    效果图
    以小米8手机, Android 9版本为例,推送效果如下(为了脱敏,直接用个推demo自带的图标)

    上述代码中提到了安卓8.0系统中的开始支持的通知渠道,具体的字段含义解释如下。
    setChannel表示通知渠道id,是渠道的唯一标识,其默认值为“Default” setChannelName表示通知渠道名称,用户可在手机"设置”中查看。其默认值也为“Default”。 setChannelName长度建议设置在40Byte以内,超出会被安卓8.0系统自动缩减。 setChannelLevel表示设置通知渠道重要性,其默认值为3。具体操作过程中值有五种选择:0、1、2、3、4;设置之后不能修改,展示形式如下:
    0:无声音,无震动,不显示。
    1:无声音,无震动,锁屏不显示,通知栏中被折叠显示,导航栏无logo。
    2:无声音,无震动,锁屏和通知栏中都显示,通知不唤醒屏幕。
    3:有声音,有震动,锁屏和通知栏中都显示,通知唤醒屏幕。
    4:有声音,有震动,亮屏下通知悬浮展示,锁屏通知以默认形式展示且唤醒屏幕。
    ppps. channel设置完后,就不能再修改它的channelLevel了,除非新建一个新的channel,这是安卓原生的限制;

    推送模板
    到此,大家应该已经了解了想要推送的展示效果,但是需要什么模板来实现具体的通知效果呢,各位继续往下看。

    通知 & 启动应用
    采用下述代码用户可以在通知栏看到一条含图标、标题等的通知,当他点击后可以激活应用,到达应用首页。
    NotificationTemplate template = new NotificationTemplate();
    template.setAppId(APPID);
    template.setAppkey(APPKEY);
    template.setStyle(getStyle0()); //设置展示样式,具体见推送样式部分

    通知 &启动应用 & 透传
    这种方式在前一种的基础上,加了透传(这部分内容用户是看不到的)。通过透传可以达到不同的效果,比如更新用户信息。
    NotificationTemplate template = new NotificationTemplate();
    template.setAppId(APPID);
    template.setAppkey(APPKEY);
    template.setStyle(getStyle0());
    template.setTransmissionType(1); // 透传消息设置;1:立即启动APP;2:客户端收到消息后需要自行处理
    template.setTransmissionContent("透传内容");

    通知 & 打开网页
    下述代码用户可以在通知栏看到一条含图标、标题等的通知。当他点击通知,启动手机浏览器,便可以打开该通知所设置好的页面。
    LinkTemplate template = new LinkTemplate();
    template.setAppId(APPID);
    template.setAppkey(APPKEY);
    template.setStyle(getStyle0());
    template.setUrl("http://www.baidu.com"); //设置打开的网址地址

    通知 & 启动应用打开intent
    这种就是我们最常见的方式,点击通知,打开APP内指定的页面。
    StartActivityTemplate template = new StartActivityTemplate();
    template.setAppId(APPID);
    template.setAppkey(APPKEY);
    template.setStyle(getStyle0());
    String intent = "intent:#Intent;component=com.yourpackage/.NewsActivity;end";//这部分写法不清楚的,可以咨询安卓客户端的童鞋
    template.setIntent(intent); //最大长度限制为1000,很重要

    透传
    如果大家有一些个性化需求,比如想要自己定义所要实现的展示效果,那么可以用纯透传的方式。
    TransmissionTemplate template = new TransmissionTemplate();
    template.setAppId(APPID);
    template.setAppkey(APPKEY);
    template.setTransmissionType(2);// // 透传消息设置;1:立即启动APP;2:客户端收到消息后需要自行处理,如果设置为1,对用户使用不友好,不推荐使用
    template.setTransmissionContent("透传内容");

    消息撤回
    这个功能很实用,当App运营者不小心发送了不当的消息,可以立马撤回,有反悔的机会。
    RevokeTemplate template = new RevokeTemplate();
    template.setAppId(APPID);
    template.setAppkey(APPKEY);
    template.setOldTaskId(taskId); //指定需要撤回消息对应的taskId
    template.setForce(false); //客户端没有找到对应的taskid,是否把对应appid下所有的通知都撤回

    消息覆盖
    比如足球比赛实时比分播报,用户只想知道最新比分,我们就可以选择消息覆盖方式的推送模板。
    前面代码中提到的StartActivityTemplate 、LinkTemplate 、 NotificationTemplate 都有一个方法:setNotifyid(Integer notifyid)。在消息推送的时候设置notifyid,当有覆盖需求时,使用相同的notifyid发一条新的消息,客户端sdk会根据notifyid对应的前一条消息进行覆盖。

    iOS推送
    你可能发现了前面所讲的都是基于安卓推送的操作,但是iOS使用会比较特殊,逻辑是消息推送,APP在线个推会直接把透传内容发送到手机上,需要客户端解析并展示;APP离线时,走APNs通道,由iPhone的系统通道通知并展示消息。可以用的模板是TransmissionTemplate。它可以用setAPNInfo(Payload apn)法来设置具体参数。
    里面的参数基本上按照iOS官网的字段来进行命名,应该会比较容易上手。这里附上iOS官网文档链接。
    个推iOS推送参考代码如下:
    private static APNPayload getAPNPayload() {
    APNPayload payload = new APNPayload();
    //在已有数字基础上加1显示,设置为-1时,在已有数字上减1显示,设置为数字时,显示指定数字
    payload.setAutoBadge("+1");
    payload.setContentAvailable(1);
    //ios 12.0 以上可以使用 Dictionary 类型的 sound
    payload.setSound("default");
    payload.setCategory("$由客户端定义种类");
    payload.addCustomMsg("由客户自定义消息key", "由客户自定义消息value");

        payload.setAlertMsg(getDictionaryAlertMsg());  //字典模式
    
        //设置语音播报类型,int类型,0.不可用 1.播放body 2.播放自定义文本
        payload.setVoicePlayType(2);
        //设置语音播报内容,String类型,非必须参数,用户自定义播放内容,仅在voicePlayMessage=2时生效
        //注:当"定义类型"=2, "定义内容"为空时则忽略不播放
        payload.setVoicePlayMessage("定义内容");
    
        //添加多媒体资源,可以是图片、音频、视频,最多可以添加3条多媒体
        payload.addMultiMedia(new MultiMedia().setResType(MultiMedia.MediaType.pic)
                .setResUrl("资源文件地址")
                .setOnlyWifi(true));//设置是否在WIFI下才展示多媒体消息,如果设置true但未使用WIFI时会展示成普通通知
    
        return payload;
    }
    

    private static APNPayload.DictionaryAlertMsg getDictionaryAlertMsg() {
    APNPayload.DictionaryAlertMsg alertMsg = new APNPayload.DictionaryAlertMsg();
    alertMsg.setBody("body1");
    alertMsg.setActionLocKey("显示关闭和查看两个按钮的消息");
    alertMsg.setLocKey("loc-key1");
    alertMsg.addLocArg("loc-ary1");
    alertMsg.setLaunchImage("调用已经在应用程序中绑定的图形文件名");
    alertMsg.setTitle("通知标题");
    alertMsg.setTitleLocKey("自定义通知标题");
    alertMsg.addTitleLocArg("自定义通知标题组");
    return alertMsg;
    }

    /**
     * 需要使用iOS语音传输,请使用VoIPPayload代替APNPayload
     * 需要相关证书才可以使用此功能
     */
    private static VoIPPayload getVoIPPayload() {
        VoIPPayload payload = new VoIPPayload();
        JSONObject jo = new JSONObject();
        jo.put("key1", "value1");
        payload.setVoIPPayload(jo.toString());
        return payload;
    }
    

    总结
    通过以上我的介绍,各位应该会对想要达到什么推送效果,用哪种个推的推送模板,会更加清楚。目前个推已经在持续优化推送模板的多样性和其他功能中,近期会推出基于Restful的v2接口,更加符合开发者的使用习惯,敬请期待。

  • 相关阅读:
    验证车牌警车能源车
    两个二维数组组合并且日期相同的其他值相加
    运用phpExcel导出查询的数据
    JQ加减乘除运算
    获取url传递的参数、鼠标滚动加载事件
    SQL查询将数据按字段(2017-08-15 11:34:05)进行按月分组
    关于角色和权限控制数据表相关
    有关无限极分类并排序问题
    前端解决用户登录时,禁止chrome提示用户保存密码
    前端学习之iframe配合hash做菜单导航的问题:修改src跳转与contentWindow.location.replace('')的问题
  • 原文地址:https://www.cnblogs.com/evakang/p/12059920.html
Copyright © 2011-2022 走看看