你可以使用声网 RTM SDK 发送和接收图片或文件消息。
声网 RTM SDK 支持发送大小不超过 30 MB 的任意文件格式的非空图片或文件。每份上传到声网服务器的图片或文件都对应一个 media ID,在服务端保存 7 天。你可以通过 media ID 在 7 天有效期内从声网服务器下载对应的图片或文件。
文件或图片的数据流转过程如下:
你可以通过 AgoraRtmImageMessage
对象对图片进行以下操作:
你可以通过 AgoraRtmFileMessage
对象对文件进行以下操作:
声网 RTM SDK 引入了 AgoraRtmImageMessage
接口类和 AgoraRtmFileMessage
接口类用于保存和传递系统生成的 media ID。AgoraRtmImageMessage
接口类和 AgoraRtmFileMessage
接口类继承自 AgoraRtmMessage
接口类,所以你可以通过已有的点对点消息或频道消息发送方法传递 AgoraRtmImageMessage
实例和 AgoraRtmFileMessage
实例,从而实现图片或文件消息的发送和接收。
一般情况下的发送和接收图片消息流程如下:
上传图片到声网服务器。图片上传成功时,SDK 会通过回调返回一个 AgoraRtmImageMessage
实例。
上传图片到声网服务器:
[AgoraRtm.kit createImageMessageByUploading:imagePath withRequest:&requestId completion:^(long long requestId, AgoraRtmImageMessage *message, AgoraRtmUploadMediaErrorCode errorCode) {
//deal with message
}];
如果你存有一个已上传图片对应的 media ID 且 media ID 仍然处于 7 天有效期内,可通过如下代码直接创建一个 AgoraRtmImageMessage
实例:
[AgoraRtm.kit createImageMessageByMediaId:mediaId];
(可选)通过获取的实例设置图片的长宽或缩略图。
设置图片长宽:
[message setWidth:imageWidth];
[message setHeight:imageHeight];
设置图片缩略图:
message.thumbnailWidth = thumbnailImage.size.width;
message.thumbnailHeight = thumbnailImage.size.height;
将 IImageMessage
实例通过点对点消息或频道消息的方式发送给指定用户或指定频道。
发送图片点对点消息:
[AgoraRtm.kit sendMessage:rtmMessage toPeer:self.mode.name sendMessageOptions:option completion:^(AgoraRtmSendPeerMessageErrorCode errorCode) {}];
发送图片频道消息:
[self.rtmChannel sendMessage:rtmMessage completion:^(AgoraRtmSendChannelMessageErrorCode errorCode) {}];
收到图片消息的用户会收到相应回调,你可以通过获取 AgoraRtmImageMessage
实例携带的 media ID 信息并通过 media ID 将相应图片保存至本地。
接收图片点对点消息:
- (void)rtmKit:(AgoraRtmKit *)kit imageMessageReceived:(AgoraRtmImageMessage *)message fromPeer:(NSString *)peerId {
//deal with message
}
接收图片频道消息:
- (void)channel:(AgoraRtmChannel *)channel imageMessageReceived:(AgoraRtmImageMessage *)message fromMember:(AgoraRtmMember *)member {
//deal with message
}
一般情况下,你可以通过 media ID 直接将图片下载至本地存储:
[AgoraRtm.kit downloadMedia:message.mediaId toFile:filePath withRequest:&requestId completion:^(long long requestId, AgoraRtmDownloadMediaErrorCode errorCode) {}];
对于需要快速存取已下载图片的场景,你可以将图片下载至本地内存:
[AgoraRtm.kit downloadMediaToMemory:message.mediaId withRequest:&requestId completion:^(long long requestId, NSData *data, AgoraRtmDownloadMediaErrorCode errorCode) {}];
如果你要取消上传或下载图片,参考以下示例代码:
[AgoraRtm.kit cancelMediaUpload:&requestId completion:^(long long requestId, AgoraRtmCancelMediaErrorCode errorCode) {}];
[AgoraRtm.kit cancelMediaDownload:&requestId completion:^(long long requestId, AgoraRtmCancelMediaErrorCode errorCode) {}];
一般情况下的发送和接收文件消息流程如下:
上传文件到声网服务器。文件上传成功时,SDK 会通过回调返回一个 AgoraRtmFileMessage
实例。
上传文件到声网服务器:
[AgoraRtm.kit createFileMessageByUploading:filePath withRequest:&requestId completion:^(long long requestId, AgoraRtmFileMessage *message, AgoraRtmUploadMediaErrorCode errorCode) {
//deal with message
}];
如果你存有一个已上传文件对应的 media ID 且 media ID 仍然处于 7 天有效期内,可通过如下代码直接创建一个 AgoraRtmFileMessage
实例:
[AgoraRtm.kit createFileMessageByMediaId:mediaId];
(可选)通过获取的实例设置文件的缩略图。
UIImage *thumbnailImage = [weakSelf generateThumbnail:imagePath toByte:5 * 1024];
if(thumbnailImage != nil) {
message.thumbnail = imageData;
}
将 AgoraRtmFileMessage
实例通过点对点消息或频道消息的方式发送给指定用户或指定频道。
发送文件点对点消息:
[AgoraRtm.kit sendMessage:rtmMessage toPeer:self.mode.name sendMessageOptions:option completion:^(AgoraRtmSendPeerMessageErrorCode errorCode) {}];
发送文件频道消息:
[self.rtmChannel sendMessage:rtmMessage completion:^(AgoraRtmSendChannelMessageErrorCode errorCode) {}];
收到文件消息的用户会收到相应回调,你可以通过获取 AgoraRtmFileMessage
实例携带的 media ID 信息并通过 media ID 将相应文件保存至本地。
接收文件点对点消息:
- (void)rtmKit:(AgoraRtmKit *)kit fileMessageReceived:(AgoraRtmFileMessage *)message fromPeer:(NSString *)peerId {
//deal with message
}
接收文件频道消息:
- (void)channel:(AgoraRtmChannel *)channel fileMessageReceived:(AgoraRtmFileMessage *)message fromMember:(AgoraRtmMember *)member {
//deal with message
}
一般情况下,你可以通过 media ID 直接将文件下载至本地存储:
[AgoraRtm.kit downloadMedia:message.mediaId toFile:filePath withRequest:&requestId completion:^(long long requestId, AgoraRtmDownloadMediaErrorCode errorCode) {}];
对于需要快速存取已下载文件的场景,你可以将文件下载至本地内存:
[AgoraRtm.kit downloadMediaToMemory:message.mediaId withRequest:&requestId completion:^(long long requestId, NSData *data, AgoraRtmDownloadMediaErrorCode errorCode) {}];
如果你要取消上传或下载文件,参考以下示例代码:
[AgoraRtm.kit cancelMediaUpload:&requestId completion:^(long long requestId, AgoraRtmCancelMediaErrorCode errorCode) {}];
[AgoraRtm.kit cancelMediaDownload:&requestId completion:^(long long requestId, AgoraRtmCancelMediaErrorCode errorCode) {}];
filePath
参数必须是 UTF-8 编码格式字符串,而且必须是绝对路径。AgoraRtmDownloadMediaToMemoryBlock
回调结束后访问相应内存地址。AgoraRtmImageMessage
自行设置上传图片的宽和高。设置内容只作为上传图片的附加属性存在,不影响上传图片本身内容。SDK 也不会对上传图片进行裁剪或缩放。createFileMessageByUploading:withRequest:completion:
createImageMessageByUploading:withRequest:completion:
cancelMediaUpload:completion:
cancelMediaDownload:completion:
createFileMessageByMediaId:
createImageMessageByMediaId:
downloadMediaToMemory:withRequest:completion:
downloadMedia:toFile:withRequest:completion:
rtmKit:media:uploadingProgress:
rtmKit:media:downloadingProgress:
AgoraRtmUploadFileMediaBlock
AgoraRtmUploadImageMediaBlock
AgoraRtmCancelMediaBlock
AgoraRtmDownloadMediaToMemoryBlock
AgoraRtmDownloadMediaToFileBlock
rtmKit:fileMessageReceived:fromPeer:
rtmKit:imageMessageReceived:fromPeer:
channel:fileMessageReceived:fromMember:
channel:imageMessageReceived:fromMember: