IM

一、IM插件的介绍及导入

1.1、IM插件的介绍及结构

1.1.1、插件介绍

IM插件为用户开发 IM 相关的应用提供的一套完善的开发框架,将IM基础能力和界面集成到静态库中,方便用户快速高效的集成IM通讯能力,用户可以基于我们提供的IM插件实现自己的应用,也可以基于Demo开发。IM插件需要iOS8.0或更高版本,支持模拟器运行,支持推送。

1.1.2、插件结构

1.1.3、IM插件主要头文件

AppModel.h: 里面有登录/登出方法,获取聊天未读消息数;
Chat.h:里边的方法是主调方法,其中有:根据账号获取聊天界面,根据传入群成员信息开始群聊,根据选择的联系人进行转发并进入聊天界面,获取会话列表界面;
AppModelDelegate.h:该类里边的代理回调方法有:设置登录人与联系人信息,设置选择联系人界面,设置联系人详情界面,定制聊天界面“+”号功能,定制会话列表界面右上角“+”号功能,聊天界面图文分享。
ChatSetting.h:里边的方法是聊天设置相关的方法,其中有:设置、获取新消息提示开关状态,设置、获取声音提示新消息开关状态,设置、获取震动提示新消息开关状态,设置、获取听筒/扬声器接听语音消息状态,清除所有聊天记录;

1.1.4、需导入第三方库

第三方库采用cocoapods管理,集成cocoapods:
需要集成如下框架,或者下载下来直接拖入您的工程中
pod 'AFNetworking','~>3.1.0':网络请求库
pod 'FMDB':第三方数据库
pod 'GTMBase64': 编解码第三方库
pod 'RegexKitLite': 正则表达式库
pod 'SDWebImage': 图片处理库
pod 'MBProgressHUD': 用于提示加载刷新
pod 'SVPullToRefresh': 用于页面刷新
pod 'ReactiveCocoa','~>2.5': 信号第三方框架
 
Demo中用到的第三方库:UMSocial_Sdk_4.3:用来做分享的友盟的库,Masonry:代码布局的第三方库,如果开发者不用或者已有别的版本的库不要复制到自己的项目中。
注意:在集成第三方框架完成之后,请将Pods的Build Active Architecture Only设置为No,如下图所示:
 

1.2、集成IM插件

1.2.1、导入IM插件

第1步:先解压对应的IM插件压缩包,解压之后目录如图所示例:
第2步:然后导入IM插件。将解压后的文件夹拖入您的工程中,并勾选上Destination,如图所示:提示说明(将lib文件夹导入项目中)
 

1.2.2、设置工程属性

向Build Phases -> Link Binary With Libraries 中添加系统依赖库,操作步骤如下所示:
 
按照上图,点击加号后,在搜索框中输入需要的依赖库名称,点击Add添加依赖库成功(Xcode7.0以上尾缀是.tbd)。
IM插件需要添加系统依赖库如下:
 
注:添加完以上的依赖库后,还需要通过Add Other方式添加IM插件的.a文件,如下图:
  
添加完依赖库之后,第一步即完成,可以进行下一步了。
编译设置:
因为插件采用的是C、C++代码编写且对语言版本有一定要求,所以需要进行编译设置:
1.如图使用系统默认或选择stdlibc++模式编译:
 
2.在第一次调用的地方,如demo中,更改AppDelegate.m文件的后缀为.mm,如果不设置这两项,编译时出现std::编译错误。
3.IM插件暂不支持bitcode,Xcode7之后创建的工程需要关闭bitcode设置。
 
4.需要在Other Link Flags 加上-ObjC字段,否则会编译错误。
 

1.2.3、适配iOS 10注意事项

1、iOS 10在使用摄像头、麦克风、定位、相册等功能的时候,会检查相应权限。用户需要手动在项目的info.plist文件中添加相应权限,如下图所示:
 
 
 
如未手动添加权限时,会报如下错误:
 
2、对于iOS 10而言,需将Capabilities -> Push Notifications 开启,   
如图所示:
 
开启后会生成如下图所示文件:
注意:如不开启改选项,会出现无法获取deviceToken, 老项目可能会出现deviceToken无效的情况。

1.2.4、编译工程

以上步骤进行完后,编译工程。如果没有报错,恭喜你,集成 IM插件成功,可以进行下一步了。
 

二、插件配置

2.1、服务器配置

在导入插件后,进入ServerAddr.xml和ServerAddr_SandBox.xml文件中配置ip地址和端口号。
ip地址和端口号请联系我们的商务人员,由我们的商务人员提供。
注意:公有云和专有云不需要设置。
  

2.2、IM 代理方法

(你需要在2.2.1.1和2.2.1.2的代理方法中传入个人信息数据,需要在 3.1.2.1和3.1.2.2中传入对应的界面)
指定代理:
  •  [AppModel sharedInstance].appModelDelegate = self;

2.2.1、必须实现的回调方法

2.2.1.1、设置当前登录人信息

设置登录人个人信息,实现这个代理方法后,那在插件中涉及到登录人信息的地方,IM插件就会自动调用它。
插件里使用的信息对应字段如下:账号—@"account",手机号—@"mobile",名字—@"member_name",头像地址—@"avatar"
Demo中代码示例:(demo中IMChatViewController.m第348-359行)
  •  -(NSDictionary*)onGetUserInfo {
  •  NSMutableDictionary *dic = [NSMutableDictionary dictionary];
  •  //账号
  •  [dic setObject:self.accountName forKey:@"account"];
  •  //手机号
  •  [dic setObject:self.accountName forKey:@"mobile"];
  •  //姓名
  • [dic setObject:self.accountName forKey:@"member_name"];
  •  //头像路径
  • [dic setObject: @" " forKey:@"avatar"];
  •  return dic;
  • }

2.2.1.2、设置联系人信息

设置联系人信息,实现这个代理方法后,那在插件中涉及到联系人信息的地方,IM插件就会自动调用它。
插件里使用的信息对应字段如下:账号—@"account",手机号—@"mobile",名字—@"member_name",头像地址—@"avatar"
建议:您可以在这个方法里根据id去通讯录里查询个人信息,然后把查询到的信息设置给插件。
Demo中代码示例:(demo中IMChatViewController.m第367-378行)
  •  /*
  •  @brief 获取联系人信息
  •  @param id 联系人的信息
  •  @param type 0:根据account获取,1:根据手机号获取 ,目前只使用0
  •  */
  • -(NSDictionary*)getDicWithId:(NSString*)Id withType:(int) type;
 
具体方法实现的代码示例:
  • -(NSDictionary*)getDicWithId:(NSString*)Id withType:(int) type{
  •  NSMutableDictionary *dic = [NSMutableDictionary dictionary];
  •  //账号
  •  [dic setObject:Id forKey:@"account"];
  •  //手机号
  •  [dic setObject:Id forKey:@"mobile"];
  •  //姓名
  • [dic setObject:Id forKey:@"member_name"];
  •  //头像路径
  • [dic setObject: @" " forKey:@"avatar"];
  •  return dic;
  • }

2.2.2、可选实现的回调方法

开发者可以根据需求,来确定是否实现这些可选的回调方法。

2.2.2.1、设置选择联系人界面

1.应用场景:
• 当你需要添加联系人,比如demo中在聊天详情界面触发添加按钮时、或者创建群组时、在已有群组中加入新成员时,
• 要进入选择联系人界面时,比如在聊天界面转发消息
点击添加按钮场景如下图:
 
 
在聊天界面长按消息,会出现转发消息按钮,如下图:
 
建议:
•在这个方法里返回去通讯录选人的界面,当选人完毕之后,请调用chat.h中的getChatViewControllerWithData: completion: failed:方法,详见文档3.2.4。
•请将参数exceptData和type参数传入您的选择联系人界面中.
  • /*
  •  @brief 选择联系人界面
  •  @param exceptData 需要传进选择联系人界面的数据, @"members":单聊再选人时原有人组成的数
  •  组,@"msg":转发的消息,@"groupId":群聊再选人的groupId
  •  @param type 根据选人的不同情形选择类型, SelectObjectType在KitBaseHeader.h中
  •  @return 选择联系人界面
  •  */
  • -(UIViewController *)getChooseMembersVCWithExceptData:(NSDictionary *)exceptData WithType:(SelectObjectType)type;
2. 代码示例
在指定代理的类中实现该方法,该方法用于进入选择联系人的界面,exceptData是传进选择联系人界面的数据。
Demo中代码示例:(demo中IMChatViewController.m第386-390行)
  •  -(UIViewController *)getChooseMembersVCWithExceptData:(NSDictionary *)exceptData WithType:(SelectObjectType)type {
  •  IMChooseMembersViewController *chooseMembersVC = [[IMChooseMembersViewController alloc] init];
  • chooseMembersVC.exceptData = exceptData;
  • chooseMembersVC.type = type;
  •  return chooseMembersVC;

2.2.2.2、设置联系人详情界面

1.应用场景:
• 通过一个联系人的账号,可以进入该联系人的详情界面
• 在聊天界面点击头像时可以进入联系人的详情界面
如图:
 
建议:请根据传出的data(字符串类型,联系人的账号)去定制联系人详情界面,然后在这个方法里返回。
  •  /*
  •  @brief 联系人详情界面
  •  @param data:联系人账号(字符串类型,联系人的账号)
  •  @return 详情界面
  •  */
  • -(UIViewController *)getContactorInfosVCWithData:(id)data; 
2.代码示例
在指定代理的类中实现方法,该方法用于进入联系人详情界面
Demo中代码示例:(demo中IMChatViewController.m第397-403行)
  •  -(UIViewController *)getContactorInfosVCWithData:(id)data {
  •  if ([data isKindOfClass:[NSString class]]) {
  •  IMContactorInfosViewController *contactorInfosVC = [[IMContactorInfosViewController alloc] initWithAccount:(NSString *)data];
  •  return contactorInfosVC;
  •  }
  •  return nil;
  • }

2.2.2.3、聊天界面“+”号功能列表定制

1.应用场景:
• 聊天界面中,点击底部“+”出现功能面板,其上的功能可以自己定制
•  如果您不实现这个协议方法,IM插件会走默认的方法,您可以根据自己的需求来定制功能
•  默认的群聊功能有: 图片、小视频、发送文件、发送图文、位置
•  默认的单聊功能有: 图片、小视频、发送文件、发送图文、位置、阅后即焚
 
效果如图:
 
  • /*
  •  @brief 定制聊天界面点击加号后的功能
  •  @param isGroup:是群组界面还是点对点界面
  •  @param members:群聊是群成员id,单聊是对方的id
  •  @param myImagesArr:图片数组 ,myTextArr:标题数组,mySelectorArr:点击事件数组
  •  @param completion(myImagesArr, myTextArr, mySelectorArr);
  •  */
  • - (void) )getChatMoreArrayWithIsGroup:(BOOL)isGroup andMembers:(NSArray *)members completion:(void(^)(NSArray *myImagesArr,NSArray *myTextArr,NSArray *mySelectorArr))completion;
2. 代码示例
在指定代理的类中实现方法,该方法用于定制聊天界面”+"号功能
demo中的实现效果就是默认的,您可以根据myImagesArr、textArr、selectorArr三个参数来定制功能
Demo中代码示例:(demo中IMChatViewController.m第412-429行)
  • - (void)getChatMoreArrayWithIsGroup:(BOOL)isGroup andMembers:(NSArray *)members completion:(void(^)(NSArray *myImagesArr,NSArray *myTextArr,NSArray *mySelectorArr))completion {
  •  
  •  NSArray *imagesArr;
  •  NSArray *textArr;
  •  NSArray *selectorArr;
  •  if(isGroup)
  •  {
  •  imagesArr = @[@"im_icon_images",@"im_icon_camera",@"file",@"pic_txt",@"position"];
  •  textArr = @[@"图片",@"小视频",@"发送文件",@"发送图文",@"位置];
  •  selectorArr = @[@"pictureBtnTap:",@"littleVideoBtnTap:",@"document_collaborationBtnTap:",@"pictureWhithTextBtnTap:",@"locationBtnTap:" ];
  •  }else
  •  {
  •  imagesArr = @[@"im_icon_images",@"im_icon_camera",@"file",@"pic_txt",@"position",@"im_icon_burn"];
  •  textArr = @[@"图片",@"小视频",@"发送文件",@"发送图文",@"位置",@"阅后即焚"];
  •  selectorArr = @[@"pictureBtnTap:",@"littleVideoBtnTap:",@"document_collaborationBtnTap:",@"pictureWhithTextBtnTap:",@"locationBtnTap:",@"burnAfterReadBtnTap:"];
  •  }
  •  completion(imagesArr,textArr,selectorArr);
  • }

2.2.2.4、会话列表界面右上角“+”号功能列表定制

1.应用场景:
• 会话列表界面中,点击右上角“+”出现功能面板,其上的功能可以自己定制
•  如果不实现这个协议方法,IM插件会走默认的方法,开发者可以根据自己的需求来定制功能
•  默认的功能有: 发起群聊
 
效果如图:
 
 
  • /*
  •  @brief 定制会话列表界面点击右上角加号后的功能
  •  @param currentVC:当前的会话列表界面
  •  @param myImagesArr:图片数组 ,myTextArr:标题数组,mySelectorArr:点击事件数组
  •  @param completion(myImagesArr, myTextArr, mySelectorArr);
  •  */
  • - (void)getSessionMoreArrayWithCurrentVc:(UIViewController *)currentVC completion:(void(^)(NSArray *myImagesArr,NSArray *myTextArr,NSArray *mySelectorArr))completion;
2. 代码示例
在指定代理的类中实现方法,该方法用于定制会话列表界面右上角”+"号功能
demo中的实现效果就是默认的,开发者可以根据myImagesArr、textArr、selectorArr三个参数来定制功能
Demo中代码示例:(demo中IMChatViewController.m第437-442行)
  •  - (void)getSessionMoreArrayWithCurrentVc:(UIViewController *)currentVC completion:(void(^)(NSArray *myImagesArr,NSArray *myTextArr,NSArray *mySelectorArr))completion {
  •  NSArray *imagesArr = @[@"bomb_box_icon_01.png"];
  •   NSArray *textArr = @[@"发起群聊""];
  •  NSArray *selectorArr = @[@"startGroupChat"];
  •  completion(imagesArr,textArr,selectorArr);
  • }

2.2.2.5、聊天界面分享图文功能

1.应用场景:
• 做分享功能时,开发者可以在该方法里实现第三方分享
  •  /*
  •  @brief 分享功能,请用户自己定制
  •  @param str 分享的文字
  •  @param image 分享的图片
  •  @param url 资源地址
  •  */
  • - (void)shareDataWithTarget:(id)target Text:(NSString *)str Image:(UIImage *)img Url:(NSString *)url;
2. 代码示例
在指定代理的类中实现方法, demo中用的是友盟分享:
Demo中代码示例:(demo中IMChatViewController.m第450-503行)
  •  - (void)shareDataWithTarget:(id)target Text:(NSString *)str Image:(UIImage *)img Url:(NSString *)url
  • {
  •  NSArray *arr = @[
  •  UMShareToWechatSession,
  •  UMShareToWechatTimeline,
  •  ];
  •  
  •  [self shareDateWithTarget:target Text:str Image:img Url:url ShareList:arr];
  • }
  •  
  • - (void)shareDateWithTarget:(id)target Text:(NSString *)str Image:(UIImage *)img Url:(NSString *)url ShareList:(NSArray *)list
  • {
  •  
  •  if (!img)
  •  {
  •  //type
  •  [UMSocialData defaultData].extConfig.wxMessageType = UMSocialWXMessageTypeText;
  •  
  •  [UMSocialData defaultData].extConfig.wechatSessionData.url = url;
  •  [UMSocialData defaultData].extConfig.wechatTimelineData.url = url;
  •  
  •  [UMSocialSnsService presentSnsIconSheetView:target
  •  appKey:kUMAppKey
  •  shareText:str
  •  shareImage:nil
  •  shareToSnsNames:list
  •  delegate:self];
  •  }
  •  else
  •  {
  •  //注意:微信易信平台图文分享 图片描述不能超过1024字节 所以进行对文字描述的截取
  •  if ([str length]>1024)
  •  {
  •  str = [str substringToIndex:1024];
  •  }
  •  if (!url) {
  •  [UMSocialData defaultData].extConfig.wxMessageType = UMSocialWXMessageTypeImage;
  •  }else{
  •  //分享类型的设置 不同类型有差异
  •  [UMSocialData defaultData].extConfig.wxMessageType = UMSocialWXMessageTypeWeb;
  •  }
  •  
  •  [UMSocialData defaultData].extConfig.wechatSessionData.url = url;
  •  [UMSocialData defaultData].extConfig.wechatTimelineData.url = url;
  •  
  •  [UMSocialSnsService presentSnsIconSheetView:target
  •   appKey:kUMAppKey
  •  shareText:str
  •  shareImage:img
  •  shareToSnsNames:list
  •  delegate:self];
  •  }
  • }

三、登录IM插件

3.1、登录

 
登录时需使用在官网申请的appKey和appToken。

3.1.1、强制登录

LoginMode_InputPassword:默认的首次登录方式,该登录模式可以把其他设备踢出,一般在输入密码登录时使用,可以作为强制登录方式踢出已在其他设备登录的账户。
 

3.1.2、自动登录

LoginMode_AutoInputLogin:一般从后台返回应用时使用,如果账户已经在其它设备强制登录,自动登录将会返回错误码并作出提示登录失败。
自动登录在以下几种情况下会被取消:
• 用户调用了 SDK 的登出接口;
• 用户在别的设备上更改了密码,导致此设备上自动登录失败返回175004错误码;
• 用户的账号被从服务器端删除;
• 用户从另一个设备强制登录,把当前设备上登录的用户踢出。
 

3.1.3、代码示例

1. 第一步:导入头文件
#import "AppModel.h"
2.第二步:在登陆按钮的点击事件里实现登陆功能。
Demo中代码示例:(demo中IMChatViewController.m第200-236行)
  •  NSMutableDictionary* loginDict = [[NSMutableDictionary alloc] initWithCapacity:10];
  •  [loginDict setObject:account forKey:@"account"];//账号
  •  [loginDict setObject:appId forKey:@"App_AppKey"];//App_AppKey对应用户在官网申请的appKey
  • [loginDict setObject:appToken forKey:@"App_Token"];//App_Token对应用户在官网申请的appToken
  •  
  •  [loginDict setObject:[NSNumber numberWithInt:1] forKey:@"mode"];//登录模式,1强制登陆模式,2自动登录模式
  •  //还可以添加设置一些可选的参数,比如名字、手机号等
  •  [ [AppModel sharedInstance] loginSDK:loginDict :^(NSError *error) {
  •  if (error.code == 200) {
  •  //登录成功
  •  }
  •  else if (error.code == 175004) {
  •  //您的账号在其他设备上登录
  •  }
  •  else {
  •  //登录失败
  •  }
  •  }];

3.2、退出登录

退出登录分两种类型:主动退出登录和被动退出登录。

3.2.1、主动退出登录

触发退出登录事件时,在触发方法里调用 SDK 的退出接口,如果error.code == 200表明退出成功,否则退出失败。
Demo中代码示例:(demo中IMChatViewController.m第242-267行)
  •  [[AppModel sharedInstance] logout:^(NSError *error) {
  •  MBProgressHUD* hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
  •  if (error.code == 200) {
  •  // 退出成功;
  •  }else{
  •  // 退出失败
  •  }
  •  }];

3.2.2、被动退出登录

使用通知模式接收被动退出登录通知消息,通知名“notificationKickedOff”。
Demo中代码示例:(demo中AppDelegate.mm第54、122-125行)
  •  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  •  //被踢下线
  •  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(beKickedOff) name:@"notificationKickedOff" object:nil];
  •  return YES;
  • }
  • //用户自定义被踢出后执行的方法
  • - (void)beKickedOff {
  • }
注:
在AppDelegate.mm中还需要调用推送设置的方法(demo中AppDelegate.mm第105-108行)
推送设置:在工程的 AppDelegate.mm 中的以下方法中,调用 IM插件 对应方法。
  • - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  •  // 将获取到的token传送消给SDK,用于苹果推消息使用
  •  [[AppModel sharedInstance] application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
  • }

四、IM功能接口

4.1、在Chart.h中定义的主调方法

4.1.1、获取会话列表

1. 应用场景:集成插件后,用该方法可以进入会话列表界面,该方法在您的聊天入口调用。
  •  /**
  •  @brief 获取会话列表界面
  •  @discussion获取会话列表界面
  •  @return会话列表界面
  •  */
  • - (UIViewController *)getSessionViewController; 
2. 代码示例
第 1 步:引入相关头文件 #import "Chat.h"
第 2 步:在触发进入会话列表界面的方法里,调用以下方法:
Demo中代码示例:(demo中IMChatViewController.m第273-281行)
  •  UIViewController *sessionVC = [[Chat sharedInstance] getSessionViewController];
  •  //如果是模态弹出,请设置导航控制器
  •  
  • UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:sessionVC];
  •  //设置导航栏左侧按钮调用会话列表界面的“shouldDismissViewController”方法来关闭该界面
  •  sessionVC.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"title_bar_back"] style:UIBarButtonItemStylePlain target:sessionVC action:@selector(shouldDismissViewController)];
  •     [self presentViewController:nav animated:YES completion:nil];
效果图如下:
  

4.1.2、新建群组开始聊天

1.应用场景: 想要新建一个群组开始聊天,该方法在您的聊天入口调用。
  •  /**
  •  @brief 新建一个群组开始聊天
  •  @discussion新建一个群组开始聊天
  •  @return输入群组成员
  •  */
  • - (UIViewController *)startChattingGroup;
2.代码示例
第 1 步:引入头文件 #import "Chat.h"
第 2 步:在触发要进入会话列表界面的方法里,调用该方法
Demo中代码示例:(demo中IMChatViewController.m第288-296行)
  •  UIViewController *groupChat = [[Chat sharedInstance] startChattingGroup];
  •  [self.navigationController pushViewController:groupChat animated:YES]; 
其效果如下图:

4.1.3、获取/新建一个会话

1.应用场景:通过一个账号sessionId,进入聊天界面与对方开始聊天, 还可以通过群组的账号groupId,进入群组聊天界面,该方法可以在通讯录点击联系人进行聊天时调用,也可以在发起单聊选择联系完毕之后调用。
  •  /**
  •  @brief 获取聊天界面
  •  @discussion 根据传入的会话Id获取聊天界面
  •  @param sessionId聊天对方的会话Id,点对点聊天时是对方的账号,群聊时是groupId
  •  @return聊天界面
  •  */
  • - (UIViewController *)getChatViewControllerWithSessionId:(NSString *)sessionId;
2.代码示例
第 1 步:引入相关头文件 #import "Chat.h"
第 2 步:在触发要进入聊天界面的方法里,调用该方法(在demo中,self.otherAccounttextField.text是输入框中输入的账号): 
Demo中代码示例:(demo中IMChatViewController.m第331行)
  • UIViewController *chatVC = [[Chat sharedInstance] getChatViewControllerWithSessionId:weakSelf.otherAccounttextField.text];

4.1.4、发起群聊及转发消息选人后开始聊天

1. 应用场景
• 发起群聊、群聊再选人、单聊再选人和转发消息时,在选择联系人界面已经选择完毕,然后确认后会根据您选择的联系人数据在该方法中的block块语法中返回聊天控制器。
• 该方法在您设计的选择联系人界面中调用。
  •  /*
  •  @brief 根据选择联系人界面所选择的数据开始聊天
  •  @param exceptData 传进聊天界面的数据
  •  @param addData 要添加的群组成员的数组
  •  @param completion 成功的回调
  •  @param failed 失败回调
  •  */
  • - (void)getChatViewControllerWithexceptData:(NSDictionary *)exceptData withAddDatas:(NSArray *)addData completion:(void(^)(UIViewController *controller))completion failed:(void(^)(NSString *codeStr))failed;
2.代码示例
第 1 步:引入相关头文件 #import "Chat.h"
第 2 步:发起群聊、群聊再选人、单聊再选人和转发消息的操作中,当您已经确定了要邀请的人并且触发确定邀请的事件时,调用该方法
Demo中代码示例:(demo中IMChooseMembersViewController.m第54-68行)
  •   [[Chat sharedInstance] getChatViewControllerWithexceptData:self.exceptData withAddDatas:@[accountOne, accountTwo] completion:^(UIViewController *controller) {
  •  [hud hideAnimated:YES];
  •  if (controller) {
  •  
  •  [self.navigationController pushViewController:controller animated:YES];
  •  }else {
  •  [self.navigationController popViewControllerAnimated:YES];
  •  }
  •  } failed:^(NSString *codeStr) {
  •     }];

4.1.5、获得未读的消息数目

1. 应用场景
•获得消息数量的变化,在AppDelegate.m中,设置数目变化的监听,在监听方法中实现该方法。
  • //未读消息数
  • - (NSInteger)unreadMessageCount;
 2.Appdelegate.m中的代码:
  •  在didFinishLaunchingWithOptions中:
  • //消息数量通知
  •  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notificationUpdateIMMesNum:) name:@"notification_update_session_im_message_num" object:nil];
  •  [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notificationUpdateIMMesNum:) name:@"KNotification_DeleteLocalSessionMessage" object:nil];
  • - (void)notificationUpdateIMMesNum:(NSNotification *)notification
  • {
  •  NSInteger num = [[Chat sharedInstance] unreadMessageCount];
  •  NSLog(@"%ld", (long)num);
  • }

4.1.6、设置个人信息

1. 应用场景
•在登录SDK后设置个人信息。
  •  - (void)setPersonInfoWithUserName:(NSString *)userName withUserAcc:(NSString *)userAcc;
 

4.2、在AppModel.h中定义的方法

 
除了在登录、登出时候使用的方法外,AppModel.h里还有以下方法:

4.2.1、获取未读消息数

1. 应用场景:集成插件后,用该方法可以获取未读的消息数,设置未读提示
  •  /**
  •  @brief 获取应用未读信息数
  •  @return 应用未读信息数
  •  */
  • - (NSInteger)getAppleBadgeNumberCount;
2. 代码示例
第 1 步:引入相关头文件 #import " AppModel.h"
第 2 步:在触发进入会话列表界面的方法里,调用以下方法:
Demo中代码示例:(demo中 AppDelegate.mm第136-137行)
  •  NSInteger count = [[AppModel sharedInstance] getAppleBadgeNumberCount];
  • application.applicationIconBadgeNumber = count; 

4.3、在ChatSetting.h中定义的方法

4.3.1、设置、获取新消息提示开关状态

  • /*
  •  @brief 设置开启/关闭新消息提示
  •  @param status YES:开启,NO:关闭
  •  */
  • +(void)setNewMsgNotiVailableStatus:(BOOL)status;
  •  
  • /*
  •  @brief 获取新消息提示开关状态
  •  @return YES:开启新消息提示,NO:关闭新消息提示
  •  */
  • +(BOOL)newMsgNotiVailableStatus;

4.3.2、设置、获取声音提示新消息开关状态

  • /*
  •  @brief 设置声音提示新消息开关
  •  @param status YES:开启声音提示,NO:关闭声音提示
  •  */
  • +(void)setMsgSoundVailableStatus:(BOOL)status;
  •  
  • /*
  •  @brief 获取声音提示新消息开关状态
  •  @return YES:开启声音提示,NO:关闭声音提示
  •  */
  • +(BOOL)msgSoundVailableStatus;

4.3.3、设置、获取震动提示新消息开关状态

  • /*
  •  @brief 设置震动提示新消息开关
  •  @param status YES:开启震动提示,NO:关闭震动提示
  •  */
  • +(void)setMsgVibrateVailableStatus:(BOOL)status;
  •  
  • /*
  •  @brief 获取震动提示新消息开关状态
  •  @return YES:开启震动提示,NO:关闭震动提示
  •  */
  • +(BOOL)msgVibrateVailableStatus;

4.3.4、设置、获取听筒/扬声器接听语音消息状态

  •  /*
  •  @brief 设置听筒/扬声器接听语音消息
  •  @param status YES:听筒,NO:开启扬声器
  •  */
  • +(void)setPlayEarStatus:(BOOL)status;
  •  
  • /*
  •  @brief 获取听筒/扬声器接听语音消息状态
  •  @return YES:听筒,NO:开启扬声器
  •  */
  • +(BOOL)playEarStatus;

4.3.5、清除所有聊天记录

  •  /*
  •  @brief 清除所有聊天记录
  •  */
  • +(void)deleteAllSessionAndGroupnoticeData:(BOOL)status;

4.3.6、插件UI资源的替换说明

1. UI资源:
 
在插件中, UI图片是放在default.bundle和red.bundle以及 blue.bundle里, 没有设置就会对应默认的default.bundle,在didFinshLaunchingWithOptions方法中设置:
  •   [[NSUserDefaults standardUserDefaults] setObject:@"default" forKey:@"themeType"];
  •   [[NSUserDefaults standardUserDefaults] setObject:@"red" forKey:@"themeType"];
  •   [[NSUserDefaults standardUserDefaults] setObject:@"blue" forKey:@"themeType"];
Object是什么,资源就回去哪里对应,如果相应名字的图片没有,就会去外边对应默认的,
 
2. 颜色
同上,当您设置了object,插件就会去 themeColor.plist配置文件中,如果您设置了red, 那么在配置文件中,就需要在red栏中设置相对应的颜色值,这里的颜色包括了聊天时候时间的背景颜色等。
chating_left_01/chating_left_01_on接收方的气泡/选中状态/
chating_right_02/chating_right_02_on发送方的气泡/选中状态/
chatView_location_map位置的图片
default_avatar_01/default_avatar_02@2x男/女 的默认头像/
navigation_bar导航栏的图片
nosession消息页面没有消息时候的图片
title_bar_add_01消息页面右上角
title_bar_back返回上一页的图片
title_bar_detail个人聊天页面右上角
title_bar_group_details_01群组聊天右上角
video_button_play_normal小视频播放按钮
voice_left_01接收方语音按钮
voice_right_01发送方语音按钮
 

4.4、在AppModelDelegate.h中定义的方法

注:以下方法不实现的话则执行原来的默认逻辑

4.4.1、自定义消息列表

1、根据session和tableView返回自定义的消息列表cell
  • -(UITableViewCell *)setSessionCellWithTableView:(UITableView *)tableView Ecsession:(ECSession*)session;
2、根据消息数组sessionArray返回自定义的sessionCell的高度
  •  -(CGFloat)setSessionCellHeightWithSessionArray:(NSArray *)sessionArray;
3、自定义消息列表cell的点击事件
  • -(BOOL)isCustomSelectSessionCellWithSession:(ECSession *)session;

4.4.2、自定义聊天界面

1、根据不同的消息类型获取对应的cell标识符
  @param message:对应的消息
   @return cell标识符
  •  -(NSString *)getCustomCellidentifierWithMsg:(ECMessage *)message;
2、根据消息类型以及基类cell获取自定义的cell
  @param currentCell:基类cell 
 message:收到的消息
  @return 自定义的cell
  • -(ChatViewCell*)getCustomCellWithOriginalCell:(ChatViewCell *)currentCell msg:(ECMessage *)message;
3、自定义cell背景图
 @param cell:可以根据cell类型自定义相应的背景图
  @param longPressed:是否是长按 
 YES:长按后图片展示样式 
 NO:正常情况下图片样式
  • -(void)customBubbleImageWithCell:(ChatViewCell *)cell  isLongPressed:(BOOL)longPressed;
4、根据收到的消息的不同类型自定义cell高度
 注:高度为0的话执行原来的逻辑
  @param message :需要设置高度的消息
  @return 返回Cell的高度
  • -(CGFloat)getCustomCellHeightWithMsg:(ECMessage*)message;
5、自定义cell气泡点击事件
 @param message:cell所对应的消息
  • -(BOOL)customCellTapWithMsg:(ECMessage *)message

4.4.3、对收到的消息进行自定义处理

1、对收到的消息进行处理
 @param message :收到的消息
  •   -(BOOL)isCustomHandleMsg:(ECMessage *)message