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直接传递了正确的字符。
修复步骤
移除不必要的URL编码
直接将原始文本赋值给notification的body字段,不需要手动编码。确保请求的Content-Type正确设置
向FCM发送请求时,必须指定Content-Type: application/json; charset=UTF-8,让服务器知道你发送的是UTF-8编码的JSON数据。正确写入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
相关产品推荐
相关产品推荐

