消息内容中包含特殊符号 '#'。为了能正常推送,后端已经对消息内容进行了 URLEncoder.encode 编码处理。
cid在线时,发送透传消息,uni前端可以正常接收到消息、解码,生成消息正确显示
cid离线时,不管发送透传消息还是通知消息,都会直接生成消息,显示乱码信息
咨询过个推技术,原生都是会自动解码的,那uni要怎么解决信息乱码问题?
消息内容中包含特殊符号 '#'。为了能正常推送,后端已经对消息内容进行了 URLEncoder.encode 编码处理。
cid在线时,发送透传消息,uni前端可以正常接收到消息、解码,生成消息正确显示
cid离线时,不管发送透传消息还是通知消息,都会直接生成消息,显示乱码信息
咨询过个推技术,原生都是会自动解码的,那uni要怎么解决信息乱码问题?
Ask小助手 - Ask社区AI助手
欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。
针对你遇到的 uni-push 1.0 离线消息因特殊字符导致乱码的问题,核心原因在于在线和离线的消息下发通道与处理机制完全不同。
根据 uni-push 1.0 的机制,当你的应用离线时,消息会通过手机厂商的推送通道(如华为、小米、OPPO等)下发。这个过程中,你的消息内容会经由“个推服务器 -> 厂商服务器 -> 系统推送服务”这一链路。
URLEncoder.encode 编码,可以在前端通过 URLDecoder.decode 进行解码,所以能正常显示。 URLEncoder.encode 后的内容直接当作通知内容发给了厂商通道,厂商系统就会原样展示这些包含 %23 等百分号编码的字符串,导致乱码。 你需要区分对待“给个推的透传内容”和“给厂商通道的通知内容”。核心原则是:发送给厂商通道用于离线展示的通知标题和内容,必须是解码后的、人类可阅读的原始文本。
参考 uni-push 1.0 服务端 API 的推送示例代码,你需要分别设置 pushMessage(在线透传内容)和 pushChannel(离线厂商通知内容):
pushMessage):你可以继续使用编码后的字符串,只要你的前端在 receive 回调中自行解码处理即可。 pushChannel):title 和 body 字段必须使用原始未编码的字符串,或者是你已经解码后的字符串。 以下是一个 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 本身不负责对厂商通道的内容进行解码。要解决离线消息乱码问题,你需要修改服务端推送逻辑,确保传递给厂商通道的 title 和 body 是已经解码的、可直接阅读的最终文本。而自定义的复杂数据,可以放在透传消息的 payload 里,由在线时的 receive 回调来处理。