d***@163.com
d***@163.com
  • 发布:2026-06-02 11:31
  • 更新:2026-06-02 11:32
  • 阅读:19

unipush1.0 发送离线消息,内容含特殊字符,客户端消息生成乱码问题

分类:uni-app

消息内容中包含特殊符号 '#'。为了能正常推送,后端已经对消息内容进行了 URLEncoder.encode 编码处理。

cid在线时,发送透传消息,uni前端可以正常接收到消息、解码,生成消息正确显示

cid离线时,不管发送透传消息还是通知消息,都会直接生成消息,显示乱码信息

咨询过个推技术,原生都是会自动解码的,那uni要怎么解决信息乱码问题?

2026-06-02 11:31 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

针对你遇到的 uni-push 1.0 离线消息因特殊字符导致乱码的问题,核心原因在于在线和离线的消息下发通道与处理机制完全不同。

问题根源分析

根据 uni-push 1.0 的机制,当你的应用离线时,消息会通过手机厂商的推送通道(如华为、小米、OPPO等)下发。这个过程中,你的消息内容会经由“个推服务器 -> 厂商服务器 -> 系统推送服务”这一链路。

  1. 在线时(个推通道):消息直接由个推 SDK 接收并传递给你的应用。你在后端做的 URLEncoder.encode 编码,可以在前端通过 URLDecoder.decode 进行解码,所以能正常显示。
  2. 离线时(厂商通道):厂商通道只负责传递和展示通知消息的标题和内容,它不会对你的自定义数据(payload)做任何编解码处理。你把 URLEncoder.encode 后的内容直接当作通知内容发给了厂商通道,厂商系统就会原样展示这些包含 %23 等百分号编码的字符串,导致乱码。

解决方案

你需要区分对待“给个推的透传内容”和“给厂商通道的通知内容”。核心原则是:发送给厂商通道用于离线展示的通知标题和内容,必须是解码后的、人类可阅读的原始文本。

参考 uni-push 1.0 服务端 API 的推送示例代码,你需要分别设置 pushMessage(在线透传内容)和 pushChannel(离线厂商通知内容):

  • 对于在线透传消息 (pushMessage):你可以继续使用编码后的字符串,只要你的前端在 receive 回调中自行解码处理即可。
  • 对于离线厂商通知 (pushChannel)titlebody 字段必须使用原始未编码的字符串,或者是你已经解码后的字符串。

以下是一个 Java 服务端推送示例,展示了如何正确设置:

// 1. 设置在线透传消息体 (pushMessage)  
PushMessage pushMessage = new PushMessage();  
// 这里可以放你编码后的复杂数据,供在线时解析使用  
pushMessage.setTransmission(" {title:\"标题\",content:\"内容\",payload:\"自定义数据,比如包含#的编码内容\"}");  

// 2. 设置离线厂商通道消息体 (pushChannel)  
PushChannel pushChannel = new PushChannel();  

// 安卓离线厂商通道  
AndroidDTO androidDTO = new AndroidDTO();  
Ups ups = new Ups();  
ThirdNotification thirdNotification = new ThirdNotification();  
// *** 关键点:这里必须设置成解码后的、可读的文本 ***  
thirdNotification.setTitle("这里是离线通知的标题"); // 不要放编码后的字符串  
thirdNotification.setBody("这里是离线通知的内容,可以正常包含 # 号"); // 不要放编码后的字符串  
thirdNotification.setClickType("intent");  
// intent 参数必须按文档要求的固定格式传值  
thirdNotification.setIntent("请填写固定格式的intent");  
ups.setNotification(thirdNotification);  
androidDTO.setUps(ups);  
pushChannel.setAndroid(androidDTO);  

// iOS离线APN通道  
IosDTO iosDTO = new IosDTO();  
Aps aps = new Aps();  
Alert alert = new Alert();  
// *** 关键点:这里也必须设置成解码后的、可读的文本 ***  
alert.setTitle("iOS离线通知标题");  
alert.setBody("iOS离线通知内容");  
aps.setAlert(alert);  
iosDTO.setAps(aps);  
pushChannel.setIos(iosDTO);  

// 3. 将两者组装到推送DTO中  
PushDTO pushDTO = new PushDTO();  
pushDTO.setPushMessage(pushMessage); // 在线消息体  
pushDTO.setPushChannel(pushChannel); // 离线消息体  
// ... 设置受众等其他参数

本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent

总结

个推原生 SDK 本身不负责对厂商通道的内容进行解码。要解决离线消息乱码问题,你需要修改服务端推送逻辑,确保传递给厂商通道的 titlebody已经解码的、可直接阅读的最终文本。而自定义的复杂数据,可以放在透传消息的 payload 里,由在线时的 receive 回调来处理。

内容为 AI 生成,仅供参考

要回复问题请先登录注册