集成环信的EaseUI 中遇到的一些坑(3.x)

来源:互联网 发布:厦门行知教育 编辑:程序博客网 时间:2024/06/05 17:36

SDK 采用模块化设计,每一模块的功能相对独立和完善,用户可以根据自己的需求选择使用下面的模块:

  • EMClient: 是 SDK 的入口,主要完成登录、退出、连接管理等功能。也是获取其他模块的入口。
  • EMChatManager: 管理消息的收发,完成会话管理等功能。
  • EMContactManager: 负责好友的添加删除,黑名单的管理。
  • EMGroupManager: 负责群组的管理,创建、删除群组,管理群组成员等功能。
  • EMChatroomManager: 负责聊天室的管理。

下载SDK可以到环信官网下载环信 SDK。

注: 由于 iOS 编译的特殊性,为了方便开发者使用,我们将 i386 x86_64 armv7 arm64 几个平台都合并到了一起,所以 SDK 的静态库(.a文件)比较大。实际集成编译出 ipa 后,根据调用功能的多少,实际只会增加 2MB 左右。

SDK 依赖库有:

  • CoreMedia.framework
  • AudioToolbox.framework
  • AVFoundation.framework
  • MobileCoreServices.framework
  • ImageIO.framework
  • libc++.dylib
  • libz.dylib
  • libstdc++.6.0.9.dylib
  • libsqlite3.dylib
    (如果使用的是 xcode7,后缀为 tbd。)
  • libiconv.dylib(SDK 包含实时语音依赖库)
    SDK 不支持 bitcode,向 Build Settings → Linking → Enable Bitcode 中设置 NO。

EaseUI 封装了 IM 功能常用的控件(如聊天会话、会话列表、联系人列表)。旨在帮助开发者快速集成环信 SDK。环信的EaseUI其实只是做到一个展示的作用因此我们可以直接用ChatDemo3.0中的ChatViewController这个界面,

当你把ChatViewController也集成完毕,一个初步成型的单聊界面就出来了.ps:环信支持非好友之间的聊天,你只要知道对方的环信id即可.

源码地址:

  • EaseUI工程
  • Demo3.0工程

快速集成

第 1 步:集成 EaseUI 前,首先需要集成环信 iOS SDK,参考:集成文档。

第 2 步:参考ChatDemo3.0 导入的方式,直接将EaseUI拖入已经集成SDK的项目中

将EaseUI拖入项目

导入完EaseUI之后,我的工程运行发现出现如图所示错误:



其实碰到上面这个问题还是很好解决的,这个是因为用到了UIKit里的类,但是只导入了Foundation框架,这个错误在其他类里也会出现,我们可以手动修改Founfation为UIKit,但是我不建议这么做,第一这个做法的工程量比较大, 在其他类里面也要导入,二,不利于移植,当以后环信更新的时候我们还是需要做同样的操作,这里我的做法的创建一个pch文件,在pch文件里面导入UIKit。

解决办法:建一个PCH文件在里面添加如下代码:

#ifdef __OBJC__

    #import <UIKit/UIKit.h>

#import <Foundation/Foundation.h>

    #import "EMSDK.h"

#define NSEaseLocalizedString(key, comment) [[NSBundle bundleWithURL:[[NSBundle mainBundle] URLForResource:@"EaseUIResource" withExtension:@"bundle"]] localizedStringForKey:(key) value:@"" table:nil]

#endif

其他一些问题总结:(以前整理的,可借鉴)

如果报错:"_iconv", referenced from: _avcodec_decode_subtitle2 in libHyphenateFullSDK.a(utils.o),则另外要加入libiconv.tbd依赖库.

官方依赖库导入之后编译,此处编译会遇到的坑: 

1).报重复引用静态库错误(没删官方两个静态库中的一个) 

2).报与-all_load 冲突错误 根据文档改为-ObjC即可  如果改为-ObjC还有错 可按照文档改为 -force_load

注:项目如果用了友盟分享,改为-force_load之后 会与友盟有冲突,具体原因也不清楚,项目直接crash在分享新浪微博,此处求解惑.  改为-ObjC即可

到此步骤直到编译没错的时候就说明导入SDK 配环境成功.



下面我们看一下如何集成登录以及集成登录的时候遇到的问题:

[[EMClient sharedClient] loginWithUsername:self.userNameField.text password:self.passwordField.text completion:^(NSString *aUsername, EMError *aError) {}];// [[EMClient sharedClient] addDelegate:self delegateQueue:nil];

当我们设置当前控制器为代理的时候,这里跟以前设置代理属性稍稍有点不一样,说到这里,必须要提到一个概念“多播代理”,集成环信的时候,大部分的api基本都是以代理方法来实现,环形本来也是基于XMPPFramework框架来开发的,很早之前,在XMPPFramework就接触过这个多播代理,我们以前所理解的代理可能就是控制器之间的逆向传值,这个是属于一对一的,也就是说只能有一个对象成为我的代理,这里的“多播代理”的唯一区别就是代理对象可以有很多个, 只要当前控制器设置了代理属性,那么当执行这个代理方法的时候,遵循这个代理属性的控制器就会调用这个代理方法。
这里的一个注意点就是添加代理一定不要忘了移除代理,这个暂且算一个小小的注意点。

- (void)dealloc {    [[EMClient sharedClient] removeDelegate:self];}

那么继续往下看,环信还提供给我们了自动登录的功能,也就是说只要第一次登录成功以后,环信里面会把登录成功的账号和密码都保存在本地,具体的我也看了一下沙盒中的文件:


可以看到这个是以plist文件存储的,而且是放在Library/Preferences文件夹下,于是我大胆猜想,这个应该是使用[NSUserDefaults standardUserDefaults]这种存储方法实现的。当然了这个并不重要
我们继续看环信提供给我们的api

[EMClient sharedClient].options.isAutoLogin

上面这个方法其实取值就是从而本地取值,对应的就是上面截图中的emAutoLogin属性对应的值。
我们做自动登录的时候的逻辑,比如我的demo中的逻辑是这样的:
当我第一次登录的时候,这个时候isAutoLogin的属性为NO,加载登录界面,当我退出以后,在后台将这个应用程序退出(杀死),这时候我们再次进入,此时isAutoLogin的属性值为Yes那么我们直接加载主界面,说到这里有一个问题当我们自动登录的时候,是向服务器发送的异步请求,只有当我们自动登录成功以后,才会去显示主界面,才会去加载“联系人列表”“会话列表”等。
在环信的官网文档上也能看到环形给我们提供了一个代理方法,当我们自动登录无论是否成功,都会回调这个代理方法。

#pragma mark - 发生自动登录的时候回调用该方法- (void)autoLoginDidCompleteWithError:(EMError *)aError {    [MBProgressHUD dh_hideIndicatorForView:self.view];    if (!aError) {        NSLog(@"自动登录");    } else {        // 展示错误信息        [MBProgressHUD dh_showInfoWithTitle:@"登录提示" subTitle:aError.errorDescription toView:self.view afterDelay:.5];    }}

说完登录这块以后,下面就要说说联系人列表了,环信的EaseUI提供了联系人列表,但是我这里没有集成UI,我使用的自定义的UI,关于联系人列表这块主要使用的是以下代理

// 添加代理[[EMClient sharedClient].contactManager addDelegate:self delegateQueue:nil];

关于联系人列表这块根据官方文档提供的api大致可以集成,比较简单,我在集成过程中也没有碰到什么问题,所以这里不作细说。上面说到了集成UI,在环信提供给我们的UI中需要依赖如下第三方库,因EaseUI本身集成了几个常用三方库,因此会与工程中你所用的重复,此时编译会报错.本身所包含的常用三方如下:MBProgressHUD、VoiceConvert、MJRefresh、SDWebImage. 如果有冲突,切记删除ChatDemo中的三方库,然后改掉相关报错的代码.此时编译如果还报错,错误为Setting文件夹下的BackUp类,直接删除掉或注释即可,该类用处不大.至此,编译成功则EaseUI的集成也完毕了.最后,当我们集成“聊天列表”的时候写了如下代码

#pragma tableView的代理方法----监听每一行的点击- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {       // 获取当前好友    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];    // 跳转控制器    EaseMessageViewController *chatController = [[EaseMessageViewController alloc] initWithConversationChatter:cell.textLabel.text conversationType:EMConversationTypeChat];//    [self.navigationController pushViewController:chatController animated:YES];    [self.navigationController showViewController:chatController sender:nil];   }

还有一个就是会话列表了“EaseConversationListViewController”集成这个的时候稍稍有点坑。
我继承自这个控制器JYTConversationController,在这个里面试着去调用环信暴露出来的代理方法,数据源方法等,发现都不调用,根本就不走代理方法, 界面也不显示。
解决办法如下:
在JYTConversationController添加如下代码就可以了

- (void)viewDidLoad {    [super viewDidLoad];     [self tableViewDidTriggerHeaderRefresh];}


那么你会疑问了,头像和昵称还没有搞定.因为环信服务器不存储用户的头像和昵称,因此需要你与自己app的服务器交互,聊天界面的头像和昵称在如下方法中修改:

- (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController
                           modelForMessage:(EMMessage *)message

会话列表怎么更改昵称、头像:

-(id<IConversationModel>)conversationListViewController:(EaseConversationListViewController *)conversationListViewController modelForConversation:(EMConversation *)conversation

返回的id<IConversationModel>对象,有头像属性



0 0