跳到主要内容

发送消息

本文主要描述了如何使用 IMLib SDK 向单聊会话、群聊会话、聊天室会话中发送消息。

如发送超级群消息,请参见超级群群文档 收发消息

消息内容类型简介

IMLib SDK 定义的 RCMessage 对象的 content 属性中可包含两大类消息内容:普通消息内容和媒体消息内容。普通消息内容父类是 RCMessageContent,媒体消息内容父类是 RCMediaMessageContent。发送媒体消息和普通消息本质的区别为是否有上传数据过程。

功能消息内容的类型父类描述
文本消息RCTextMessageRCMessageContent文本消息的内容。
引用回复RCReferenceMessageRCMessageContent引用消息的内容,用于实现引用回复功能。
图片消息RCImageMessageRCMediaMessageContent图片消息的内容,支持发送原图。
GIF 消息RCGIFMessageRCMediaMessageContentGIF 消息的内容。
文件消息RCFileMessageRCMediaMessageContent文件消息的内容。
语音消息RCHQVoiceMessageRCMediaMessageContent高清语音消息的内容。
提及他人(@ 消息)不适用不适用@消息并非预定义的消息类型。详见如何发送 @ 消息

以上为 IMLib SDK 内置的部分消息内容类型。您还可以创建自定义的消息内容类型,并使用 sendMessage 方法或sendMediaMessage 方法发送。详见自定义消息类型

重要

  • 发送普通消息使用 sendMessage 方法,发送媒体消息使用 sendMediaMessage 方法。
  • 客户端 SDK 发送消息存在频率限制,每秒最多只能发送 5 条消息。

本文使用 IMLib SDK 核心类 RCIMClient(也可以用 RCCoreClient)的发送消息方法。

普通消息

普通消息指文本消息、引用消息等不涉及媒体文件上传的消息。普通消息的消息内容为 RCMessageContent 的子类的消息,例如文本消息内容(RCTextMessage),或自定义类型的普通消息内容。

构造普通消息

在发送前,需要先构造 RCMessage 对象,指定会话类型(单聊、群聊、聊天室),会话的 Target ID,消息方向(发送或接收),消息内容。以下示例中构造了一条包含文本消息内容(RCTextMessage)的消息对象。

RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"测试文本消息"];
RCConversationType conversationType = ConversationType_PRIVATE

RCMessage *message = [[RCMessage alloc]
initWithType:conversationType
targetId:@"targetId"
direction:MessageDirection_SEND
content:messageContent];

发送普通消息

如果 RCMessage 对象包含普通消息内容,使用 IMLib SDK 核心类 RCCoreClient(也可以用 RCIMClient)的 sendMessage 方法发送消息。

RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"测试文本消息"];

RCMessage *message = [[RCMessage alloc]
initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:messageContent];


[[RCCoreClient sharedRCCoreClient]
sendMessage:message
pushContent:nil
pushData:nil
attached:^(RCMessage *successMessage) {
//入库成功
}
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}];

sendMessage 方法中直接提供了用于控制推送通知内容(pushContent)和推送附加信息(pushData)的参数。另一种方式是使用消息推送属性配置 RCMessagePushConfig,其中包含了 pushContentpushData,并提供更多推送通知配置能力,例如标题、内容、图标、或其他第三方厂商个性化配置。详见远程推送通知

关于是否需要配置输入参数或 RCMessagemessagePushConfig 属性中 pushContent,请参考以下内容:

参数类型说明
messageRCMessage要发送的消息体。必填属性包括会话类型(conversationType),会话 ID(targetId),消息内容(content)。详见[消息介绍] 中对 RCMessage 的结构说明。
pushContentNSString修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
pushDataNSStringPush 附加信息。可设置为 nil。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
attachedBlockBlock消息已成功存入消息数据库的回调。
successBlockBlock消息发送成功回调。
errorBlockBlock消息发送失败回调。

通过 RCCoreClientsendMessage 方法的回调,融云服务器始终会通知您的消息是否已发送成功。当因任何问题导致发送失败时,可通过回调方法返回异常。

提示

媒体消息

媒体消息指图片、GIF、文件等需要处理媒体文件上传的消息。媒体消息的消息内容类型为 RCMeidaMessageContent 的子类,例如高清语音消息内容(RCHQVoiceMessage),或您自定义类型的媒体消息内容。

构造媒体消息

在发送前,需要先构造 RCMessage 对象。媒体消息 RCMessage 对象的 content 字段必须传入 RCMediaMessageContent 的子类对象,表示媒体消息内容。例如图片消息内容(RCImageMessage)、GIF 消息内容(RCGIFMessage),或继承自 RCMediaMessageContent 的自定义媒体消息内容。

图片消息内容(RCImageMessage)支持设置为发送原图。

RCImageMessage *mediaMessageContent = [RCImageMessage messageWithImageURI:@"path/to/image"];
mediaMessageContent.full YES; // 图片消息支持设置以原图发送

RCMessage *message = [[RCMessage alloc] initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:mediaMessageContent];

在发送前,图片会被压缩质量,以及生成缩略图,在聊天界面中展示。GIF 无缩略图,也不会被压缩。

  • 图片消息的缩略图:SDK 会以原图 30% 质量生成符合标准大小要求的大图后再上传和发送。压缩后最长边不超过 240 px。缩略图用于在聊天界面中展示。
  • 图片:发送消息时如未选择发送原图,SDK 会以原图 85% 质量生成符合标准大小要求的大图后再上传和发送。压缩后最长边不超过 1080 px。

一般情况下不建议修改 SDK 默认压缩配置。如需调整 SDK 压缩质量,详见知识库文档如何修改 SDK 默认的图片与视频压缩配置

发送媒体消息

发送媒体消息需要使用 sendMediaMessage 方法。SDK 会为图片、小视频等生成缩略图,根据默认压缩配置进行压缩,再将图片、小视频等媒体文件上传到融云默认的文件服务器(文件存储时长),上传成功之后再发送消息。图片消息如已设置为发送原图,则不会进行压缩。

[[RCCoreClient sharedCoreClient] sendMediaMessage:message
pushContent:nil
pushData:nil
attached:^(RCMessage *successMessage) {
//入库成功
}
progress:^(int progress, RCMessage *progressMessage) {
//媒体上传进度
}
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}
cancel:^(RCMessage *cancelMessage) {
//取消
}];

sendMediaMessage 方法中直接提供了用于控制推送通知内容(pushContent)和推送附加信息(pushData)的参数。另一种方式是使用消息推送属性配置 RCMessagePushConfig,其中包含了 pushContentpushData,并提供更多推送通知配置能力,例如标题、内容、图标、或其他第三方厂商个性化配置。详见远程推送通知

关于是否需要配置输入参数或 RCMessagemessagePushConfig 属性中 pushContent,请参考以下内容:

参数类型说明
messageRCMessage要发送的消息体。必填属性包括会话类型(conversationType),会话 ID(targetId),消息内容(content)。详见[消息介绍] 中对 RCMessage 的结构说明。
pushContentNSString修改或指定远程消息推送通知栏显示的内容。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
pushDataNSStringPush 附加信息。可设置为 nil。您也可以在 RCMessage 的推送属性(RCMessagePushConfig)中配置,会覆盖此处配置,详见配置消息的推送属性
attachedBlockBlock消息已成功存入消息数据库的回调。
progressBlockBlock媒体上传进度的回调。
successBlockBlock消息发送成功回调。
errorBlockBlock消息发送失败回调。
cancelBlock取消发送的回调。

通过 RCCoreClientsendMediaMessage 方法的回调方法,融云服务器始终会通知媒体文件上传进度,以及您的消息是否已发送成功。当因任何问题导致发送失败时,可通过回调方法返回异常。

发送媒体消息的方法默认将媒体文件上传到融云的文件服务器,您可以在客户端应用程序 下载媒体消息文件。融云对上传媒体文件大小进行了限制,GIF 大小限制为 2 MB,文件上传限制为 100 MB。如果您需要提高上限,可提交工单

提示

发送媒体消息并且上传到自己的服务器

您可以直接发送您服务器上托管的文件。将媒体文件的 URL(表示其位置)作为参数,在构建媒体消息内容时传入。在这种情况下,您的文件不会托管在融云服务器上。当您发送带有远程 URL 的文件消息时,文件大小没有限制,您可以直接使用 sendMessage 方法发送消息。

如果您希望 SDK 在您上传成功后发送消息,您可以使用 RCCoreClientsendMediaMessage 方法,具体操作如下:

  • 上传媒体文件的过程中,可调用 RCUploadMediaStatusListenerupdateBlockerrorBlock,通知 SDK 当前上传媒体文件的进度和状态。
  • 上传完毕后,取得网络文件 URL。通过 RCUploadMediaStatusListenercurrentMessage 属性获取当前 RCMessage 对象,将 RCMessage 对象的 content 中的对应 URL 字段设置成上传成功的网络文件 URL。
  • 调用 RCUploadMediaStatusListenersuccessBlock,通知 SDK 文件上传完成。
RCImageMessage *mediaMessageContent = [RCImageMessage messageWithImageURI:@"path/to/image"];
mediaMessageContent.full = YES; // 图片消息支持设置以原图发送

RCMessage *message = [[RCMessage alloc]
initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:mediaMessageContent];

[[RCCoreClient sharedCoreClient] sendMediaMessage:message
pushContent:nil
pushData:nil
attached:^(RCMessage * _Nullable msg) {
} uploadPrepare:^(RCUploadMediaStatusListener * _Nonnull uploadListener) {
RCMessage *currentMessage = uploadListener.currentMessage;
// App 在上传媒体文件时,需要在监听中调用 updateBlock、successBlock 与 errorBlock
if ([currentMessage.content isKindOfClass:[RCImageMessage class]]) {
RCImageMessage *content = (RCImageMessage *)currentMessage.content;
// 上传自己服务器后,获取到的图片 url 地址
content.remoteUrl = @"https://www.test.com/img/test.jpg";
uploadListener.successBlock(content);
}
} progress:^(int progress, long messageId) {
//媒体上传进度, 需要自行刷新 UI
} success:^(long messageId) {
} error:^(RCErrorCode errorCode, long messageId) {
} cancel:^(long messageId) {
}];

如何发送 @ 消息

@消息在融云即时通讯服务中不属于一种预定义的消息类型(详见服务端文档 消息类型概述)。融云通过在消息中携带 mentionedInfo 数据,帮助 App 实现提及他人(@)功能。

消息的 RCMessageContent 中的 RCMentionedInfo 字段存储了携带所 @ 人员的信息。无论是 SDK 内置消息类型,或者您自定义的消息类型,都直接或间接继承了 RCMessageContent 类。

融云支持在向群组和超级群中发消息时,在消息内容中添加 mentionedInfo。消息发送前,您可以构造 RCMentionedInfo 对象,并设置到消息的 RCMessageContent 中。

RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"Test"];

messageContent.mentionedInfo = [[RCMentionedInfo alloc] initWithMentionedType:RC_Mentioned_Users userIdList:mentionedUserIdList mentionedContent:nil];

MentionedInfo 参数:

参数类型说明
typeRCMentionedType(必填)指定 MentionedInfo 的类型。RC_Mentioned_All 表示需要提及(@)所有人。RC_Mentioned_Users 表示需要 @ 部分人,被提及的人员需要在 userIdList 中指定。
userIdListNSArray被提及(@)用户的 ID 集合。当 typeRC_Mentioned_Users 时必填。从 5.3.1 版本开始,支持当 typeRC_Mentioned_All 时同时在 userIdList 中提及部分人。接收端可通过 RCMentionedInfo 获取 userIdList 数据。
mentionedContentNSString触发离线消息推送时,通知栏显示的内容。如果是 nil,则显示默认提示内容(“有人 @ 你”)。@消息携带的 mentionedContent 优先级最高,会覆盖所有默认或自定义的 pushContent 数据。

以下示例展示了发送一条提及部分用户的文本消息,该消息发往一个群聊会话。

RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"测试文本消息"];

messageContent.mentionedInfo = [[RCMentionedInfo alloc]
initWithMentionedType:RC_Mentioned_Users
userIdList:@[@"userId1", @"userId2"]
mentionedContent:nil];

RCMessage *message = [[RCMessage alloc]
initWithType:ConversationType_GROUP
targetId:@"targetId"
direction:MessageDirection_SEND
content:messageContent];

[[RCCoreClient sharedRCCoreClient]
sendMessage:message
pushContent:nil
pushData:nil
successBlock:^(RCMessage *successMessage) {
//成功
}
errorBlock:^(RCErrorCode nErrorCode, RCMessage *errorMessage) {
//失败
}];

IMLib SDK 接收消息后,您需要处理 @ 消息中的数据。您可以在获取 RCMessage(消息对象)后获取到消息对象携带的 RCMentionedInfo 对象。

远程推送通知

提示

聊天室会话不支持离线消息机制,因此也不支持离线消息转推送。

如果您的应用已经在融云配置第三方推送,在消息接收方离线时,融云服务端会根据消息类型、接收方支持的推送通道、接收方的免打扰设置等,决定是否触发远程推送。

远程推送通知一般会展现在系统的通知栏。融云内置的消息类型默认会在通知栏展现通知标题和通知内容。关于各类型消息的默认推送通知内容,详见用户内容类消息格式

如果您需要个性化的离线推送通知,可以通过以下方式,修改或指定远程推送的通知标题、通知内容其他属性。

  • sendMessagesendMediaMessage 方法的输入参数中直接提供了用于控制推送通知内容(pushContent)参数。
  • 如果您需要控制离线推送通知的更多属性,例如标题、内容、图标、或根据第三方厂商通道作个性化配置,请使用 RCMessage 的推送属性(RCMessagePushConfig)进行配置。消息推送属性中的 pushContent 配置会覆盖发送消息接口中的 pushContent

配置消息推送属性

在发送消息时,您可以通过设置 RCMessagemessagePushConfig 属性,对单条消息的推送行为进行个性化配置。例如:

  • 自定义推送标题、推送通知内容
  • 自定义通知栏图标
  • 添加远程推送附加信息
  • 越过接收客户端的配置,强制在推送通知内显示通知内容
  • 其他 APNs 或 Android 推送通道支持的个性化配置

相对于发送消息时输入参数中的 pushContentpushDataMessagePushConfig 中的配置具有更高优先级。发送消息时,如已配置 RCMessagemessagePushConfig 属性,则优先使用 messagePushConfig 中的配置。

RCTextMessage *txtMsg = [RCTextMessage messageWithContent:@"测试文本消息"];

RCMessage *message = [[RCMessage alloc]
initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:txtMsg];

RCMessagePushConfig *pushConfig = [[RCMessagePushConfig alloc] init];
pushConfig.disablePushTitle = NO;
pushConfig.pushTitle = @"通知标题";
pushConfig.pushContent = @"通知内容";
pushConfig.pushData = @"通知的 pushData";
pushConfig.templateId = @"templateId";
pushConfig.iosConfig.threadId = @"iOS 用于通知分组的 id";
pushConfig.iosConfig.apnsCollapseId = @"iOS 用于通知覆盖的 id";
pushConfig.iosConfig.richMediaUri = @"iOS 推送自定义的通知栏消息右侧图标 URL";
pushConfig.androidConfig.notificationId = @"Android 的通知 id";
pushConfig.androidConfig.channelIdMi = @"小米的 channelId";
pushConfig.androidConfig.channelIdHW = @"华为的 channelId";
pushConfig.androidConfig.categoryHW = @"华为的 Category";
pushConfig.androidConfig.channelIdOPPO = @"OPPO 的 channelId";
pushConfig.androidConfig.typeVivo = @"vivo 的 classification";
pushConfig.androidConfig.categoryVivo = @"vivo 的 Category";
pushConfig.forceShowDetailContent = YES;
message.messagePushConfig = pushConfig;

/// 调用 IMLib 发送消息方法

消息推送属性说明(RCMessagePushConfig)提供以下参数:

参数类型说明
disablePushTitleBOOL是否屏蔽通知标题,此属性只针目标用户为 iOS 平台时有效,Android 第三方推送平台的通知标题为必填项,所以暂不支持。
pushTitleNSString推送标题,此处指定的推送标题优先级最高。如不设置,可参考 用户内容类消息格式 中对各内置消息类型默认推送通知标题推送通知内容的说明。
pushContentNSString推送内容。此处指定的推送内容优先级最高。如不设置,可参考 用户内容类消息格式 中对各内置消息类型默认推送通知标题推送通知内容的说明。
pushDataNSString远程推送附加信息,如果没有,则使用发送消息的 pushData
forceShowDetailContentBOOL是否强制显示通知详情,当目标用户通过 RCPushProfile 中的 - (void)updateShowPushContentStatus:(BOOL)isShowPushContent success:(void (^)(void))successBlock error:(void (^)(RCErrorCode status))errorBlock; 设置推送不显示消息详情时,可通过此参数,强制设置该条消息显示推送详情
templateIdNSString推送模板 ID,设置后根据目标用户通过 SDK RCPushProfile 中的 setPushLauguageCode 设置的语言环境,匹配模板中设置的语言内容进行推送,未匹配成功时使用默认内容进行推送。模板内容在“控制台-自定义推送文案”中进行设置,具体操作请参见 配置和使用自定义多语言推送模板
iOSConfigRCiOSConfigiOS 平台相关配置。详见 RCiOSConfig 属性说明
androidConfigRCAndroidConfigAndroid 平台相关配置。RCiOSConfig 属性说明
  • RCiOSConfig 属性说明

    参数类型说明
    threadIdNSStringiOS 平台通知栏分组 ID,相同的 threadId 推送分为一组(iOS10 开始支持)
    apnsCollapseIdNSStringiOS 平台通知覆盖 ID,apnsCollapseId 相同时,新收到的通知会覆盖老的通知,最大 64 字节(iOS10 开始支持)
    richMediaUriNSStringiOS 推送自定义的通知栏消息右侧图标 URL,需要 App 自行解析 richMediaUri 并实现展示。图片要求:大小 120 * 120px,格式为 png 或者 jpg 格式。SDK 从 5.2.4 版本开始支持携带该字段。
    interruptionLevelNSString适用于 iOS 15 及之后的系统。取值为 passiveactive(默认),time-sensitive,或 critical,取值说明详见对应的 APNs 的 interruption-level 字段。在 iOS 15 及以上版本中,系统的 “定时推送摘要”、“专注模式” 都可能导致重要的推送通知(例如余额变化)无法及时被用户感知的情况,可考虑设置该字段。SDK 5.6.7 及以上版本支持该字段。
  • RCAndroidConfig 属性说明

    参数类型说明
    notificationIdNSStringAndroid 平台 Push 唯一标识,目前支持小米、华为推送平台,默认开发者不需要进行设置,当消息产生推送时,消息的 messageUId 作为 notificationId 使用
    channelIdMiNSString小米的渠道 ID,该条消息针对小米使用的推送渠道,如开发者集成了小米推送,需要指定 channelId 时,可向 Android 端研发人员获取,channelId 由开发者自行创建
    miLargeIconUrlNSString由于小米官方已停止支持该能力,该字段已失效)小米通知类型的推送所使用的通知图片 url。图片要求:大小120 * 120px,格式为 png 或者 jpg 格式。
    此属性 5.1.7 及以上版本支持。支持 MIUI 国内版(国内版要求为 MIUI 12 及以上)和国际版。
    channelIdHWNSString华为的渠道 ID,该条消息针对华为使用的推送渠道,如开发者集成了华为推送,需要指定 channelId 时,可向 Android 端研发人员获取,channelId 由开发者自行创建
    hwImageUrlNSString华为推送通知中自定义的通知栏消息右侧小图片 URL,如果不设置,则不展示通知栏右侧图片。图标文件须小于 512 KB,图标建议规格大小:40dp x 40dp,弧角大小为 8dp,超出建议规格大小的图标会存在图片压缩或显示不全的情况。
    此属性 5.1.7 及以上版本支持
    categoryHWNSString华为推送通道的消息自分类标识,默认为空。category 取值必须为大写字母,例如 IM。App 根据华为要求完成华为自分类权益申请申请特殊权限 后可传入该字段有效。详见华为推送官方文档华为消息分类标准。该字段优先级高于控制台为 App Key 下的应用标识配置的华为推送 Category。SDK 5.4.0 及以上版本支持该字段。
    importanceHWRCImportanceHw华为推送的消息提醒级别。RCImportanceHwLow 表示通知栏消息预期的提醒方式为静默提醒,消息到达手机后,无铃声震动。RCImportanceHwNormal 表示通知栏消息预期的提醒方式为强提醒,消息到达手机后,以铃声、震动提醒用户。终端设备实际消息提醒方式将根据 categoryHW 字段取值、或者控制台配置的 category 字段取值,或者华为智能分类结果进行调整。SDK 5.1.3 及以上版本支持该字段。
    imageUrlHonorNSString荣耀推送通知中用户自定义的通知栏右侧大图标 URL,如果不设置,则不展示通知栏右侧图标。图标文件须小于 512 KB,图标建议规格大小:40dp x 40dp,弧角大小为 8dp,超出建议规格大小的图标会存在图片压缩或显示不全的情况。SDK 5.6.7 及以上版本支持该字段。
    importanceHonorRCimportanceHonor荣耀推送的 Android 通知消息分类,决定用户设备消息通知行为。RCImportanceHonorLow 表示资讯营销类消息。RCImportanceHonorNormal(默认值)表示服务与通讯类消息。SDK 5.6.7 及以上版本支持该字段。
    typeVivoNSStringVIVO 推送服务的消息类别。可选值 0(运营消息) 和 1(系统消息)。该参数对应 VIVO 推送服务的 classification 字段,详见 VIVO 推送消息分类说明
    categoryVivoNSStringVIVO 推送服务的消息二级分类。例如 IM(即时消息)。该参数对应 VIVO 推送服务的 category 字段。详细的 category 取值请参见 VIVO 推送消息分类说明。如果指定二级分类 categoryVivo,必须同时指定 typeVivo(系统消息或运营消息)。请注意遵照 VIVO 官方要求,确保二级分类属于 VIVO 系统消息场景或运营消息场景下允许发送的内容。categoryVivo 字段优先级高于控制台为 App Key 下的应用标识配置的 VIVO 推送 Category。SDK 5.4.2 及以上版本支持该字段。
    channelIdOPPONSStringOPPO 的渠道 ID,该条消息针对 OPPO 使用的推送渠道,如开发者集成了 OPPO 推送,需要指定 channelId 时,可向 Android 端研发人员获取,channelId 由开发者自行创建
    fcmCollapseKeyNSStringFCM 推送的通知分组 ID。SDK 5.1.3 及以上版本支持该字段。注意,如使用该字段,请确保控制台的 FCM 推送配置中推送方式为通知消息方式
    fcmImageUrlNSStringFCM 推送的通知栏右侧图标 URL。如果不设置,则不展示通知栏右侧图标。SDK 5.1.3 及以上版本支持该字段。注意,如使用该字段,请确保控制台的 FCM 推送配置鉴权方式为证书,推送方式为通知消息方式
    fcmChannelIdNSStringFCM 的渠道 ID,该条消息针对 FCM 推送渠道,如开发者集成了 FCM 推送,需要指定 channelId 时,可向 Android 端研发人员获取,channelId 由开发者自行创建

    Channel ID 需要由 Android 端开发者进行创建,创建方式如下:

    推送通道配置说明
    华为App 端,调用 Android SDK 创建 Channel ID 接口创建 Channel ID
    小米在小米开放平台管理台上创建 Channel ID 或通过小米服务端 API 创建
    OPPOApp 端,调用 Android SDK 创建 Channel ID;在 OPPO 管理台登记该 Channel ID,保持一致性
    vivo调用服务端 API 创建 Channel ID

自定义消息如何支持远程推送

融云为内置的消息类型默认支提供了远程通知标题和通知内容(详见用户内容类消息格式)。不过,如果您发送的是自定义类型的消息,则需要您自行提供 pushContent 字段,否则用户无法收到离线推送通知。具体如下:

  • 如果消息类型为自定义消息类型,且需要支持离线推送通知,则必须向融云提供 pushContent 字段,否则用户无法收到离线推送通知。
  • 如果消息类型为自定义消息类型,但不需要支持远程推送通知(例如通过自定义消息类型实现的 App 业务层操作指令),可将 pushContent 字段留空。
提示

如果要自定义消息启用离线推送通知能力,请务必发送消息的入参或消息推送属性向融云提供 pushContent 字段内容,否则接收方用户无法收到离线推送通知。

为消息禁用推送通知

在接收者未上线时,融云服务端默认触发推送服务,将消息通过推送通道下发(服务端是否触发推送也会收到应用级别、用户级别免打扰设置的影响)。

有时 App 用户可能希望在发送消息时就指定该条消息不需要触发推送,该需求可通过 RCMessage 对象的 MessageConfig 配置实现。

以下示例中,我们将 messageConfigdisableNotification 设置为 YES 禁用该条消息的推送通知。接收方再次上线时会通过融云服务端的离线消息缓存(最多缓存 7 天)自动收取单聊、群聊、系统会话消息。超级群消息因不支持离线消息机制,需要主动拉取。

RCTextMessage *messageContent = [RCTextMessage messageWithContent:@"测试文本消息"];

RCMessage *message = [[RCMessage alloc]
initWithType:ConversationType_PRIVATE
targetId:@"targetId"
direction:MessageDirection_SEND
content:MessageContent];

message.messageConfig.disableNotification = YES;

如何透传自定义数据

如果应用需要将自定义数据透传到对端,可通过以下方式实现:

  • 消息内容 RCMessageContent 的附加信息字段,该字段会随即时消息一并发送到对端。接收方在线接收消息后,可从消息内容中获取该字段。请区别于 Message.extraMessage.extra 为本地操作的字段,不会被发往服务端。
  • 远程推送附加信息 pushData。您可以在 sendMessagesendMediaMessage 的输入参数中直接设置 pushData,也可以使用消息推送属性中的同名字段,后者中的 pushData 会覆盖前者。pushData 仅会在消息触发离线远程推送时下发到对端设备。对端收到远程推送通知时,可通过推送数据中的 appData 字段获取透传的数据内容。详见集成 APNs 远程推送中的获取推送数据

如何处理消息发送失败

对于客户端本地会存储的消息类型(参见消息类型概述),如果触发(errorBlock)回调,App 可以在 UI 临时展示这条发送失败的消息,并缓存 errorBlock 抛出的 RCMessage 实例,在合适的时机重新调用 sendMessage / sendMediaMessage 发送。请注意,如果不复用该消息实例,而是重发相同内容的新消息,本地消息列表中会存储内容重复的两条消息。

对于客户端本地不存储的消息,如果发送失败(errorBlock),App 可缓存消息实例再重试发送,或直接新建消息实例进行发送。

如何实现转发、群发消息

转发消息:IMLib SDK 未提供转发消息接口。App 实现转发消息效果时,可调用发送消息接口发送。

群发消息:群发消息是指向多个用户发送消息。更准确地说,是向多个 Target ID?发送消息,一个 Target ID 可能代表一个用户,一个群组,或一个聊天室。客户端 SDK 未提供直接实现群发消息效果的 API。您可以考虑以下实现方式:

  • App 循环调用客户端的发送消息 API。请注意,客户端 SDK 限制发送消息的频率上限为每秒 5 条。
  • App 在业务服务端接入即时通讯服务端 API(IM Server API),由 App 业务服务端群发消息。IM Server API 的 发送单聊消息 接口支持单次向多个用户发送单聊消息。您也可以通过 发送群聊消息发送聊天室消息接口实现单次向多个群组或多个聊天室发送消息。