消息接收

更新时间: 2023/09/12 07:04:36

消息发送等相关说明请查看消息发送

消息接收

接收到消息会通过 chatManager 的回调函数通知上层:

原型

objc@protocol NIMChatManagerDelegate <NSObject>
- (void)onRecvMessages:(NSArray<NIMMessage *> *)messages
@end

参数列表

参数 类型 说明
messages NSArray<NIMMessage *> 消息集合,集合按时间排序并保证所属同一个会话

通知类消息接收

一些特定场景的行为,云信服务器预置了一些通知消息。通知消息也是一种特定消息,开发者需要解析消息中附带的信息,来获取通知内容。如最常见的通知消息是群通知事件,如有新成员进群,则群内已有成员将收到此通知消息。目前不支持从客户端发出通知消息。

附件原型:

objc@interface NIMNotificationObject : NSObject<NIMMessageObject>
/**
 *  通知内容
 */
@property (nonatomic,strong,readonly) NIMNotificationContent  *content;

/**
 *  通知类型
 */
@property (nonatomic,assign,readonly) NIMNotificationType notificationType;
@end

参数列表

参数 类型 说明
content NIMNotificationContent 通知内容
notificationType NIMNotificationType 通知类型,通知类型会随着 SDK 版本升级扩展,开发者需要考虑升级所带来的兼容问题

通知消息需要进行解析,具体步骤为:

  • 解析 NIMMessage 中的 messageObject 字段,强类型转换为 NIMNotificationObject。
  • 解析 NIMNotificationObject 中的 content 字段,得到父类 NIMNotificationContent。
  • 根据 NIMNotificationContent 中的 notificationType 字段,将父类 NIMNotificationContent 强类型转化成具体子类型

所有 content 类型如下:

通知类型 NIMNotificationContent
群事件通知 NIMTeamNotificationContent
网络电话通知 NIMNetCallNotificationContent
聊天室通知 NIMChatroomNotificationContent
未被支持类型通知 NIMUnsupportedNotificationContent

针对群事件通知NIMTeamNotificationContent,详情可参见群组通知消息

多媒体类消息接收

多媒体类消息,如语音消息、图片消息、文件消息和视频消息,需要考虑收到消息后下载资源的情况。 针对使用云信上传服务的多媒体类消息:

  • 如果收到的是图片,视频消息,SDK默认会在收到消息时,自动下载缩略图和封面图片。
  • 如果收到的是语音消息,SDK默认会在收到消息时,自动下载原音频。
  • 如果收到的是文件消息,不会下载原文件。

若要关闭默认策略,自主选择下载时机,可以使用以下方法来完成:

  • 关闭自动下载:

设置NIMSDKConfigfetchAttachmentAutomaticallyAfterReceivingfetchAttachmentAutomaticallyAfterReceivingInChatroomNO

objc@interface NIMSDKConfig <NSObject>
/**
* 是否在收到消息后自动下载附件 (群聊和单聊)。默认为YES,SDK会在第一次收到消息是直接下载消息附件,上层开发可以根据自己的需要进行设置。
*/
@property (nonatomic, assign) BOOL fetchAttachmentAutomaticallyAfterReceiving

/**
* 是否在收到聊天室消息后自动下载附件,默认为NO。
*/
@property (nonatomic, assign) BOOL fetchAttachmentAutomaticallyAfterReceivingInChatroom
@end                         
  • 主动下载附件:
objc@protocol NIMChatManager <NSObject>
- (BOOL)fetchMessageAttachment:(NIMMessage *)message
                         error:(NSError **)error
@end                         

参数列表

参数 类型 说明
message NIMMessage 需要获取附件的消息
error NSError 抛出的错误对象

进行附件的下载,附件的下载过程会通过回调反馈。

  • 取消指定消息的下载:
objc@protocol NIMChatManager <NSObject>
- (void)cancelFetchingMessageAttachment:(NIMMessage *)message;
@end

附件包括:图片消息的图片缩略图,视频消息的视频缩略图,音频消息的音频文件,文件消息的文件和自定义消息中的自定义文件。

值得注意的是:

针对使用云信上传服务的图片,视频消息,上述方法下载的是缩略图和封面图片。若需要下载原视频、原图片,可以使用以下方法,传入附件对象的参数url与path来实现原文件的下载。

objc@protocol NIMResourceManager <NSObject>
/**
* @param urlString 下载的RL
* @param filepath  下载路径
* @param progress  进度Block
* @param completion 完成Block
*/
- (void)download:(NSString *)urlString 
        filepath:(NSString *)filepath 
        progress:(nullable NIMHttpProgressBlock)progress 
      completion:(nullable NIMDownloadCompleteBlock)completion;
@end                         

关于NIMResourceManager的更多方法,请参见客户端API文档。

聊天室接收消息

由于聊天室为消息量较大的场景,在接收消息时,SDK 为了防止过频回调,会在接受到消息包后等待一段时间,然后批量上报收到的消息。

在此同时,由于业务逻辑不一致导致界面处理不同,如果开发者仍然觉得消息插入过频导致界面卡顿,可以考虑在上层做一个待插入的消息池,同时创建专门用来计算排版的子线程。具体逻辑可以参考 Demo 的聊天室消息处理。

消息过滤

SDK提供消息过滤忽略的功能。消息过滤后,SDK将不存储对应的消息,也不会上抛给接收回调,因此应用层不会收到对应的消息。

消息过滤仅对在线消息、离线消息、漫游消息等有效。查询本地和云端历史记录是无法过滤的。

不建议在消息过滤函数或方法中进行耗时操作,否则将导致线程阻塞。

在初始化SDK时,创建一个NIMSDKConfigDelegate对象,实现下列方法,并将此对象赋值给NIMSDKConfig的delegate属性。

  • -(BOOL)shouldIgnoreNotification:(NIMNotificationObject *)notification方法,返回YES表示忽略某条通知消息。
  • -(BOOL)shouldIgnoreMessage:(NIMMessage *)message方法,返回YES表示忽略某条普通消息。

广播消息接收

网易云信支持全员广播消息,广播消息由服务端接口发起,对应用内的所有用户发送一条广播消息。客户端不支持发送, SDK 收到广播之后直接往上层通知,不支持客户端存储。

1秒内默认最多可调该接口10次。如需上调上限,请在官网首页通过微信、在线消息或电话等方式咨询商务人员。

接口原型

objc@protocol NIMBroadcastManager <NSObject>

/**
 *  添加广播消息委托
 *
 *  @param delegate 广播通知回调
 */
- (void)addDelegate:(id<NIMBroadcastManagerDelegate>)delegate;

/**
 *  移除广播消息委托
 *
 *  @param delegate 广播通知回调
 */
- (void)removeDelegate:(id<NIMBroadcastManagerDelegate>)delegate;

@end

参数列表

参数 类型 说明
delegate id 广播通知回调对象

回调原型

objc@protocol NIMBroadcastManagerDelegate <NSObject>

/**
 *  收到广播消息回调
 *
 *  @param broadcastMessage 广播消息
 */

- (void)onReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage;
@end

参数列表

参数 类型 说明
broadcastMessage NIMBroadcastMessage 广播消息

系统广播 NIMBroadcastMessage 原型

参数列表

参数 类型 说明
broadcastId int64_t 系统广播 id,全局唯一
sender NSString 发起者 id
timestamp NSTimeInterval 时间
content NSString 内容

示例

objc// 添加监听
- (void)addListener
{
   [[NIMSDK sharedSDK].broadcastManager addDelegate:self];
}

...

// 回调方法
- (void)onReceiveBroadcastMessage:(NIMBroadcastMessage *)broadcastMessage
{
    //do something with broadcast message
}

语音消息处理

针对语音消息,SDK 封装了录制与播放的方法供开发者使用。多媒体管理 NIMMediaManager 提供了音频播放、高清语音录制的功能。需要注意的是 NIM SDK 中的语音播放和录制仅支持 aac 和 amr,如果需要更多格式的支持,APP 需要自己实现,但并不推荐。

播放

播放音频

objc@protocol NIMMediaManager <NSObject>
/**
 *  播放音频文件
 *
 *  @discussion 开始播放,NIMMediaManagerDelegate中的playAudio:didBeganWithError:回调会被触发,播放完成后, NIMMediaManagerDelegate中的playAudio:didCompletedWithError:回调会被触发
 *  @param filepath 音频文件路径
 */
- (void)play:(NSString *)filepath;
@end
参数 类型 说明
filepath NSString 音频文件路径

其中 filePath 为音频文件的路径。

开始播放音频的回调

objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  开始播放音频的回调
 *
 *  @param filePath 音频文件路径
 *  @param error    错误信息
 */
- (void)playAudio:(NSString *)filePath didBeganWithError:(nullable NSError *)error;
@end

音频播放进度更新回调

objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  音频播放进度更新回调
 *
 *  @param filePath 音频文件路径
 *  @param value    播放进度 0.0 - 1.0
 */
- (void)playAudio:(NSString *)filePath progress:(float)value;
@end

音频播放完成的回调

当音频播放自然完成时,将走入以下回调:

objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  音频播放完成后的回调
 *
 *  @param filePath 音频文件路径
 *  @param error    错误信息
 */
- (void)playAudio:(NSString *)filePath didCompletedWithError:(NSError *)error
@end

参数列表

参数 类型 说明
filepath NSString 音频文件路径
error NSError 错误信息

主动停止音频播放回调

当主动停止音频播放时,将走入以下回调:

objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  音频播放完成后的回调
 *
 *  @param filePath 音频文件路径
 *  @param error    错误信息
 */
- (void)stopPlayAudio:(NSString *)filePath didCompletedWithError:(nullable NSError *)error;
@end

判断是否正在播放音频

objc@protocol NIMMediaManager <NSObject>
/**
 *  是否正在播放音频
 */
- (BOOL)isPlaying
@end

切换音频的输出设备

objc@protocol NIMMediaManager <NSObject>
/**
 *  切换音频输出设备
 *
 *  @param outputDevice 音频输出设备
 *
 *  @return 是否切换成功
 */
- (BOOL)switchAudioOutputDevice:(NIMAudioOutputDevice)outputDevice
@end

NIMAudioOutputDevice 列表

参数 说明
NIMAudioOutputDeviceReceiver 0 听筒
NIMAudioOutputDeviceSpeaker 1 扬声器

停止播放音频

objc@protocol NIMMediaManager <NSObject>
/**
 *  停止播放音频
 *
 */
- (void)stopPlay
@end

该操作会触发回调上文音频播放结束的回调。

贴耳传感器监听

objc@protocol NIMMediaManager <NSObject>
/**
 *  在播放声音的时候,如果手机贴近耳朵,是否需要自动切换成听筒播放
 *
 */
- (void)setNeedProximityMonitor:(BOOL)needProximityMonitor;
@end

录制

录制音频

objc@protocol NIMMediaManager <NSObject>
/**
 *  开始录制音频
 *  @param type 音频类型,aac或amr。
 *  @param duration 最长录音时间
 *  @discussion 开始录音,NIMMediaManagerDelegate中的recordAudio:didBeganWithError:回调会被触发,录音完成后, NIMMediaManagerDelgate中的recordAudio:didCompletedWithError:回调会被触发
 */
- (void)record:(NIMAudioType)type duration:(NSTimeInterval)duration;
@end

开始录制音频的回调

objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  开始录制音频的回调
 *
 *  @param filePath 录制的音频的文件路径
 *  @param error    错误信息
 *  @discussion 如果录音失败,filePath 有可能为 nil
 */
- (void)recordAudio:(NSString *)filePath didBeganWithError:(NSError *)error
@end

录制音频完成后的回调

当到录音时长达到设置的最大时长,或者手动停止录音会触发。

若录音时间过短,发送时可能会报 414(参数错误)错误,上传文件返回 IO 读写错误。因此建议录音至少录一秒。

objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  录制音频完成后的回调
 *
 *  @param filePath 录制完成的音频文件路径
 *  @param error    错误信息
 */
- (void)recordAudio:(NSString *)filePath didCompletedWithError:(NSError *)error
@end

音频录制进度更新回调

objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  音频录制进度更新回调
 *
 *  @param currentTime 当前录制的时间
 */
- (void)recordAudioProgress:(NSTimeInterval)currentTime
@end

其中 currentTime 为当前的录音时长,触发该回调的时间间隔可以通过以下属性设置,默认为 0.3 秒。

objc@protocol NIMMediaManager <NSObject>
/**
 *  录音进度更新间隔。如果值大于0,则会按照相应间隔调用recordAudioProgress:回调,默认值为0.3。
 */
@property (nonatomic, assign) NSTimeInterval recordProgressUpdateTimeInterval
@end

停止录制音频

objc@protocol NIMMediaManager <NSObject>
/**
 *  停止录制音频
 *
 *  @discussion 停止录音后NIMMediaManagerDelegate中的recordAudio:didCompletedWithError:回调会被触发
 */
- (void)stopRecord
@end

判断是否正在录制音频

objc@protocol NIMMediaManager <NSObject>
/**
 *  是否正在录音
 *
 */
- (BOOL)isRecording
@end

取消录音

objc@protocol NIMMediaManager <NSObject>
/**
 *  取消录制音频
 *
 */
- (void)cancelRecord
@end

录音被取消的回调

objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  录音被取消的回调
 */
- (void)recordAudioDidCancelled
@end

获取录音分贝

  • 获取录音峰值分贝
objc@protocol NIMMediaManager <NSObject>
/**
 *  获取录音峰值分贝
 *
 */
- (float)recordPeakPower
@end
  • 获取录音平均分贝
objc@protocol NIMMediaManager <NSObject>
/**
 *  获取录音平均分贝
 *
 */
- (float)recordAveragePower
@end

来电打断

  • 来电时会根据正在播放音频还是录音,分别触发
objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  播放音频开始被打断回调
 */
- (void)playAudioInterruptionBegin

/**
 *  录音开始被打断回调
 */
- (void)recordAudioInterruptionBegin
@end
  • 通话结束返回应用会分别触发
objc@protocol NIMMediaManagerDelegate <NSObject>
/**
 *  播放音频结束被打断回调
 */
- (void)playAudioInterruptionEnd

/**
 *  录音结束被打断回调
 */
- (void)recordAudioInterruptionEnd
@end

语音转文字

要使用语音转文字功能,请联系商务顾问申请开通「语音识别」。如果未开通功能的情况下调用接口,将返回403。

语音转文字的原理:

  • 录制音频文件(目前最大支持60秒)。
  • 上传到云信存储服务器,返回文件url。
  • 通过语音转文字接口传入该url和相关参数,返回转换后的文字。
objc@protocol NIMMediaManager <NSObject>
/**
 *  语音转文字
 *
 */
- (void)transAudioToText:(NIMAudioToTextOption *)option 
                  result:(NIMAudioToTextBlock)result;
@end

其中NIMAudioToTextOption各属性如下:

属性 含义
url 音频URL。目前只支持云信服务器的URL,不支持外链。
filepath 音频本地地址
此文档是否对你有帮助?
有帮助
去反馈
  • 消息接收
  • 通知类消息接收
  • 多媒体类消息接收
  • 聊天室接收消息
  • 消息过滤
  • 广播消息接收
  • 语音消息处理
  • 播放
  • 播放音频
  • 开始播放音频的回调
  • 音频播放进度更新回调
  • 音频播放完成的回调
  • 主动停止音频播放回调
  • 判断是否正在播放音频
  • 切换音频的输出设备
  • 停止播放音频
  • 贴耳传感器监听
  • 录制
  • 录制音频
  • 开始录制音频的回调
  • 录制音频完成后的回调
  • 音频录制进度更新回调
  • 停止录制音频
  • 判断是否正在录制音频
  • 取消录音
  • 录音被取消的回调
  • 获取录音分贝
  • 来电打断
  • 语音转文字