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