v2.0~2.1 升级指南
表情云商店SDK2.0~2.1到3.x版本升级指南-iOS
BQMM SDK
更名为DongtuStoreSDK
BQMM.bundle
更新为DongTuStoreSDK.bundle
- SDK头文件由
BQMM.h
变更为DongtuStoreSDK.h
- 主要管理类
MMEmotionCentre
变更为DongtuStore
- 表情展示控件由
MMImageView
变更为DTImageView
(2.1) - 移除了
BQMM_EXT
部分,这个变更涉及到表情消息的封装解析,具体参见下方指南 - gif模块封装到了SDK内部,移除
BQMM_GIF
部分,gif模块相关的设置代码全部删除 - 添加
libsqlite3.0.tbd
库
一、初始化
SDK3.x版本在被程序调用功能前,断言判断是否已经调用setUser接口设置了用户信息,如果没有会抛出异常。
二、表情键盘调起及隐藏
SDK v3.x与v2.0--2.1一致
三、消息封装
3.1 文字消息
- v2.0--2.1: 文字消息会被封装,将文字内容封装到消息的扩展中。
...
NSArray *textImgArray = inputView.textImgArray;
NSDictionary *extDic = @{TEXT_MESG_TYPE:TEXT_MESG_EMOJI_TYPE,
TEXT_MESG_DATA:[DTTextParser extDataWithTextImageArray:textImgArray]};
...
- v3.x: 无需封装,恢复纯文字消息的格式
3.2 大表情消息(DTEmoji)
大表情信息必须被封装到消息扩展中,才能在接收端解析展示
- v2.0--2.1: 借用了辅助类MMTextParser的方法
...
NSDictionary *extDic = @{TEXT_MESG_TYPE:TEXT_MESG_FACE_TYPE,
TEXT_MESG_DATA:[MMTextParser extDataWithEmoji:emoji]};
...
- v3.x: 去掉了辅助类,直接将表情信息进行格式封装
...
NSDictionary *extDic = @{TEXT_MESG_TYPE:TEXT_MESG_FACE_TYPE,
TEXT_MESG_DATA:@[@[emoji.emojiCode, @(2)]]};
...
3.3 gif消息(DTGif)
v2.0--2.1 和 v3.x的gif消息封装没有区别。
四、消息解析及展示
4.1 文字消息
4.1.1 显示大小的计算
- v2.0--2.1: 因为使用控件
MMTextView
展示,需要计算文字消息内容显示尺寸
...
size = [MMTextParser sizeForTextWithText:self.messageModel.messageContent
font:[UIFont systemFontOfSize:TEXT_MESSAGEFONT_SIZE]
maximumTextWidth:BUBBLE_MAX_WIDTH - (CONTENT_RIGHT_MARGIN + CONTENT_LEFT_MARGIN)];
...
- v3.x: 无需使用
MMTextParser
提供的方法计算尺寸,只需当做普通文字消息处理即可。
4.1.2 文字内容解析及展示
- v2.0--2.1: 展示控件为
MMTextView
...
//注意:展示控件为 MMTextView
[_textMessageView setMmTextData:extDic[TEXT_MESG_DATA]];
...
- v3.x: 展示控件变更使用
UITextView
...
_textMessageView.text = messageData.messageContent;
...
4.2 大表情消息
4.2.1 显示大小的计算
- v2.0--2.1: 尺寸大小固定
...
size = CGSizeMake(120, 120);
...
- v3.x: 需要使用
DTImageView
来展示大表情,并使用其方法来计算尺寸
...
size = [DTImageView sizeForImageSize:CGSizeMake(120, 120) imgMaxSize:CGSizeMake(120, 120)];
...
4.2.2 表情消息解析及展示
- v2.0: 展示表情消息使用的
UIImageView
,解析代码如下
...
NSDictionary *extDic = messageData.messageExtraInfo; //提取消息扩展信息
if (extDic != nil && [extDic[TEXT_MESG_TYPE] isEqualToString:TEXT_MESG_FACE_TYPE]) {
NSArray *codes = nil;
if (extDic[TEXT_MESG_DATA]) {
codes = @[extDic[TEXT_MESG_DATA][0][0]];
}
__weak typeof(self) weakself = self;
[[MMEmotionCentre defaultCentre] fetchEmojisByType:MMFetchTypeBig codes:codes completionHandler:^(NSArray *emojis) {
if (emojis.count > 0) {
MMEmoji *emoji = emojis[0];
if ([codes[0] isEqualToString:emoji.emojiCode]) {
//注意:之前展示控件为 UIImageView
weakself.pictureView.image = emoji.emojiImage;
}
}
else {
weakself.pictureView.image = [UIImage imageNamed:@"mm_emoji_error"];
}
}];
}
...
- v2.1: 展示表情消息使用的
MMImageView
,解析代码如下
NSDictionary *extDic = messageData.messageExtraInfo;
if (extDic != nil && [extDic[TEXT_MESG_TYPE] isEqualToString:TEXT_MESG_FACE_TYPE]) {
NSString *emojiCode = nil;
if (extDic[TEXT_MESG_DATA]) {
emojiCode = extDic[TEXT_MESG_DATA][0][0];
}
if (emojiCode != nil && emojiCode.length > 0) {
self.pictureView.errorImage = [UIImage imageNamed:@"mm_emoji_error"];
self.pictureView.image = [UIImage imageNamed:@"mm_emoji_loading"];
[self.pictureView setImageWithEmojiCode:emojiCode];
}else {
self.pictureView.image = [UIImage imageNamed:@"mm_emoji_error"];
}
}
- v3.x: 展示表情消息使用SDK内部封装控件
DTImageView
,消息解析及赋值代码如下
...
NSDictionary *extDic = messageData.messageExtraInfo;
if (extDic != nil && [extDic[TEXT_MESG_TYPE] isEqualToString:TEXT_MESG_FACE_TYPE]) {
NSArray *codes = nil;
if (extDic[TEXT_MESG_DATA]) {
codes = @[extDic[TEXT_MESG_DATA][0][0]];
}
if (codes.count > 0) {
NSString *emojiCode = codes.firstObject;
if (emojiCode != nil && emojiCode.length > 0) {
//注意:之后展示控件为 DTImageView
[self.pictureView setImageWithEmojiCode:emojiCode];
}else {
self.pictureView.image = errorImage;
}
}else {
self.pictureView.image = errorImage;
}
}
...
4.3 DTGif消息
4.3.1 显示大小的计算
- v2.0: 通过扩展信息中的尺寸信息手动计算
NSDictionary *extDic = message.messageExtraInfo;
NSDictionary *msgData = extDic[TEXT_MESG_DATA];
float height = [msgData[WEBSTICKER_HEIGHT] floatValue];
float width = [msgData[WEBSTICKER_WIDTH] floatValue];
if (width > MAX_WIDTH) {
height = MAX_WIDTH / width * height;
width = MAX_WIDTH;
}
size = CGSizeMake(width, height);
- v2.1: 使用的是
MMImageView
展示DTGif消息,也是用MMImageView
提供的方法计算尺寸
NSDictionary *extDic = message.messageExtraInfo;
NSDictionary *msgData = extDic[TEXT_MESG_DATA];
float height = [msgData[WEBSTICKER_HEIGHT] floatValue];
float width = [msgData[WEBSTICKER_WIDTH] floatValue];
size = [MMImageView sizeForImageSize:CGSizeMake(width, height) imgMaxSize:MAX_SIZE];
- v3.x: 需要使用
DTImageView
来展示DTGif消息,并使用其方法来计算尺寸
NSDictionary *extDic = message.messageExtraInfo;
NSDictionary *msgData = extDic[TEXT_MESG_DATA];
float height = [msgData[WEBSTICKER_HEIGHT] floatValue];
float width = [msgData[WEBSTICKER_WIDTH] floatValue];
size = [DTImageView sizeForImageSize:CGSizeMake(width, height) imgMaxSize:MAX_SIZE];
4.3.2 DTGif消息解析及展示
- v2.0: 展示DTGif消息使用的
UIImageView
,解析展示代码如下:
NSDictionary *extDic = messageData.messageExtraInfo;
if (extDic != nil && [extDic[TEXT_MESG_TYPE] isEqualToString:TEXT_MESG_WEB_TYPE]) {
NSDictionary *msgData = extDic[TEXT_MESG_DATA];
NSURL * url = [[NSURL alloc] initWithString:msgData[WEBSTICKER_URL]];
if (url != nil) {
__weak typeof(self) weakSelf = self;
[self.pictureView sd_setImageWithURL:url completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
if(error == nil && image) {
if (image.images.count > 1) {
weakSelf.pictureView.animationImages = image.images;
weakSelf.pictureView.image = image.images[0];
weakSelf.pictureView.animationDuration = image.duration;
[weakSelf.pictureView startAnimating];
}else{
weakSelf.pictureView.image = image;
}
}else{
weakSelf.pictureView.image = [UIImage imageNamed:@"mm_emoji_error"];
}
}];
}else {
self.pictureView.image = [UIImage imageNamed:@"mm_emoji_error"];
}
}
- v2.1: 展示DTGif消息使用的
MMImageView
,解析展示代码如下:
NSDictionary *extDic = messageData.messageExtraInfo;
if (extDic != nil && [extDic[TEXT_MESG_TYPE] isEqualToString:TEXT_MESG_WEB_TYPE]) {
self.pictureView.image = [UIImage imageNamed:@"mm_emoji_loading"];
self.pictureView.errorImage = [UIImage imageNamed:@"mm_emoji_error"];
NSDictionary *msgData = extDic[TEXT_MESG_DATA];
NSString *webStickerUrl = msgData[WEBSTICKER_URL];
NSString *webStickerId = msgData[WEBSTICKER_ID];
[self.pictureView setImageWithUrl:webStickerUrl gifId:webStickerId];
}
- v3.x: 展示DTGif消息使用的
DTImageView
,解析展示代码如下:
NSDictionary *extDic = messageData.messageExtraInfo;
if (extDic != nil && [extDic[TEXT_MESG_TYPE] isEqualToString:TEXT_MESG_WEB_TYPE]) {
NSDictionary *msgData = extDic[TEXT_MESG_DATA];
NSString *webStickerUrl = msgData[WEBSTICKER_URL];
NSString *gifId = msgData[WEBSTICKER_ID];
[_pictureView setImageWithDTUrl:webStickerUrl gifId:gifId];
}
五、消息版本兼容
文字消息
新版本处理老版本封装的文字消息时,只需要当做普通的文字消息处理即可。
DTEmoji消息
新版和旧版大表情DTEmoji
的emojiCode有区别,v3.x能够兼容v2.0--2.1的emojiCode,v2.0--2.1无法兼容v3.x的emojiCode,所以建议开发者进行消息封装和解析时,将新版本的大表情消息封装成新的消息类型,同时逻辑上让旧版本处理到这个新的消息类型时,认为是文字消息,或者未知消息,或可提示用户升级客户端。v3.x处理到v2.0--2.1的大表情消息时当成新定义的大表情消息处理,因为v3.x能够兼容v2.0--2.1的emojiCode。
DTGif消息
新版和旧版DTGif
的mainImage有区别,v3.x能够兼容v2.0--2.1的mainImage,v2.0--2.1无法兼容v3.x的mainImage,所以建议开发者进行消息封装和解析时,将新版本的DTGif消息封装成新的消息类型,同时逻辑上让旧版本处理到这个新的消息类型时,认为是文字消息,或者未知消息,或可提示用户升级客户端。v3.x处理到v2.0--2.1的DTGif消息时当成新定义的大表情消息处理,因为v3.x能够兼容v2.0--2.1的mainImage。
七、消息cell的点击
- v2.0: 需要根据消息cell中的内容跳转到相应的详情页面
- (void)didTapChatViewCell:(ChatMessage *)messageModel {
if(messageModel.messageType == MMMessageTypeBigEmoji){
NSDictionary *extDic = messageModel.messageExtraInfo;
if (extDic != nil && [extDic[TEXT_MESG_TYPE] isEqualToString:TEXT_MESG_FACE_TYPE]) {
UIViewController *emojiController = [[MMEmotionCentre defaultCentre] controllerForEmotionCode:extDic[TEXT_MESG_DATA][0][0]];
[self.navigationController pushViewController:emojiController animated:YES];
}
}
}
v2.1: 表情消息和gif消息都封装在了
MMImageView
中,MMImageView
已经处理了点击事件,所以无需再处理cell的点击事件。v3.x: 表情消息和gif消息都封装在了
DTImageView
中,DTImageView
已经处理了点击事件,所以无需再处理cell的点击事件。
八、表情联想接口
v3.x添加了表情联想功能,调用一下接口开启:
- (void)shouldShowSearchPopupAboveView:(nonnull UIView *)attachedView
withInput:(nonnull UIResponder <UITextInput> *)input;
九、表情收藏
3.x新增了表情收藏功能,通过以下接口app可以完整的实现表情收藏功能
查看表情是否已经被收藏通过以下接口实现
//查看DTEmoji是否已经被收藏
-(BOOL)hasCollectedDTEmojiWithEmojiCode:(NSString *_Nonnull)emojiCode;
//查看DTGif是否已经被收藏
-(BOOL)hasCollectedDTGifWithGifUrl:(NSString *_Nonnull)gifUrl andGifId:(NSString *_Nonnull)gifId;
收藏表情通过以下接口实现
//收藏DTEmoji表情
-(void)collectDTEmojiWithEmojiCode:(NSString *_Nonnull)emojiCode
completionHandler:(void (^_Nonnull)(BOOL result, DTError * _Nullable error))completionHandler;
//收藏DTGif表情
-(void)collectDTGifWithGifUrl:(NSString *_Nonnull)gifUrl andGifId:(NSString *_Nonnull)gifId
completionHandler:(void (^_Nonnull)(BOOL result, DTError * _Nullable error))completionHandler;
取消收藏表情通过以下接口实现
//取消收藏DTEmoji表情
-(void)uncollectDTEmojiWithEmojiCode:(NSString *_Nonnull)emojiCode
completionHandler:(void (^_Nonnull)(BOOL result, DTError * _Nullable error))completionHandler;
//取消收藏DTGif表情
-(void)uncollectDTGifWithGifUrl:(NSString *_Nonnull)gifUrl andGifId:(NSString *_Nonnull)gifId
completionHandler:(void (^_Nonnull)(BOOL result, DTError * _Nullable error))completionHandler;
十、其他
v2.0--2.1 需要在app显示到前台时调用 clearSession
接口,v3.x改成在内部处理了,所以不需要调用 clearSession
接口了。
十一、pod方式
在终端中运行以下命令:
pod search DongtuStore
如果运行以上命令,没有搜到SDK,或者搜不到最新的 SDK 版本,您可以运行以下命令,更新您本地的 CocoaPods 源列表。
pod repo update
Podfile文件中删除 pod 'BQMM', '2.1'
, 添加 pod 'DongtuStore', '~> 3.x'
此处3.x替换成最新版本号
然后在工程的根目录下运行以下命令:
pod install