NIMCustomObject.h 3.62 KB
//
//  NIMCustomObject.h
//  NIMLib
//
//  Created by Netease.
//  Copyright (c) 2015年 Netease. All rights reserved.
//

#import "NIMMessageObjectProtocol.h"

NS_ASSUME_NONNULL_BEGIN
/*
 除了 SDK 预定义的几种消息类型,上层APP开发者如果想要实现更多的消息类型,不可避免需要使用自定义消息这种类型
 由于 SDK 并不能预测上层 APP 的应用场景,所以 NIMCustomObject 采取消息透传的方式以提供给上层开发者最大的自由度
 即 SDK 只负责发送和收取由 NIMCustomObject 中 id<NIMCustomAttachment> attachment 序列化和反序列化后的字节流
 在发送端,SDK 获取 encodeAttachment 后得到的字节流发送至对面端
 在接收端,SDK 读取字节流,并通过上层 APP 设置的反序列化对象进行解析 (registerCustomDecoder:)

文件上传:
 为了方便 APP 在自定义消息类型中进行文件的上传,SDK 也提供了三个接口文件上传
 即只要 APP 实现上传相关的接口,资源的上传就可以由 SDK 自动完成
 如需要上传资源需要实现的接口有:
 1. - (BOOL)attachmentNeedsUpload  是否有文件需要上传,在有文件且文件没有上传成功时返回YES
 2. - (NSString *)attachmentPathForUploading  返回需要上传的文件路径
 3. - (void)updateAttachmentURL:(NSString *)urlString 上传成功后SDK会调用这个接口,APP 需要实现这个接口来保存上传后的URL
 具体可以参考 DEMO 中阅后即焚的实现
 
 */



/**
 *  自定义消息对象附件协议
 */
@protocol NIMCustomAttachment <NSObject>
@required

/**
 *  序列化attachment
 *
 *  @return 序列化后的结果,将用于透传
 */
- (NSString *)encodeAttachment;

@optional
#pragma mark - 上传相关接口
/**
 *  是否需要上传附件
 *
 *  @return 是否需要上传附件
 */
- (BOOL)attachmentNeedsUpload;

/**
 *  需要上传的附件路径
 *
 *  @return 路径
 */
- (NSString *)attachmentPathForUploading;

/**
 *  更新附件URL
 *
 *  @param urlString 附件url
 */
- (void)updateAttachmentURL:(NSString *)urlString;

#pragma mark - 下载相关接口
/**
 *  是否需要下载附件
 *
 *  @return 是否需要上传附件
 */
- (BOOL)attachmentNeedsDownload;

/**
 *  需要下载的附件url
 *
 *  @return 附件url
 *  @discussion 如果当前字段是云信的 http url 地址,那么需要调用 id<NIMResourceManager> 中 normalizeURLString: 方法将这个地址进行转 https 和 cdn 加速格式
 */
- (NSString *)attachmentURLStringForDownloading;

/**
 *  需要下载的附件本地路径
 *
 *  @return 附件本地路径
 *  @discussion 上层需要保证路径的
 */
- (NSString *)attachmentPathForDownloading;

@end



/**
 *  自定义消息对象附件序列化协议
 */
@protocol NIMCustomAttachmentCoding<NSObject>
@required

/**
 *  反序列化
 *
 *  @param content 透传的自定义消息
 *
 *  @return 自定义消息附件
 */
- (nullable id<NIMCustomAttachment>)decodeAttachment:(nullable NSString *)content;
@end


/**
 *  用户自定义消息对象
 */
@interface NIMCustomObject : NSObject<NIMMessageObject>

/**
 *  用户自定义附件
 *  @discussion SDK负责将attachment通过encodeAttachment接口序列化后的结果进行透传
 */
@property(nullable, nonatomic, strong) id<NIMCustomAttachment>  attachment;


/**
 *  注册自定义消息解析器
 *
 *  @param decoder 自定义消息解析器
 *  @disucssion 如果用户使用自定义消息类型,就需要注册自定义消息解析器,负责将透传过来的自定义消息反序列化成上层应用可识别的对象
 */
+ (void)registerCustomDecoder:(id<NIMCustomAttachmentCoding>)decoder;

@end


NS_ASSUME_NONNULL_END