快速上手友盟推送前后端

每日推荐

本人主要介绍如何使用第三方友盟推送,前后端的操作.

本文作者

作者:zhuyuansj

连接:https://www.jianshu.com/p/453f2ead8d04

本文由作者授权发布

公司要求做一个服务器端的推送功能,客户端主要是以移动端为主,混合式的app前端,在友盟官网看了下demo,有后台服务器端,前端主要是原生安卓,IOS还有windos.所以根据自身实际能力,按照demo先弄了个原生安卓的前端和java的后台,调试成功。主要测试2个功能:单点推送客户端,推送所有客户端。 本次实践也遇到了很多坑。大致步骤就是先在友盟官网申请账号,然后注册包名,之后会生成一个appkey,message secret,master secret.这3个参数必须和安卓的mainfast当中注册的值是一样的。友盟官网注册的包名必须和客户端生成的包名一致。

1.第一步:新建包名

image.png

2.第二步:包名新建完后记录下appkey,message secret,master secret

image.png

3.第三步:在安卓的mainfast的配置文件中的key以及message_secret必须和网页中生成的一致

image.png

4.第四步:进入消息管理后台,添加测试设备

image.png

image.png

image.png

5.第五步:设置推送消息

image.png

image.png

Response Code : 400 {"ret":"FAIL","data":{"error_code":"2027"}} Failed to send the notification! 2027是签名失败,我以为需要在安卓app打包的时候需要用 于是我进行签名打包,但是依然无作用

image.png

image.png

然后继续找问题,后来发现是master secret和message secret写反了,改过来之后OK了

image.png

6.由于是开发服务器端调用友盟推送,所以必须设置服务器的ip地址,下图告诉你如何查看本机的外网ip地址

image.png

以上都是些设置,介绍一下消息推送所使用的一些场景 后台开启一个定时任务,比如每天晚上10点像全体用户发送推送消息。单点发送可以根据唯一的devicetoken发送消息给用户,因此可以把这个token和数据库中用户名进行绑定,根据用户名查询出token给指定用户发送即可。

其他代码可以通过下面的友盟推送java服务端代码以及友盟推送安卓客户端代码查看,这里主要对其进行了封装,各位可以看下有什么更好的方法封装,可以指出。

YoumengAndroidMain是主调用类

package youmeng;


import java.util.HashMap;
import java.util.Map;

import pushandroid.YoumengAndroidPush;

public class YoumengAndroidMain {
    public static void main(String[] args) {
        //1.广播,通过友盟推送给所有人发送信息
//      try {
//          YoumengAndroidMain yoMain = new YoumengAndroidMain();//这个在框架里可以直接用注入
//          Map mapAndroidAll = new HashMap<String, String>();
//          mapAndroidAll.put("appkey", "59e76d978f4a9d6888000113");  
//          mapAndroidAll.put("mastersecret", "6darv0eftbwqgzfprg40muvyzfpjrhpe");   
//          mapAndroidAll.put("ticker", "2017年10月19日ticker");
//          mapAndroidAll.put("title", "2017年10月19日title");
//          mapAndroidAll.put("text", "2017年10月19日text");
//          Map map = new HashMap<String, String>();
//          map.put("extrafieldkey", "key");
//          map.put("extrafieldvalue", "value");
//          mapAndroidAll.put("extrafield", map);
//          yoMain.sendYoumengAndroidAll(mapAndroidAll);
//      } catch (Exception e) {
//          System.out.println("发送失败");
//      }
        
        //2.通过友盟给指定用户推送
        try {
            YoumengAndroidMain yoMain = new YoumengAndroidMain();//这个在框架里可以直接用注入
            Map mapAndroidAll = new HashMap<String, String>();
            mapAndroidAll.put("appkey", "59e76d978f4a9d6888000113");  
            mapAndroidAll.put("mastersecret", "6darv0eftbwqgzfprg40muvyzfpjrhpe");   
            mapAndroidAll.put("devicetoken", "Am5T2vzQBapWZ1bBfdNKKk6-PTBcV2gZPPX8i5V4r9dO");
            mapAndroidAll.put("ticker", "2017年10月19日ticker");
            mapAndroidAll.put("title", "2017年10月19日title");
            mapAndroidAll.put("text", "2017年10月19日text");
            Map map = new HashMap<String, String>();
            map.put("extrafieldkey", "key");
            map.put("extrafieldvalue", "value");
            mapAndroidAll.put("extrafield", map);
            yoMain.sendYoumengAndroidUnicast(mapAndroidAll);
        } catch (Exception e) {
            System.out.println("发送失败");
        }
    }
    
    
    /**
     * 广播,通过友盟给所有人发送信息,在定时任务中定时执行全员发送
     * appkey,mastersecret是必传字段,ticker,title,text,extrafieldkey,extrafieldvalue是选填字段
     */
    public void sendYoumengAndroidAll(Map model) throws Exception{
        YoumengAndroidPush youMain = new YoumengAndroidPush();//到框架里的时候用@Component放到工厂里,用Autoriwed注入
        youMain.sendAndroidBroadcast(model);
    }
    
    /**
     * 通过友盟发送给指定用户,这个根据devicetoken给指定的app发送消息,这个devicetoken在给用户注册的时候可以记录下来,存到数据库
     * 这个token可以跟用户名进行绑定,根据用户名去查找token,这样就可以给指定用户发送消息了
     */
    public void sendYoumengAndroidUnicast(Map model) throws Exception{
        YoumengAndroidPush youmengPush = new YoumengAndroidPush();
        youmengPush.sendAndroidUnicast(model);
    }
    
}

YoumengAndroidPush.java主要通过httpclient将参数封装传到友盟进行推送。

package pushandroid;

import java.util.Map;

import pushandroid.android.AndroidBroadcast;
import pushandroid.android.AndroidUnicast;

public class YoumengAndroidPush {
    private String timestamp = null;
    private PushClient client = new PushClient();
    /**
     * 像所有的用户推送消息
     * appkey和mastersecret为必填项,ticker,title,text,extrafield为选填
     * 群发
     */
    public void sendAndroidBroadcast(Map model) throws Exception {
        if(null == model)
            return;
        if(null == model.get("appkey") || null == model.get("mastersecret"))
            return;
        String appkey = (String) model.get("appkey");
        String masterSecret = (String) model.get("mastersecret");
        AndroidBroadcast broadcast = new AndroidBroadcast(appkey,masterSecret);
        String ticker = (String) (model.get("ticker") == null?"测试":model.get("ticker"));
        String title = (String) (model.get("title")==null?"测试":model.get("title"));
        String text = (String) (model.get("text")==null?"测试,您好":model.get("text"));
        broadcast.setTicker(ticker);
        broadcast.setTitle(title);
        broadcast.setText(text);
        broadcast.goAppAfterOpen();
        broadcast.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION);
        broadcast.setProductionMode();
        if(null != model.get("extrafield")){
            Map map = (Map) model.get("extrafield");
            String extrafieldkey = (String) (map.get("extrafieldkey")==null?"":map.get("extrafieldkey"));
            String extrafieldvalue = (String) (map.get("extrafieldvalue")==null?"":map.get("extrafieldvalue"));
            broadcast.setExtraField(extrafieldkey, extrafieldvalue);
        }
        client.send(broadcast);
    }
    
    /**
     * 单点发送,通过友盟推送给指定用户,这个token可以跟用户名进行绑定,根据用户名去查找token,这样就可以给指定用户发送消息了
     * appkey,mastersecret,devicetoken是必传字段,ticker,title,text,extrafieldkey,extrafieldvalue是选填字段
     */
    public void sendAndroidUnicast(Map model) throws Exception {
        if(null == model)
            return;
        if(null == model.get("appkey") || null == model.get("mastersecret") || null==model.get("devicetoken"))
            return;
        String appkey = (String) model.get("appkey");
        String masterSecret = (String) model.get("mastersecret");
        AndroidUnicast unicast = new AndroidUnicast(appkey,masterSecret);
        String ticker = (String) (model.get("ticker") == null?"测试":model.get("ticker"));
        String title = (String) (model.get("title")==null?"测试":model.get("title"));
        String text = (String) (model.get("text")==null?"测试,您好":model.get("text"));
        String devicetoken = (String) model.get("devicetoken");//上面已经判断过空的情况
        unicast.setDeviceToken( devicetoken);
        unicast.setTicker(ticker);
        unicast.setTitle(title);
        unicast.setText(text);
        unicast.goAppAfterOpen();
        unicast.setDisplayType(AndroidNotification.DisplayType.NOTIFICATION);
        unicast.setProductionMode();
        if(null != model.get("extrafield")){
            Map map = (Map) model.get("extrafield");
            String extrafieldkey = (String) (map.get("extrafieldkey")==null?"test":map.get("extrafieldkey"));
            String extrafieldvalue = (String) (map.get("extrafieldvalue")==null?"helloworld":map.get("extrafieldvalue"));
            unicast.setExtraField(extrafieldkey, extrafieldvalue);
        }
        client.send(unicast);
    }
    public static void main(String[] args) {
    }
    
    
    
}

原文发布于微信公众号 - 编程软文(zhuyuansj)

原文发表时间:2017-12-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏王磊的博客

C#调用Couchbase中的Memcached缓存

安装服务端 服务端下载地址:http://www.couchbase.com/download 选择适合自己的进行下载安装就可以了,我这里选择的是Win7 64...

2559
来自专栏木宛城主

Unity应用架构设计(13)——日志组件的实施

对于应用程序而言,日志是非常重要的功能,通过日志,我们可以跟踪应用程序的数据状态,记录Crash的日志可以帮助我们分析应用程序崩溃的原因,我们甚至可以通过日志...

1835
来自专栏JAVA后端开发

spring boot2集成activiti6的问题记录

经查,是因为我用mybatis plus,要求用mybatis3.4.6,而activiti用的是mybatis3.4.2,两边有冲突,直接排除activiti...

1593
来自专栏菩提树下的杨过

spring cloud:Edgware.RELEASE版本中zuul回退方法的变化

Edgware.RELEASE以前的版本中,zuul网关中有一个ZuulFallbackProvider接口,代码如下: public interface Zu...

2106
来自专栏龙首琴剑庐

原 微服务Spring Cloud Eur

1653
来自专栏GuZhenYin

ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

前言 本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截 觉得有帮助的朋友~可以左上角点个关注,右下角点个推荐 这里就不...

4089
来自专栏Java技术栈

Spring Boot Runner启动器

Runner启动器 如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口 ApplicationRunner或者 CommandLine...

2527
来自专栏noteless

eclipse 创建maven 项目 动态web工程完整示例 maven 整合springmvc整合mybatis

如果搜索不到内容,或者有报错信息(index downloads are disabled ,search results may be incomplete)

732
来自专栏Java学习123

JAVA调用Shell脚本

2724
来自专栏熊二哥

Spring快速入门

Spring源码剖析一书,非常细致,但对于个人来说,意义不算特别的大,因此选其可用部分做个记录就好。 ? 功能 示例 配置文件的解析...

18010

扫码关注云+社区