uniapp极光推送、java服务端集成

news2024/11/29 12:53:46

一、准备工作

1、进入【服务中心】-【开发者平台】

2、【创建应用】,填写应用名称和图标(填写项目名称,项目logo就行,也可填写其他的)

3、选择【消息推送】服务,点击下一步

Demo测试 

参照文档:uni-app 推送官方插件集成指南 · BDS技术支持组

注:本地真机测试需要制作自定义基座才可以测试

      安卓证书获取方式:打开命令控制台 输入 keytool -genkey -alias Android(包别名) -keyalg RSA -keysize 2048 -validity 36500(证书有效天数) -keystore certificate(证书名称).keystore

    示例:

 ios需要苹果开发者账号制作证书:https://ask.dcloud.net.cn/article/152

测试:极光推送控制台-》通知消息

二、Postman 模拟后端Server主动推送消息

 参考资料:http://https/docs.jiguang.cn/jpush/server/push/rest_api_v3_push

{
    "platform": "all",
    "audience" : {"registration_id" : [ "指定registration_id"]
    },
    "notification": {
        "alert": "Hello, {{content}}!"
    },
    "message": {
        "msg_content": "Hi,JPush",
        "content_type": "text",
        "title": "msg",
        "extras": {
            "key": "value"
        }
    }
}

发送成功截图

服务端集成:服务端 SDK - 极光文档

参考资料:

  1、服务端 SDK - 极光文档

  2、【SpringBoot】在SpringBoot中如何使用 极光推送_springboot 极光推送-CSDN博客

三、服务端集成本地测试示例

本地测试项目 前后端分离框架,完整代码如下

POM依赖

<dependency>
            <groupId>cn.jpush.api</groupId>
            <artifactId>jiguang-common</artifactId>
            <version>1.1.4</version>
</dependency>
<dependency>
            <groupId>cn.jpush.api</groupId>
            <artifactId>jpush-client</artifactId>
            <version>3.3.10</version>
</dependency>

Config配置

@Configuration
public class JiGuangConfig {
    /**
     * 极光官网-个人管理中心-appkey
     * https://www.jiguang.cn/
     */
//    @Value("${jpush.appkey}")
    private String appkey ="xxxxxxxxxxxxx";

    /**
     * 极光官网-个人管理中心-点击查看-secret
     */
//    @Value("${jpush.secret}")
    private String secret = "xxxxxxxxxxxxxxxxxx";


    private JPushClient jPushClient;

    /**
     * 推送客户端
     * @return
     */
    @PostConstruct
    public void initJPushClient() {
        jPushClient = new JPushClient(secret, appkey);
    }

    /**
     * 获取推送客户端
     * @return
     */
    public JPushClient getJPushClient() {
        return jPushClient;
    }
} 

Controller

@RestController
@RequestMapping("/ctl/jgPush")
public class JgPushController extends BaseController {

    @Autowired
    private JiGuangPushService jiGuangService;


    @PostMapping("/jgTest")
    public void jgTest()
    {
        //定义和赋值推送实体
        PushBean pushBean = new PushBean();
        pushBean.setTitle("标题");
        pushBean.setAlert("测试消息");
        //额外推送信息
        Map<String,String> map = new HashMap<>();
        map.put("userName","张三");
        pushBean.setExtras(map);
        //进行推送,推送到指定Android客户端的用户,返回推送结果布尔值
        String [] rids = new String[1];
        rids[0]  = "xxxxxxxxxxx";//指定id
        boolean flag = jiGuangService.pushAndroid(pushBean,rids);
    }
} 

Service

public interface JiGuangPushService {

    /**
     * 广播 (所有平台,所有设备, 不支持附加信息)
     * @return
     */
    public boolean pushAll(PushBean pushBean);

    /**
     * 推送全部ios ios广播
     * @return
     */
    public boolean pushIos(PushBean pushBean);

    /**
     * 推送ios 指定id
     * @return
     */
    public boolean pushIos(PushBean pushBean, String... registids);

    /**
     * 推送全部android
     * @return
     */
    public boolean pushAndroid(PushBean pushBean);

    /**
     * 推送android 指定id
     * @return
     */
    public boolean pushAndroid(PushBean pushBean, String... registids);

    /**
     * 剔除无效registed
     * @param registids
     * @return
     */
    public String[] checkRegistids(String[] registids);

    /**
     * 调用api推送
     * @param pushPayload 推送实体
     * @return
     */
    public boolean sendPush(PushPayload pushPayload);
} 

Service实现

@Service
public class JiGuangPushServiceImpl implements JiGuangPushService {
    private static final Logger log = LoggerFactory.getLogger(JiGuangPushServiceImpl.class);
    /** 一次推送最大数量 (极光限制1000) */
    private static final int max_size = 800;

    @Autowired
    private JiGuangConfig jPushConfig;


    /**
     * 广播 (所有平台,所有设备, 不支持附加信息)
     * @return
     */
    @Override
    public boolean pushAll(PushBean pushBean){
        return sendPush(PushPayload.newBuilder()
                .setPlatform(Platform.all())
                .setAudience(Audience.all())
                .setNotification(Notification.alert(pushBean.getAlert()))
                .build());
    }

    /**
     * 推送全部ios ios广播
     * @return
     */
    @Override
    public boolean pushIos(PushBean pushBean){
        return sendPush(PushPayload.newBuilder()
                .setPlatform(Platform.ios())
                .setAudience(Audience.all())
                .setNotification(Notification.ios(pushBean.getAlert(), pushBean.getExtras()))
                .build());
    }

    /**
     * 推送ios 指定id
     * @return
     */
    @Override
    public boolean pushIos(PushBean pushBean, String... registids){
        registids = checkRegistids(registids); // 剔除无效registed
        while (registids.length > max_size) { // 每次推送max_size个
            sendPush(PushPayload.newBuilder()
                    .setPlatform(Platform.ios())
                    .setAudience(Audience.registrationId(Arrays.copyOfRange(registids, 0, max_size)))
                    .setNotification(Notification.ios(pushBean.getAlert(), pushBean.getExtras()))
                    .build());
            registids = Arrays.copyOfRange(registids, max_size, registids.length);
        }
        return sendPush(PushPayload.newBuilder()
                .setPlatform(Platform.ios())
                .setAudience(Audience.registrationId(Arrays.copyOfRange(registids, 0, max_size)))
                .setNotification(Notification.ios(pushBean.getAlert(), pushBean.getExtras()))
                .build());
    }

    /**
     * 推送全部android
     * @return
     */
    @Override
    public boolean pushAndroid(PushBean pushBean){
        return sendPush(PushPayload.newBuilder()
                .setPlatform(Platform.android())
                .setAudience(Audience.all())
                .setNotification(Notification.android(pushBean.getAlert(), pushBean.getTitle(), pushBean.getExtras()))
                .build());
    }

    /**
     * 推送android 指定id
     * @return
     */
    @Override
    public boolean pushAndroid(PushBean pushBean, String... registids){
        registids = checkRegistids(registids); // 剔除无效registed
        while (registids.length > max_size) { // 每次推送max_size个
            sendPush(PushPayload.newBuilder()
                    .setPlatform(Platform.android())
                    .setAudience(Audience.registrationId(Arrays.copyOfRange(registids, 0, max_size)))
                    .setNotification(Notification.android(pushBean.getAlert(), pushBean.getTitle(), pushBean.getExtras()))
                    .build());
            registids = Arrays.copyOfRange(registids, max_size, registids.length);
        }
        return sendPush(PushPayload.newBuilder()
                .setPlatform(Platform.android())
                .setAudience(Audience.registrationId(registids))
                .setNotification(Notification.android(pushBean.getAlert(), pushBean.getTitle(), pushBean.getExtras()))
                .build());
    }

    /**
     * 剔除无效registed
     * @param registids
     * @return
     */
    @Override
    public String[] checkRegistids(String[] registids) {
        List<String> regList = new ArrayList<String>(registids.length);
        for (String registid : registids) {
            if (registid!=null && !"".equals(registid.trim())) {
                regList.add(registid);
            }
        }
        return regList.toArray(new String[0]);
    }

    /**
     * 调用api推送
     * @param pushPayload 推送实体
     * @return
     */
    @Override
    public boolean sendPush(PushPayload pushPayload){
        PushResult result = null;
        try{
            result = jPushConfig.getJPushClient().sendPush(pushPayload);
        } catch (APIConnectionException e) {
            log.error("极光推送连接异常: ", e);
        } catch (APIRequestException e) {
            log.error("极光推送请求异常: ", e);
        }
        if (result!=null && result.isResultOK()) {
            log.info("极光推送请求成功: {}", result);
            return true;
        }else {
            log.info("极光推送请求失败: {}", result);
            return false;
        }
    }
} 

Bean实体类

public class PushBean {

    // 必填, 通知内容, 内容可以为空字符串,则表示不展示到通知栏。
    private String alert;
    // 可选, 附加信息, 供业务使用。
    private Map<String, String> extras;
    //android专用// 可选, 通知标题	如果指定了,则通知里原来展示 App名称的地方,将展示成这个字段。
    private String title;

    public String getAlert() {
        return alert;
    }

    public void setAlert(String alert) {
        this.alert = alert;
    }

    public Map<String, String> getExtras() {
        return extras;
    }

    public void setExtras(Map<String, String> extras) {
        this.extras = extras;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public PushBean() {
    }

    public PushBean(String alert, Map<String, String> extras, String title) {
        this.alert = alert;
        this.extras = extras;
        this.title = title;
    }

    @Override
    public String toString() {
        return "PushBean{" +
                "alert='" + alert + '\'' +
                ", extras=" + extras +
                ", title='" + title + '\'' +
                '}';
    }
}

调用此接口成功如下图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1576540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4.网络编程-websocket(golang)

目录 什么是websocket golang中使用websocket Server端 Client端 什么是websocket WebSocket是一种在互联网上提供全双工通信的协议&#xff0c;即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的&#xff0c;旨在解决传统HTTP协议在实…

C++ 之 【类与对象】从入门到精通一条龙服务 入门篇

不要觉的自己很没用&#xff0c;其实你还可以给家人带来温暖&#xff0c;比如爸妈看到你就来火 目录&#xff1a; 一、面向过程和面向对象初步认识 二、类的引入 三、类的定义 四、类的访问限定符及封装 1.访问限定符 2.封装 五、类的作用域 六、类的实例化 七、类的…

违法解除劳动合同——典型案例

目录 什么是违法解除劳动合同&#xff1f; 用人单位负举证责任 典型案例 案例&#xff1a;指导案例180号——违法解除劳动合同 案例&#xff1a;浙江省杭州市中级⼈⺠法院——违纪案例 案例&#xff1a;浙江省杭州市中级⼈⺠法院——违纪案例(不服从工作安排) 案例&#…

算法-数论-蓝桥杯

算法-数论 1、最大公约数 def gcd(a,b):if b 0:return areturn gcd(b, a%b) # a和b的最大公约数等于b与a mod b 的最大公约数def gcd(a,b):while b ! 0:cur aa bb cur%bpassreturn a欧几里得算法 a可以表示成a kb r&#xff08;a&#xff0c;b&#xff0c;k&#xff0c…

13 Python进阶:pip及其他常用模块

pip 是 Python 包管理工具&#xff0c;它提供了对 Python 包的查找、下载、安装、卸载的功能。 包地址&#xff1a; https://pypi.org/ 最新的 Python 版本已经预装了 pip。 pip 各种命令 查看是否已经安装 pip 可以使用以下命令&#xff1a; pip --version下载安装包使用…

Mysql底层原理十一:Mvcc

为什么要mvcc&#xff1f; 提高并发度&#xff0c;如果读和写都是通过加锁的方式&#xff0c;并发肯定上不来&#xff0c;通过mvcc来实现写通过加锁&#xff0c;读通过mvcc readView机制 3.9.1 Undo版本链 再重复一遍&#xff0c;页面中的记录存放在用户表空间的数据页中&a…

并发编程之Java中Selector

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Selector提供选择执…

【Web】CTFSHOW-2023CISCN国赛初赛刷题记录(全)

目录 Unzip BackendService go_session deserbug 主打一个精简 Unzip 进来先是一个文件上传界面 右键查看源码&#xff0c;actionupload.php 直接访问/upload.php&#xff0c;看到后端的源码 就是上传一个压缩包&#xff0c;对其进行解包处理 因为其是在/tmp下执行…

MySQL redo log和binlog的区别

redo log和binlog的区别 Redo Log&#xff08;重做日志&#xff09;&#xff1a; 作用&#xff1a; Redo Log是InnoDB存储引擎特有的一种日志&#xff0c;用于确保数据库的事务持久性和恢复能力。 特点&#xff1a; 存储在InnoDB的数据文件中&#xff0c;而不是作为单独的日志…

CICD流水线 发布应用到docker镜像仓库

准备工作 1.先注册免费的镜像仓库 复制链接: https://cr.console.aliyun.com/cn-beijing/instances 实施 1. 新建流水线&#xff0c;选择模板 2.添加流水线源&#xff0c;及是你的代码仓库, 选择对应分支. 3.代码检查以及单元测试&#xff0c;这个步骤可以不用动它. 4. …

【C++】继承总结

一、前言 我们众所周知的C三大特性分别为&#xff1a;封装、继承、多态。 封装就是将接口实现统一化&#xff0c;隐藏那些不同的地方&#xff0c;在上层函数调用体现的方式一样&#xff0c;如各种容器的迭代器iterator&#xff0c;尽管底层实现的方式不同&#xff0c;但是在使用…

Java学习笔记23(面向对象三大特征)

1.5 多态 ​ *多态(polymorphic) ​ *方法或对象具有多种形态&#xff0c;是面向对象的第三大特征&#xff0c;多态是建立在封装和继承基础之上的 1.多态的具体体现 1.方法的多态 &#xff08;重写和重载体现了多态&#xff09; 2.对象的多态 ​ 1.一个对象的编译类型和…

亮数据----教你轻松获取数据

文章目录 1. 数据采集遇到的瓶颈1.1 不会造数据&#xff1f;1.2 不会写爬虫代码&#xff1f; 2.IP 代理基础知识2.1 基本概念2.2 作用和分类2.3 IP 代理的配置和使用2.4 安全和合规 3. 为何使用亮数据 IP 代理3.1 拥有丰富的代理网络服务3.2 简单易操作的采集工具3.3 拥有各平台…

爬虫入狱笔记——xx政府网站公开政策数据

最近在学习爬虫&#xff0c;做个笔记吧 今天爬xx政府网站-政策法规栏目的数据 咱们首先需要找到数据从哪里来&#xff0c;鼠标右键->检查&#xff08;或者快捷键一般为F12&#xff09;检查元素&#xff0c;搜索关键词 eg.【违法案例】 回车&#xff0c; 如果没有的话&am…

「媒体邀约」天津媒体邀约资源有哪些?媒体宣传现场报道

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 天津作为中国北方的重要城市&#xff0c;拥有丰富的媒体资源&#xff0c;可以为各类活动提供全面的媒体宣传和现场报道。以下是天津地区的媒体邀约资源&#xff1a; 1. 报纸媒体 - 《天…

「38」LUT在直播间调色的高级应用……

「38」LUT滤镜 对人或物进行精进调色 OBS软件中的LUT&#xff08;Look Up Table&#xff09;滤镜&#xff0c;可用于调整视频、图像的色彩和对比度等效果&#xff0c;以实现专业级的颜色调整需求。 左图为原图 右图为LUT 先对比上面的两张图&#xff0c;用了滤镜效果的变化…

【问题处理】银河麒麟操作系统实例分享,银河麒麟高级服务器操作系统mellanox 网卡驱动编译

1.Mellanox 网卡源码驱动下载链接&#xff1a; https://www.mellanox.com/downloads/ofed/MLNX_EN-5.7-1.0.2.0/MLNX_EN_SRC-5.7-1.0.2.0.tgz 2.系统及内核版本如下截图&#xff1a; 3.未升级前 mellanox 网卡驱动版本如下&#xff1a; 4.解压 “MLNX_EN_SRC-5.7-1.0.2.0.tg…

基于单片机电动自行车太阳能充电系统设计

**单片机设计介绍&#xff0c;基于单片机电动自行车太阳能充电系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的电动自行车太阳能充电系统设计&#xff0c;是一个将太阳能技术与电动自行车充电技术相结合的创…

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试

【RealSense】Ubuntu20.04 安装 Intel RealSense ROS 并使用 D435i 测试 1 本机环境2 安装流程3 存在的 bug3.1 Resource not found: rgbd_launch 1 本机环境 Ubuntu20.04ROS Noetic 2 安装流程 参考文档: Link 安装 Intel RealSense™ SDK 2.0&#xff0c;参考上一篇文章: L…

微信小程序实现滚动标签

使用scroll-view标签可实现组件滚动标签 1、list中 list.wxml代码如下: <!--pages/list/list.wxml--> <navigation-bartitle"小程序" back"{{false}}"color"black" background"#FFF"></navigation-bar><scroll-…