消息接收
更新时间: 2024/08/20 15:45:46
消息发送等相关说明请查看消息发送。
消息接收
接收到消息会通过 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默认会在收到消息时,自动下载原音频。
- 如果收到的是文件消息,不会下载原文件。
若要关闭默认策略,自主选择下载时机,可以使用以下方法来完成:
- 关闭自动下载:
设置NIMSDKConfig
的fetchAttachmentAutomaticallyAfterReceiving
和fetchAttachmentAutomaticallyAfterReceivingInChatroom
为NO
。
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 | 音频本地地址 |