配置消息的推送属性
更新时间: 2025/06/10 16:11:24
网易云信 NIM SDK 支持配置消息的推送相关属性。
功能介绍
-
发送方 可在 发送 消息/自定义系统通知时配置消息体(
NIMMessage
)的推送属性,包括消息是否需要离线推送、推送文案、推送标题等。 -
当收到离线推送后,接收方 可以设置通知栏的跳转,即单击通知栏后,就进入指定的聊天界面。
具体的属性说明,参考文末的 推送属性列表。
设置消息推送
发送方可以通过消息体中的是否需要推送参数(enablePush
),来设置该消息是否需要离线推送。
可以通过调用getConfig
获取消息的推送配置,也可以调用 setConfig
修改消息的推送配置。
示例代码如下:
JavaCustomMessageConfig config = new CustomMessageConfig();
config.enablePush = false;
textMessage.setConfig(config)
设置推送文案
网易云信支持设置消息的推送文案。
消息推送文案使用优先级如下:
- 如果消息接收方设置的推送文案显示属性为 显示详情(
showNoDetail
= false),那么优先显示接收到的消息的推送文案(消息体中的PushContent
字段内容),若发送方在发送消息时未设置消息的推送文案,则显示网易云信消息的内置文案(根据消息类型不同,内置文案不同,如文本消息类型对应的文案为发来了一条消息)。 - 如果消息接收方设置的推送文案显示属性为 不显示详情(
showNoDetail
= true),那么优先显示提前设置好的自定义的推送文案(自定义推送文案功能需要单独开通,并且自定义的推送文案需要提前在 网易云信控制台 中添加。具体操作请参考下文的 使用不显示详情的自定义推送文案),若未设置,则使用默认的推送文案是:您收到一条新消息。
设置消息体的推送文案
发送方可以通过设置消息体中的 PushContent
参数来设置该消息的推送文案。
发送设置好推送文案的消息后,接收方登录后会收到一条推送消息,内容形式为 "昵称:"+ **推送文案**
。其中,昵称为推送文案前缀(默认需要前缀),具体请参考下文的 设置推送文案前缀。
可以通过调用getPushContent
获取消息的推送文案,也可以调用 setPushContent
设置消息的推送文案。
示例代码如下:
Java// 获取消息的推送文案
String pushContent = textMessage.getPushContent();
// 设置消息的推送文案
textMessage.setPushContent("Set the push content you want.");
设置消息的推送文案前缀
通过消息体中的是否需要推送前缀参数(CustomMessageConfig.enablePushNick
),来设置该消息是否需要推送文案前缀,网易云信服务器向第三方推送服务端请求推送时,前缀为用户昵称。
enablePushNick
默认为 true,即默认需要推送文案前缀,如不需要,可修改为 flase。
可以通过调用getConfig
获取消息的推送配置,也可以调用 setConfig
修改消息的推送配置。
示例代码如下:
JavaCustomMessageConfig config = new CustomMessageConfig();
config.enablePushNick = false;
textMessage.setConfig(config)
设置自定义推送文案
如果消息接收方将推送文案属性设置为 不显示详情 (showNoDetail
= true),如果没有单独配置自定义的推送文案,那么将使用网易云信内置的默认推送文案:您收到一条新消息。
若根据您的业务需求,需要使用自定义的推送文案,可以通过以下步骤实现。
-
在网易云信控制台开通并添加自定义推送。
在 网易云信控制台 首页 应用管理 选择应用,再进入产品功能 > IM 即时通讯 > 基础功能,找到并开启 自定义推送。
单击并进入 子功能配置,单击 新增 添加自定义推送文案。
最多可以配置 100 种自定义推送文案,每种自定义文案用一个自定义类型来标识。
-
在初始化时,通过配置
SDKOptions.customPushContentType
来设置自定义的推送文案类型(对应控制台中的 自定义类型)。Java
SDKOptions.customPushContentType = "custom_push_content_type"
-
将推送文案属性设置为不显示详情。示例代码如下:
Java
// boolean showNoDetail = true; NIMClient.getService(MixPushService.class).setPushShowNoDetail(showNoDetail).setCallback( new RequestCallbackWrapper<Void>() { @Override public void onResult(int code, Void result, Throwable exception) { if (code == ResponseCode.RES_SUCCESS) { // 设置成功 } else { // 设置失败 } } });
设置推送标题
目前网易云信发起的推送支持以下两种方式来设置推送标题:
- 发送方通过消息体的推送自定义字段
PushPayload
来配置推送标题。 通过setPushPayload
配置 "pushTitle": "标题内容",则以此显示,优先级最高。 - 如果没有配置,则使用网易云信默认的推送标题:点对点消息(P2P)推送标题默认为 用户昵称 (如果没有设置用户昵称,则点对点消息推送标题默认为 新消息),群消息推送标题默认为 群名称。
示例代码如下:
JavaCustomNotification notification = new CustomNotification();
Map<String, Object> payloadMap = new HashMap<>();
notification.setPushPayload(payloadMap);
设置推送通知栏跳转方式
发送方在发送消息前,在网易云信消息体的 PushPayload
中传入通知栏消息单击行为配置。当接收方收到离线推送后,可以设置通知栏跳转动作,即单击通知栏后,就进入指定的聊天界面。
小米推送
您可以在 Application#oncreate
的主进程中进行 MixPushMessageHandler
的 onNotificationClicked
事件注册,监听小米推送通知栏单击之后的回调。
返回 true,表示开发者自行处理第三方推送通知栏单击事件,SDK 将不再处理。返回 false 表示仍然使用 SDK 提供默认的单击后的跳转。
-
设置网易云信消息体中
PushPayload
的消息单击行为:Java
// set PushPayload Map<String, Object> pushPayload = new HashMap<>(); pushPayload.put("sessionID", "123456"); textMessage.setPushPayload(pushPayload); // get PushPayload String sessionId = payload.get("sessionID"); if (sessionId != null ) { // set your click action here. }
-
注册
onNotificationClicked
事件。Java
public class DemoMixPushMessageHandler implements MixPushMessageHandler { @Override public boolean onNotificationClicked(Context context, Map<String, String> payload) { String sessionId = payload.get("sessionID"); if (sessionId != null ) { Intent notifyIntent = new Intent(); // set your intent param here context.startActivity(notifyIntent); } } }
当接收方收到小米推送时,处理方式请参考 通知栏通知的单击行为。
华为推送
设置网易云信消息体中 PushPayload
的消息单击行为,即在 PushPayload
中传入 key 为 hwField
的 Map 或者 JsonObject 类型的数据,通过 click_action
字段实现自定义通知栏的跳转,同时还可传入发送者的账号(accid)/ 群组 ID 与类型(单聊或群聊)等信息,这些信息将被透传到推送的接收方。数据的参数填写方法请参考 华为开放平台:HTTPS 下行消息。示例代码如下:
JavaIntent hwIntent = new Intent(Intent.ACTION_VIEW);
String intentStr = String.format(
"pushscheme://com.huawei.codelabpush/deeplink?sessionID=%s&sessionType=%s",
sessionId, // 发送者的账号(accid)/ 群组 ID
sessionType // 类型(单聊或群聊)
);
hwIntent.setData(Uri.parse(intentStr));
hwIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
String intentUri = hwIntent.toUri(Intent.URI_INTENT_SCHEME);
//单击事件的内容
JSONObject clickAction = new JSONObject();
//通知的内容
JSONObject notification = new JSONObject();
try {
clickAction.putOpt("type", 1)
.putOpt("intent", intentUri);
notification.putOpt("click_action", clickAction);
pushPayload.put("hwField", notification);
} catch (JSONException e) {
e.printStackTrace();
}
当接收方收到华为推送时,处理方式请参考 华为开放平台:单击通知消息。
荣耀推送
设置网易云信消息体中 PushPayload
的消息单击行为,即在 PushPayload
中传入 key 为 honorField
的 Map 或者 JsonObject 类型的数据,通过 clickAction
字段实现自定义通知栏的跳转,同时还可传入发送者的账号(accid)/ 群组 ID 与类型(单聊或群聊)等信息,这些信息将被透传到推送的接收方。数据的参数填写方法请参考 。示例代码如下:
JavaIntent honorIntent = new Intent(Intent.ACTION_VIEW);
String intentStr = String.format(
"pushscheme://link?sessionID=%s&sessionType=%s",
sessionId, // 发送者的账号(accid)/ 群组 ID
sessionType // 类型(单聊或群聊)
);
honorIntent.setData(Uri.parse(intentStr));
honorIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
String intentUri = honorIntent.toUri(Intent.URI_INTENT_SCHEME);
//单击事件的内容
JSONObject clickAction = new JSONObject();
//通知的内容
JSONObject notification = new JSONObject();
try {
clickAction.putOpt("type", 1)
.putOpt("intent", intentUri);
notification.putOpt("clickAction", clickAction);
pushPayload.put("honorField", notification);
} catch (JSONException e) {
e.printStackTrace();
}
当接收方收到荣耀推送时,处理方式请参考 荣耀-下行消息。
OPPO 推送
设置网易云信消息体中 PushPayload
的消息单击行为,即在 PushPayload
中传入 key 为 oppoField
的 Map 或者 JsonObject 类型的数据,通过 click_action_type
字段实现自定义通知栏的跳转,同时还可传入发送者的账号(accid)/ 群组 ID 与类型(单聊或群聊)等信息,这些信息将被透传到推送的接收方。数据的参数请参考 OPPO 开放平台:通知栏消息。示例代码如下:
Java// oppoField
Map<String, Object> oppoField = new HashMap<>();
Editable oppoChannelId = oppoChannelIdET.getText();
oppoField.put("click_action_type", 1);
oppoField.put("click_action_activity", "com.oppo.codelabpush.intent.action.test");
// oppoField.put("click_action_type", 4);
// oppoField.put("click_action_activity", "com.netease.nim.demo.main.activity.MixPushActivity");
JSONObject obj = new JSONObject();
try {
obj.putOpt("sessionID", sessionType == SessionTypeEnum.P2P ? TestCache.getAccount() : msg.getSessionId());
obj.putOpt("sessionType", sessionType.getValue());
} catch (JSONException e) {
e.printStackTrace();
}
oppoField.put("action_parameters", obj.toString());
pushPayload.put("oppoField", oppoField);
当接收方收到 OPPO 推送时,处理方式请参考 OPPO 开放平台:通知栏消息。
谷歌推送
单击谷歌推送通知栏之后,直接启动应用入口 Activity,通过 Intent 携带数据,SDK 提供接口判断是否是网易云信侧集成的 FCM Intent。
通过调用 MixPushService
提供的 isFCMIntent
和 parseFCMPayload
接口处理 FCM payload。示例代码如下:
Javaif (NIMClient.getService(MixPushService.class).isFCMIntent(intent)) {
String payload = NIMClient.getService(MixPushService.class).parseFCMPayload(intent);
}
即时通讯 Demo 中,在 WelcomeActivity.java 的 onIntent 中判断:if (NIMClient.getService(MixPushService.class).isFCMIntent(intent))
,具体代码请参考 Demo。
其他推送
对于推送,发送方在构造消息对象时,需要通过 setPushPayload
插入表示会话标识的信息(如自身的账号、群 ID、会话类型等),便于接收端获取到 Payload 时的解析。
示例代码如下:
JavaMap<String, Object> pushPayload = new HashMap<>();
pushPayload.put("sessionID", "123456");
textMessage.setPushPayload(pushPayload);
覆盖通知栏内容
安卓支持推送消息覆盖(除 vivo),即后一条推送内容覆盖前面推送内容。可以前往 网易云信控制台-选择对应的应用- IM 即时通讯 -功能配置- 基础功能 - 撤回消息覆盖策略-撤回消息是否覆盖原始消息推送 进行设置。

以撤回消息的场景为例:
用户 A 发消息给用户 B,产生第三方推送,文案内容为 您好。然后用户 A 撤回了此条消息,此时通知栏中的 您好 变为预设的 对方撤回了一条消息。
消息体推送属性列表
参数 | 类型 | 说明 |
---|---|---|
Config | CustomMessageConfig |
消息配置项 其中 enablePush 表示消息是否需要推送。enablePushNick 表示推送是否需要带前缀(一般为昵称) |
Content | String | 当消息类型不是文本(MsgTypeEnum#text)时,该字段表示消息推送的显示文本,最大长度为 500 字符 SDK 1.7.0 及以上版本建议使用 pushContent |
PushContent | String | 自定义推送文案,最大长度 500 字符,撤回消息时该字段无效 SDK 1.7.0 及以上版本建议使用此字段,不要使用 setContent 来设置推送文案 |
PushPayload | Map< String, Object > | 第三方自定义的推送属性,可以通过该字段自定义消息推送 Payload,支持字段参考第三方推送技术文档,最大长度 2048 字符,撤回消息时该字段无效 |