zoukankan      html  css  js  c++  java
  • 安卓推送——个推服务端api使用误区


    首先你需要在个推开放着平台上注册你的应用,以及获得以下几个必要的值APPID |APPKEY | MASTERSECRET,本文假设你已经完成上述步骤以及完成客户端SDK的集成。

    原理

    个推服务端api的原理非常简单,组装一个对象,塞进去需要的值,然后编码一下通过http请求发送到个推的推送服务器上,后面的复杂的推送流程就全权交给个推服务器了。
    当然尽管原理非常简单,个推服务端api还是做了一些封装,最大限度节省用户工作量,比如组装对象设置特定的数据结构并编码,以及一些额外参数以完成版本的向后兼容等动作。

    介绍

    个推服务端sdk有多种语言支持,JAVA / Python / C# / PHP / GoLang等等,本文以JAVA版本为例介绍使用方法。


    首先需要引入服务端sdk,也就是下面几个jar包,下载地址在个推官网上有

    看名字很好理解这些jar包的作用,对于前三个commons开头的,codec是用来编码的,httpclient是用来构造http请求的,logging处理日志的;带sdk的三个jar自然是个推封装的组装请求的逻辑,以及提供对用户开放的使用接口;最后两个是用到的数据结构json和protobuf。

    业务场景

    单推——推送指定客户端推送
    IPushResult pushMessageToSingle(SingleMessage message, Target target)
    业务场景:一般适用于指定某个特定用户的推送,比如你要告诉某个用户他租的域名再不续费就要到期啦,或者有个好友@你啦,这种和独立用户紧密相关的个人消息。

    群推——批量指定客户端推送
    IPushResult pushMessageToList(String contentId, List targetList)
    业务场景:一般适用于为某些用户推送消息的场景,比如你提取了一批今天生日的用户列表,给他们发送生日祝福等。

    群推——指定应用名称全客户端推送
    IPushResult pushMessageToApp(AppMessage message)
    业务场景:一般适用为自己应用的所有用户推送同一条消息,比如今年2.14情人节,本店全场5折起之类的消息。

    当然以上提到的业务场景只是暂时想到的,你完全可以套用到自己的业务场景里,组合使用各个接口,完成更多元的功能。

    使用方式

    各个接口使用方式大同小异,如果理解了原理应该很容易融会贯通。我将结合代码,以单推——toSingle接口来讲解使用方法。

    1. 首先定义一些常量,我们应用的appId,appkey等值
      private static String appId = "aK6jeksP5C7CsjSSEqLAA3";
      private static String appKey = "tpDVam96sY8pxhwBupJ462";
      private static String masterSecret = "TBokfpttQJ6aHIhBE9y867";
      private static String cid = "ce018bb633066839fd0d6fb448bfcb23";
      private static String url = "";

    2. 新建一个IGtPush实例,传入调用接口网址,appkey和masterSecret
      IGtPush push = new IGtPush(url, appKey, masterSecret);

    3. 新建一个消息类型,单推一个用户的话,使用SingleMessage
      除了SingleMessage外还有ListMessage和AppMessage分别对应三个推送接口
      SingleMessage message = new SingleMessage();

    4. 新建一个推送模版,已透传模板为例,透传顾名思义到达客户端后不做任何操作,由app选择处理
      其他原生模板类型种类很多,支持各种客户端展现效果,包括弹框下载、打开链接等等。模板里也可以设置响铃震动等效果。
      TransmissionTemplate template = new TransmissionTemplate();
      template.setAppId(appId);
      template.setAppkey(appKey);
      template.setTransmissionContent("测试用的透传文本");
      template.setTransmissionType(1);

    5. 模板设置好后塞进message里,同时可以配置这条message是否支持离线,以及过期时间等,单位毫秒
      若设置离线,个推推送系统会为当前不在线的用户缓存离线消息,个推现在支持为每个用户缓存多条离线消息,离线时间最多三天,三天后会删除该条离线消息
      message.setData(template);
      message.setOffline(true);
      message.setOfflineExpireTime(1800 * 1000);

    6. 新建一个推送目标,填入appid和clientId
      单推情况下只能设置一个推送目标,toList群推时,可以设置多个目标,目前建议一批设置50个左右。
      Target target = new Target();
      target.setAppId(appId);
      target.setClientId(cid);

    7. 调用IGtPush实例的toSingle接口,参数就是上面我们配置的message和target
      IPushResult result = push.pushMessageToSingle(message, target);
      String response = result.getResponse().toString();
      System.out.println("返回值:" + response);

    误区一

    推送选错接口
    个推服务端adk提供给开发者三个推送接口:pushMessageToSingle/ pushMessageToList/ pushMessageToApp。从命名来看也容易区分,分别是推送单个用户,一批用户,一个应用的全部用户。对于每个接口,个推服务端的处理逻辑不尽相同,在性能上也有差别。一般来说推送性能是pushMessageToApp > pushMessageToList > pushMessageToSingle。其中ToList和ToSingle的使用频率最高。有些开发者在ToList的场景里选用ToSingle接口,这样就会明显影响推送效率,ToSingle是适合单推特定用户的场景,如果推送内容相同,将推送的对象集合起来,调用ToList接口,可以明显提升性能。但是对于适合单推的场景使用ToList又会明显降低性能,因为如果每次推送内容不同。调用ToList之前都需要调用getContentId上传消息体,这样至少从http请求次数来说,已经不合算了。

    误区二

    推To List接口列表太大
    ToList的性能更高在某个方面来说是因为其一次上传了更多的clientId。但是我们不建议一批列表里放太多的clientId,把鸡蛋放在一个篮子里是有风险的。而且从另一方面来说,过于巨大的消息体可能会在各个层面出现意料之外的异常。目前我们建议一批列表里放置不超过100个clientId。这样100万的用户,你需要调用一万次toList接口。

    误区三

    频繁调用getContentId
    在调用ToList之前,需要先调用getContentId上传推送消息体到个推服务器并获取一个contentId。后续调用toList只需要上传这个contentId和clientId列表就行。这意味着,如果你需要给100万的用户推送相同内容的消息,每次调用ToList发送100个,那就需要循环调用1万次ToList接口。而这中间,无需再调用getContentId!只需要复用同一个contentId!因为他们的推送消息体是一样的。这里经常会有开发者没有注意,每次都调用一次getContentId再去调用toList接口。这样对推送性能会造成巨大损失,因为你不仅double了http请求次数,而且getContentId相对来说在个推服务器上也是一个耗时操作。因此,如果你现在正不小心这样错误使用着个推的服务端api,请赶快调整,飞一样的性能提升肯定会让你眼前一亮的。

  • 相关阅读:
    【题解】【BT】【Leetcode】Populating Next Right Pointers in Each Node
    【题解】【BT】【Leetcode】Binary Tree Level Order Traversal
    【题解】【BST】【Leetcode】Unique Binary Search Trees
    【题解】【矩阵】【回溯】【Leetcode】Rotate Image
    【题解】【排列组合】【素数】【Leetcode】Unique Paths
    【题解】【矩阵】【回溯】【Leetcode】Unique Paths II
    【题解】【BST】【Leetcode】Validate Binary Search Tree
    【题解】【BST】【Leetcode】Convert Sorted Array to Binary Search Tree
    第 10 章 判断用户是否登录
    第 8 章 动态管理资源结合自定义登录页面
  • 原文地址:https://www.cnblogs.com/evakang/p/5753397.html
Copyright © 2011-2022 走看看