当前位置: 首页 > article >正文

java+uniapp集成unipush2实现消息推送

一、开通uniPush2.01.实名认证登录DCloud开发者中心通过实名认证2.进入UniPush控制台HBuilderX中打开项目的manifest.json文件导航在“App模块配置” → 项的“Push(消息推送)” → “UniPush”下点击配置 或者申请开通。3.配置应用信息在UniPush开通界面配置以下信息Android包名Android应用签名iOS Bundle Id 点击开通完成服务启用详细说明请参考 UniPush开通指南二、前端推送服务对接配置uniCloud服务开通uniCloud服务推荐阿里云创建云函数用于处理推送逻辑详细步骤参考官方文档添加push模块设置targetSdkersiontargetSdkersion过高有些手机运行不了找到刚刚添加的push模块创建云函数处理推送请求云函数关键不要乱写看不懂示例就复制我这个use strict;/** * 推送吃药提醒 - DCloud UniPush 2.0 云函数 */exports.mainasync(event,context){console.log( UniPush云函数被调用 );console.log(请求方法:,event.httpMethod);// 解析请求体letparams;try{if(event.httpMethodPOST){if(typeofevent.bodystringevent.body){paramsJSON.parse(event.body);}elseif(typeofevent.bodyobjectevent.body!null){paramsevent.body;}else{return{code:-1,msg:POST请求体为空或格式错误};}}elseif(event.httpMethodGET){return{code:0,msg:UniPush 云函数运行正常,data:{method:GET,time:Date.now(),tip:请使用 POST 方法发送推送请求}};}else{return{code:-1,msg:不支持的请求方法: event.httpMethod};}}catch(e){console.error(解析请求体失败:,e);return{code:-1,msg:请求体格式错误: e.message};}const{cid,title,content}params;console.log(解析后的参数:,{cid,title,content});// 参数校验if(!cid||!title||!content){console.error(参数不完整);return{code:-1,msg:参数不完整需要: cid, title, content,received:params};}try{console.log(开始初始化UniPush...);// 获取 UniPush 管理器constuniPushuniCloud.getPushManager({appId:__UNI__xxxxxxx// ⚠️ 替换为您的实际 AppID});console.log(UniPush初始化成功开始发送消息...);// 构建推送参数constpushParams{push_clientid:cid,title:title,content:content,payload:{type:medicine_reminder,time:Date.now()},// 添加以下参数确保通知显示force_notification:true,// 强制显示通知栏sound:default,// 提示音badge:1// iOS角标};console.log(推送参数:,JSON.stringify(pushParams));// 发送推送消息constresultawaituniPush.sendMessage(pushParams);console.log(推送结果:,result);// 检查推送结果if(result.errCode0){// 检查具体设备的推送状态constdeviceStatusresult.data?Object.values(result.data)[0]:null;console.log(设备推送状态:,deviceStatus);return{code:0,msg:推送成功,data:result};}else{console.error(推送失败:,result);return{code:-1,msg:推送失败: (result.errMsg||未知错误),detail:result};}}catch(error){console.error(推送异常:,error);return{code:-1,msg:推送异常: error.message};}};传部署云函数代码配置云函数URL化进入uniCloud控制台找到已上传的云函数并查看详情配置云函数url化,设置URL的PATH部分作用是后端直接调接口然后进行推送完成后获得完整URL用于后端调用三、后端推送服务对接packagecom.ruoyi.app.service.impl;importcom.fasterxml.jackson.databind.ObjectMapper;importcom.ruoyi.app.service.IUniPushService;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.http.*;importorg.springframework.stereotype.Service;importorg.springframework.util.StringUtils;importorg.springframework.web.client.RestTemplate;importjava.util.*;/** * UniPush 2.0 推送服务实现支持Android和iOS * 使用云函数方式调用个推API * * author ruoyi */Slf4jServicepublicclassUniPushServiceImplimplementsIUniPushService{Value(${unipush.cloud-function-url:})privateStringcloudFunctionUrl;privatefinalRestTemplaterestTemplatenewRestTemplate();privatefinalObjectMapperobjectMappernewObjectMapper();/** * 调用云函数发送推送 */privatebooleancallCloudFunction(MapString,ObjectrequestBody){try{if(!StringUtils.hasText(cloudFunctionUrl)){log.error(❌ UniPush云函数地址未配置请在application.yml中配置 unipush.cloud-function-url);returnfalse;}// 打印请求体用于调试StringjsonBodyobjectMapper.writeValueAsString(requestBody);log.info( UniPush云函数请求 - URL: {},cloudFunctionUrl);log.info( UniPush云函数请求体: {},jsonBody);// 发送请求HttpHeadersheadersnewHttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);HttpEntityStringentitynewHttpEntity(jsonBody,headers);ResponseEntityMapresponserestTemplate.postForEntity(cloudFunctionUrl,entity,Map.class);if(response.getStatusCode()HttpStatus.OKresponse.getBody()!null){MapString,Objectbodyresponse.getBody();log.info( UniPush云函数响应: {},body);// 检查是否是echo响应云函数未正确实现if(body.containsKey(path)body.containsKey(httpMethod)){log.error(❌ 云函数返回了echo响应说明云函数未正确实现推送逻辑);log.error(❌ 请检查云函数代码确保实现了推送功能而不是简单返回请求);returnfalse;}// 判断是否成功 - 支持多种响应格式// 格式1: {code: 0, msg: success}ObjectcodeObjbody.get(code);if(codeObj!null){StringcodecodeObjinstanceofInteger?String.valueOf(codeObj):codeObj.toString();if(0.equals(code)||200.equals(code)){log.info(✅ UniPush推送成功);returntrue;}else{log.error(❌ UniPush推送失败错误码: {}, 消息: {},code,body.get(msg));returnfalse;}}// 格式2: {success: true}ObjectsuccessObjbody.get(success);if(successObjinstanceofBoolean(Boolean)successObj){log.info(✅ UniPush推送成功);returntrue;}// 格式3: {status: success}ObjectstatusObjbody.get(status);if(statusObj!nullsuccess.equalsIgnoreCase(statusObj.toString())){log.info(✅ UniPush推送成功);returntrue;}log.error(❌ UniPush推送失败响应内容: {},body);}else{log.error(❌ UniPush云函数响应异常 - 状态码: {},response.getStatusCode());}returnfalse;}catch(org.springframework.web.client.HttpClientErrorExceptione){log.error(❌ UniPush云函数调用失败 - HTTP状态码: {},e.getStatusCode());log.error(❌ 响应内容: {},e.getResponseBodyAsString());log.error(❌ 请检查);log.error( 1. 云函数URL是否正确: {},cloudFunctionUrl);log.error( 2. 云函数是否已部署并启用HTTP触发器);log.error( 3. 云函数是否正确实现了推送逻辑);returnfalse;}catch(org.springframework.web.client.ResourceAccessExceptione){log.error(❌ UniPush云函数网络访问异常: {},e.getMessage());log.error(❌ 请检查);log.error( 1. 网络连接是否正常);log.error( 2. 云函数地址是否可访问);log.error( 3. 防火墙或代理设置);returnfalse;}catch(Exceptione){log.error(❌ UniPush云函数调用异常,e);returnfalse;}}OverridepublicbooleanpushToSingle(Stringcid,Stringtitle,Stringcontent){try{if(!StringUtils.hasText(cid)){log.warn(推送失败cid为空);returnfalse;}// 构建请求体 - 直接传递参数不使用 action/data 结构MapString,ObjectrequestBodynewjava.util.LinkedHashMap();requestBody.put(cid,cid);requestBody.put(title,title);requestBody.put(content,content);// 调用云函数booleansuccesscallCloudFunction(requestBody);if(success){log.info(单推消息成功cid: {}, title: {},cid,title);}else{log.error(单推消息失败cid: {}, title: {},cid,title);}returnsuccess;}catch(Exceptione){log.error(单推消息异常cid: {}, title: {},cid,title,e);returnfalse;}}OverridepublicbooleanpushToList(ListStringcids,Stringtitle,Stringcontent){try{if(cidsnull||cids.isEmpty()){log.warn(推送失败cid列表为空);returnfalse;}// 注意云函数只支持单个CID推送需要循环调用log.info(批量推送将逐个推送给 {} 个设备,cids.size());intsuccessCount0;for(Stringcid:cids){booleanresultpushToSingle(cid,title,content);if(result){successCount;}// 避免频繁请求间隔100mstry{Thread.sleep(100);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}}booleanallSuccesssuccessCountcids.size();if(allSuccess){log.info(批量推送消息成功数量: {}, title: {},cids.size(),title);}else{log.warn(批量推送部分成功成功: {}/{}, title: {},successCount,cids.size(),title);}returnallSuccess;}catch(Exceptione){log.error(批量推送消息异常title: {},title,e);returnfalse;}}OverridepublicbooleanpushToAll(Stringtitle,Stringcontent){try{log.warn(全量推送功能未实现云函数不支持全量推送);log.warn(如需全量推送请先从数据库获取所有用户的CID然后使用 pushToList 方法);returnfalse;}catch(Exceptione){log.error(全量推送消息异常title: {},title,e);returnfalse;}}}重点发消息需要cidapp获取到传给后端保存cid可能会更新一般登录的时候传。

相关文章:

java+uniapp集成unipush2实现消息推送

一、开通uniPush2.0 1.实名认证 登录DCloud开发者中心,通过实名认证 2.进入UniPush控制台 HBuilderX中打开项目的manifest.json文件 导航在“App模块配置” → 项的“Push(消息推送)” → “UniPush”下点击配置 或者申请开通。 3.配置应用信息 在UniPush开通界面…...

别再算错了!等保2.0 2021版测评新规下,多系统/多机房得分计算保姆级教程

等保2.0 2021版多系统测评得分计算实战指南 当企业拥有多个机房或业务系统时,等保测评得分计算往往成为安全负责人最头疼的问题。2021版测评新规对多对象场景的计算方式进行了重要调整,这些变化直接影响最终得分和整改策略。本文将用真实案例拆解新旧计算…...

构建可复用技能库:从代码片段到自动化工作流的工程实践

1. 项目概述:从零构建一套可复用的“副爪”技能库在技术社区里,我们常常会看到一些零散的代码片段、脚本工具或者临时的解决方案,它们像散落的“爪子”一样,能解决特定问题,但不成体系,难以复用和传承。我自…...

基于Vue 3与Express的私有化ChatGPT Web客户端部署指南

1. 项目概述与核心价值最近在折腾一个自用的AI对话工具,核心需求很简单:想在一个自己完全掌控的界面上,方便地使用大语言模型,比如ChatGPT的API。市面上虽然有很多现成的网页应用,但要么功能太臃肿,要么部署…...

Cloudflare + PlanetScale:在边缘运行全栈应用,数据库也不例外

全栈开发者面对的一道老难题 Cloudflare Workers 解决了计算层的全球分发问题——你的代码跑在 Cloudflare 遍布全球的 300 多个数据中心里,离用户近,启动快,不需要管理任何服务器。 但数据不一样。 数据库天然是"有状态的"&#x…...

4sapi 企业级实战:统一模型网关与全生命周期管理解决方案

引言随着大模型技术在企业中的广泛应用,越来越多的企业开始面临 "模型碎片化" 的挑战。不同部门、不同业务线各自对接不同的大模型厂商,使用不同的 API 接口,导致企业内部出现了多个独立的 AI 孤岛,带来了一系列严重的问…...

给 Agent 用的搜索:Cloudflare AI Search 是什么,怎么工作的

原文:AI Search: the search primitive for your agents 发布时间:2026 年 4 月 16 日 作者:Gabriel Massadas、Miguel Cardoso、Anni Wang 每个 Agent 都需要搜索,但自己搭很麻烦 编码 Agent 要检索数百万个文件,客服…...

液态硅胶注塑加工供应商推荐

随着液态硅胶(LSR)在医疗、母婴、电子、汽车等多个领域的广泛应用,选择一个可靠的液态硅胶注塑加工供应商变得至关重要。作为天沅智能制造科技有限公司(简称TYM),我们不仅深耕于液态硅胶注射成型机械的设计…...

为 Agent 重新设计的 Git:Cloudflare Artifacts 是什么,怎么工作的

原文:Artifacts: versioned storage that speaks Git 发布时间:2026 年 4 月 16 日 作者:Dillon Mulroy、Matt Carey、Matt Silverlock 一个规模问题 有一个被反复引用的预测:未来 5 年内,人类将写出比过去整个编程历…...

文献阅读 260511-Wildfire damages and the cost-effective role of forest fuel treatments

Wildfire damages and the cost-effective role of forest fuel treatments 来自 <https://www.science.org/doi/10.1126/science.aea6463> ## Abstract: Gave the core question: Wildfires are among the most pressing environmental challenges of the 21st century,…...

详解 Deepsec:Vercel 开源 AI 代码安全防护工具的技术架构与实现原理

摘要在 AI 大模型深度融入软件开发全链路的今天&#xff0c;代码安全防护正面临 “复杂逻辑漏洞难发现、传统工具误报率高、源码隐私保护难” 三重核心挑战。Vercel 开源的 Deepsec 作为一款Agent 驱动的本地化 AI 安全防护工具&#xff0c;跳出传统 SAST&#xff08;静态应用安…...

嵌入式系统调试技术:从JTAG到多核同步的实战指南

1. 嵌入式系统调试技术概述在嵌入式系统开发过程中&#xff0c;调试环节往往占据整个开发周期的40%-60%时间。与通用计算机系统不同&#xff0c;嵌入式系统通常运行在资源受限的环境中&#xff0c;缺乏标准输入输出设备&#xff0c;这使得调试工作更具挑战性。我曾参与过多个工…...

上网行为怎么监控?教你五个简单实用的上网行为监控方法,建议收藏

在数字化办公时代&#xff0c;企业管理面临着新的挑战&#xff1a;一方面需要网络提供资讯和工具&#xff0c;另一方面&#xff0c;无节制的非工作上网行为正在侵蚀企业的生产力。如何科学、合理地监控上网行为&#xff1f;以下为您介绍五个监控方法&#xff0c;涵盖了从硬件到…...

003-VXLAN集中式网关实验(命令详解版)

VXLAN集中式网关实验1&#xff08;命令详解版&#xff09;最近有读者私信说刚开始学习VXLAN&#xff0c;实战技巧薄弱、部分命令不是很理解&#xff0c;想循序渐进通过实验过渡到真实项目案例。下面从一个简单的集中式网关实验开始&#xff0c;通过2个基础实验和1个项目实验完成…...

智能体架构实战:从LangGraph状态机到多智能体协作

1. 从理论到实践&#xff1a;为什么我们需要一个“智能体架构大全”项目如果你在过去一年里关注过AI领域&#xff0c;尤其是大语言模型的应用开发&#xff0c;那么“智能体”这个词一定已经听得耳朵起茧了。从能帮你写代码的Devin&#xff0c;到能自主完成复杂任务的GPT-4o&…...

Arm A64指令集SIMD与浮点寄存器架构解析

1. A64指令集的SIMD与浮点寄存器架构解析在Armv8-A架构中&#xff0c;A64指令集引入了强大的向量处理能力&#xff0c;通过32个128位宽的V寄存器&#xff08;V0-V31&#xff09;实现了高效的SIMD&#xff08;单指令多数据&#xff09;和浮点运算支持。这套寄存器文件的设计巧妙…...

2026年AI模型API中转站大排名!解析各平台优势,为企业与开发者精准选型

2026年5月&#xff0c;在中国广州&#xff0c;随着AI大模型技术不断迭代并在各产业全面落地&#xff0c;企业级API中转服务市场已步入成熟竞争阶段。技术稳定性、场景适配度以及综合性价比成为企业选择API中转站时的核心考量因素。近日&#xff0c;行业第三方评测机构发布了《2…...

算力入门:从FLOPS到PUE全解析

算力入门:FLOPS、TFLOPS、EFLOPS、算力规模、能效比、PUE 全解 算力(计算能力)是衡量计算机系统性能的关键指标,尤其在科学计算、人工智能和大数据处理等领域至关重要。本指南将逐步解释FLOPS、TFLOPS、EFLOPS、算力规模、能效比和PUE这些核心概念,帮助您快速入门。所有内…...

AI代理工具化新范式:基于MCP协议的模块化连接器实践

1. 项目概述&#xff1a;一个面向AI代理的模块化连接器最近在折腾AI应用开发&#xff0c;特别是围绕AI Agent&#xff08;智能体&#xff09;的生态构建时&#xff0c;发现一个挺普遍的问题&#xff1a;如何让这些Agent高效、安全地连接和使用外部工具与服务&#xff1f;无论是…...

GDScript Mod Loader:为Godot游戏打造专业模组生态的完整指南

1. 项目概述&#xff1a;为你的Godot游戏注入社区活力如果你是一名使用Godot引擎的独立游戏开发者&#xff0c;或者是一位热衷于为喜爱的游戏创造新内容的玩家&#xff0c;那么“模组”这个概念你一定不陌生。模组&#xff0c;或者说Mod&#xff0c;是游戏社区生命力的重要源泉…...

Swarmocracy:基于蜂群智能的分布式组织决策模拟实践

1. 项目概述&#xff1a;当开源项目遇上“蜂群民主”最近在开源社区里闲逛&#xff0c;发现一个挺有意思的项目&#xff0c;叫“Swarmocracy”。光看名字&#xff0c;就能嗅到一股混合了技术极客与组织社会学的味道——“Swarm”&#xff08;蜂群&#xff09;加上“-cracy”&am…...

NCCL watchdog timeout 先别只会加 timeout:PyTorch 新出的 Flight Recorder,真正值钱的是能把第一处 collective 分歧揪出来

NCCL watchdog timeout 先别只会加 timeout:PyTorch 新出的 Flight Recorder,真正值钱的是能把第一处 collective 分歧揪出来 很多人第一次遇到 NCCL watchdog timeout,第一反应都是三件事:查网络、调大 timeout、怀疑 NCCL 又炸了。这个顺序经常不够用。因为在很多真实训…...

基于MCP协议实现AI助手个性化:Terminal Buddies项目实战解析

1. 项目概述&#xff1a;当你的终端伙伴遇见AI助手 如果你和我一样&#xff0c;每天有大量时间泡在终端和代码编辑器里&#xff0c;那么一个能带来些许乐趣和陪伴感的“数字伙伴”或许能点亮枯燥的编码时光。Terminal Buddies 正是这样一个巧妙结合了复古 ASCII 艺术、轻量级游…...

搜搜果:一种面向AI生成内容验真与品牌可见度监测的实现方案

1. 问题定义 随着大语言模型&#xff08;LLM&#xff09;广泛集成到搜索、问答、推荐等场景中&#xff0c;出现两个可观测的问题&#xff1a; 内容可信性问题&#xff1a;模型会以高置信度输出事实上不存在的实体、事件或引用&#xff08;幻觉&#xff0c;hallucination&#…...

终极指南:如何用FanControl实现Windows系统风扇智能温控与静音优化

终极指南&#xff1a;如何用FanControl实现Windows系统风扇智能温控与静音优化 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub…...

上古卷轴5天际整合包下载最新全热门MOD整合(画质+人物+功能+场景全美化)下载分享

一、整合包基础概况 新手向懒人专属整合资源&#xff0c;适配电脑Windows系统。整合包集成多款热门优质MOD&#xff0c;无需玩家单独下载模组&#xff0c;整合包整体兼容性强&#xff0c;适配主流家用电脑&#xff0c;官方提前做好模组适配优化&#xff0c;规避多数模组冲突问…...

5分钟彻底解决Windows软件DLL缺失问题:VisualCppRedist AIO完整修复方案

5分钟彻底解决Windows软件DLL缺失问题&#xff1a;VisualCppRedist AIO完整修复方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过新安装的软…...

构建现代化图片编辑器的Vue与Fabric.js实践指南

构建现代化图片编辑器的Vue与Fabric.js实践指南 【免费下载链接】vue-fabric-editor 快图设计-基于fabric.js和Vue的开源图片编辑器&#xff0c;可自定义字体、素材、设计模板。fabric.js and Vue based image editor, can customize fonts, materials, design templates. 项…...

5大核心功能揭秘:GTA5线上小助手如何彻底改变你的洛圣都冒险体验

5大核心功能揭秘&#xff1a;GTA5线上小助手如何彻底改变你的洛圣都冒险体验 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 你是否厌倦了在GTA5线上模式中花费数小时完成重复任务&#xff1f;是否希望…...

DeepSeek API Gateway与大模型推理服务深度协同:如何实现Token级流控、异步响应封装、Streaming SSE自动保活?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;DeepSeek API Gateway架构全景与核心定位 DeepSeek API Gateway 是面向大模型服务的高性能、可扩展网关系统&#xff0c;承担请求路由、认证鉴权、流量控制、协议转换与可观测性聚合等关键职责。它并非…...