You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端通过FCM向iOS推送表情/UTF-8文本显示异常求助

解决Android向iOS推送Firebase通知时UTF-8/表情乱码的问题

我之前也踩过类似的坑,咱们来一步步把这个问题搞定:

问题根源

Firebase Cloud Messaging (FCM) 的HTTP API接收的是原生JSON格式,JSON本身已经完美支持UTF-8字符和表情符号。你手动用URLEncoder.encode对文本做了URL编码后,iOS端收到的是已经编码后的字符串(比如%E4%B8%AD%E6%96%87),而iOS的通知系统不会自动解码这部分内容,所以就显示成了乱码。其他方向正常是因为那些场景下没有额外做URL编码,原生JSON直接传递了正确的字符。

修复步骤

  1. 移除不必要的URL编码
    直接将原始文本赋值给notification的body字段,不需要手动编码。

  2. 确保请求的Content-Type正确设置
    向FCM发送请求时,必须指定Content-Type: application/json; charset=UTF-8,让服务器知道你发送的是UTF-8编码的JSON数据。

  3. 正确写入JSON字节流
    不要用writeBytes(它会按ASCII编码写入,可能丢失UTF-8字符),改用getBytes("UTF-8")获取UTF-8字节数组后写入输出流。

修正后的完整代码示例

// 构建JSON消息体
JSONObject jsonObject = new JSONObject();
jsonObject.put("to", mCurrentUser.token);

JSONObject notificationObject = new JSONObject();
notificationObject.put("title", title);
// 直接使用原始文本,移除URLEncoder.encode
notificationObject.put("body", mMessage.text);
notificationObject.put("content_available", true);

jsonObject.put("notification", notificationObject);

// 配置HTTP连接
httpURLConnection.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);

// 写入UTF-8编码的JSON字节流
DataOutputStream wr = new DataOutputStream(httpURLConnection.getOutputStream());
wr.write(jsonObject.toString().getBytes("UTF-8"));
wr.flush();
wr.close();

额外验证点

  • 确认你的mMessage.text本身是正确的UTF-8编码字符串(比如从数据库或输入框获取时没有编码错误)。
  • 如果是通过data字段传递自定义内容(而非notification字段),同样不需要编码,iOS端可以直接解析原生字符串。

这样修改后,Android向iOS推送的表情和UTF-8文本就能正常显示啦~

内容的提问来源于stack exchange,提问作者ShineMan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:04:28