v1.x 升级指南
优质
小牛编辑
131浏览
2023-12-01
表情云商店SDK1.x到3.x版本升级指南-iOS
BQMM SDK
更名为DongtuStoreSDK
BQMM.bundle
更新为DongTuStoreSDK.bundle
- SDK头文件由
BQMM.h
变更为DongtuStoreSDK.h
- 主要管理类
MMEmotionCentre
变更为DongtuStore
- 移除了
BQMM_EXT
部分,这个变更涉及到表情消息的封装解析,具体参见下方指南 - 添加
libsqlite3.0.tbd
库
一、初始化
SDK3.x版本在被程序调用功能前,断言判断是否已经调用setUser接口设置了用户信息,如果没有会抛出异常。
二、表情键盘调起及隐藏
SDK v3.x与v1.x一致
三、消息封装
3.1 文字消息
- v1.x: 文字消息会被封装,将文字内容封装到消息的扩展中。
...
NSArray *textImgArray = inputView.textImgArray;
NSDictionary *extDic = @{TEXT_MESG_TYPE:TEXT_MESG_EMOJI_TYPE,
TEXT_MESG_DATA:[DTTextParser extDataWithTextImageArray:textImgArray]};
...
- v3.x: 无需封装,恢复纯文字消息的格式
3.2 大表情消息(DTEmoji)
大表情信息必须被封装到消息扩展中,才能在接收端解析展示
- v1.x: 借用了辅助类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)]]};
...
四、消息解析及展示
4.1 文字消息
4.1.1 显示大小的计算
- v1.x: 因为使用控件
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 文字内容解析及展示
- v1.x: 展示控件为
MMTextView
...
//注意:展示控件为 MMTextView
[_textMessageView setMmTextData:extDic[TEXT_MESG_DATA]];
...
- v3.x: 展示控件变更使用
UITextView
...
_textMessageView.text = messageData.messageContent;
...
4.2 大表情消息
4.2.1 显示大小的计算
- v1.x: 尺寸大小固定
...
size = CGSizeMake(120, 120);
...
- v3.x: 需要使用
DTImageView
来展示大表情,并使用其方法来计算尺寸
...
size = [DTImageView sizeForImageSize:CGSizeMake(120, 120) imgMaxSize:CGSizeMake(120, 120)];
...
4.2.2 表情消息解析及展示
- v1.x: 展示表情消息使用的
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"];
}
}];
}
...
- 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;
}
}
...
五、消息版本兼容
文字消息
新版本处理老版本封装的文字消息时,只需要当做普通的文字消息处理即可。
DTEmoji消息
新版和旧版大表情DTEmoji
的emojiCode有区别,v3.x能够兼容v1.x的emojiCode,v1.x无法兼容v3.x的emojiCode,所以建议开发者进行消息封装和解析时,将新版本的大表情消息封装成新的消息类型,同时逻辑上让旧版本处理到这个新的消息类型时,认为是文字消息,或者未知消息,或可提示用户升级客户端。v3.x处理到v1.x的大表情消息时当成新定义的大表情消息处理,因为v3.x能够兼容v1.x的emojiCode。
六、动图表情DTGif
消息相关
之前版本没有DTGif
, 新版本引入了DTGif
, 相关功能可查看集成指南。
七、消息cell的点击
- v1.x: 需要根据消息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];
}
}
}
- v3.x: 表情消息和gif消息都封装在了
DTImageView
中,DTImageView
已经处理了点击事件,所以无需再处理cell的点击事件。
八、表情联想接口
表情联想接口名称稍有变动
- v1.x:
- (void)shouldShowShotcutPopoverAboveView:(nonnull UIView *)attchedView
withInput:(nonnull UIResponder<UITextInput> *)input;
- 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;
十、其他
v1.x 需要在app显示到前台时调用 clearSession
接口,v3.0改成在内部处理了,所以不需要调用 clearSession
接口了。
十一、pod方式
在终端中运行以下命令:
pod search DongtuStore
如果运行以上命令,没有搜到SDK,或者搜不到最新的 SDK 版本,您可以运行以下命令,更新您本地的 CocoaPods 源列表。
pod repo update
Podfile文件中删除 pod 'BQMM', '1.7.16'
, 添加 pod 'DongtuStore', '~> 3.x'
此处3.x替换成最新版本号
然后在工程的根目录下运行以下命令:
pod install