先上图
申请帐号准备工作
1.首先在集成环信的时候先去查看下环信官方文档,这里要说的是因为环信版本变更,官方文档的很多东西无法使用,我们只是需要先了解一下。
2.然后申请环信账号,下载对应的sdk文件
3.记得创建推送证书和记录appkey,这里安装官方文档就可以
集成SDK
1.首先要说明的是官方给了俩个版本的SDK
a.不包含实时语音版本 SDK(HyphenateLite),引用时#import
b.包含实时语音版本 SDK(Hyphenate),引用时 #import
这里要说的是,因为环信的demo是基于包含实时语音进行创建的,如果选择不包含的,在下一步拖入SDK的时候很多地方需要修改注释,为了避免这一步,我们选中第二个,因为很多时候需要修改源码,所以我们选择本地拷贝的方式
2.现在打开下载好的环信demo,将对应的俩个文件夹添加进来
这俩个文件,一个是环信自身的逻辑处理,一个是环信已经写好的一些UI界面,聊天,添加好友那些
a.然后按照官方文档进行添加依赖库
SDK 包含实时语音依赖库有:
CoreMedia.framework
AudioToolbox.framework
AVFoundation.framework
MobileCoreServices.framework
ImageIO.framework
libc++.dylib
libz.dylib
libstdc++.6.0.9.dylib
libsqlite3.dylib
libiconv.dylib
(如果使用的是 xcode7,后缀为 tbd。)
b.SDK 不支持 bitcode,向 Build Settings → Linking → Enable Bitcode 中设置 NO。
3.这里就可以进行编译了,以下是我编译的时候出现的问题
a.找不到uikt 的方法,这点是添加EaseUI是没有将对应的.pch文件路径放对,一般来说,我们项目本身已经有.pch文件了,只需要删除它,然后在项目文件的.pch文件中添加就好了
注意,OBJC千万不要忘。
b.如果项目中已经用到了MBProgressHUD和MJRefresh,在编译的过程中需要会进行重复导入报错,将EaseUI文件中的三方库删除掉就好
c.还有一种报错,这点我不知道因为什么,可能是MWPhotoBrowser 的一些方法与SDWebImage冲突了,我将报错的地方注释掉就好了
d 这个错误官方上没有提,但是他给了一个图片,需要我们自己添加库
在Build Phases 添加
e 做完这些应该可以编译成功了,但是官方文档给了一个需要修改的地方是关于app上架的,我这里就抄来了
集成动态库上传AppStore
由于 iOS 编译的特殊性,为了方便开发者使用,我们将 i386 x86_64 armv7 arm64 几个平台都合并到了一起,所以使用动态库上传appstore时需要将i386 x86_64两个平台删除后,才能正常提交审核
在SDK当前路径下执行以下命令删除i386 x86_64两个平台
实时音视频版本Hyphenate.framework
lipo Hyphenate.framework/Hyphenate -thin armv7 -output Hyphenate_armv7
lipo Hyphenate.framework/Hyphenate -thin arm64 -output Hyphenate_arm64
lipo -create Hyphenate_armv7 Hyphenate_arm64 -output Hyphenate
mv Hyphenate Hyphenate.framework/
不包含实时音视频版本HyphenateLite.framework
lipo HyphenateLite.framework/HyphenateLite -thin armv7 -output HyphenateLite_armv7
lipo HyphenateLite.framework/HyphenateLite -thin arm64 -output HyphenateLite_arm64
lipo -create HyphenateLite_armv7 HyphenateLite_arm64 -output HyphenateLite
mv HyphenateLite HyphenateLite.framework/
现在就是要开始代码方面
先看环信的demo
1.首先你要明白EaseUI 中已经将很大部分的功能全部实现了,没有必要在去自己建立UI和控制器,保存的数据也用环信提供的model,我们要做的是,根据demo中的逻辑关系,将环信的初始化写到我们项目文件中,然后进行修改UI。主要是环信AppDelegate 中的方法,以及扩展类中的那些注册通知和初始化控制器。因为我对于扩展类方面不是很厉害,于是我就将我能够使用的方法全部在AppDelegate 和对应的根控制器中实现了
// 注册环信SDK以及推送证书
[[EaseSDKHelper shareHelper] hyphenateApplication:application
didFinishLaunchingWithOptions:launchOptions
appkey:HuanXingAppKey
apnsCertName:HuanXingPush
otherConfig:@{kSDKConfigEnableConsoleLogger:[NSNumber numberWithBool:YES],@"easeSandBox":@NO}];
[EaseSDKHelper shareHelper];// 初始化环信相关回调
[self easemobApplication:application didReceiveRemoteNotification:launchOptions];
EMError *error =[[EMClient sharedClient]initializeSDKWithOptions:[EMOptions optionsWithAppkey:HuanXingAppKey]];
if (!error) {
NSLog(@"初始化成功");
}
// APP进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[EMClient sharedClient] applicationDidEnterBackground:application];
}
// APP将要从后台返回
- (void)applicationWillEnterForeground:(UIApplication *)application
{
[[EMClient sharedClient] applicationWillEnterForeground:application];
}
然后就是按照官方demo中的登录继续在我的登录界面写功能
-(void)setHuanxing{
//只有开放注册时,才可以客户端注册。开放注册是为了测试使用,正式环境中不推荐使用该方式注册环信账号。
// 授权注册的流程应该是您服务器通过环信提供的 REST API 注册,之后保存到您的服务器或返回给客户端。
#pragma 正式版需要注意的是在用户登录之后要在后台根据他的手机号进行注册,然后将注册成功的姓名和密码告诉前端,前端进行环信登录
// error = [[EMClient sharedClient] registerWithUsername:@"15824326170" password:@"123456"];
// if (error==nil) {
// NSLog(@"注册成功");
// }
//然后进行环信登录
EMError *error1 = [[EMClient sharedClient] loginWithUsername:@"123123123" password:@"123456"];
if (!error1) {
NSLog(@"登录成功");
[[ApplyViewController shareController] loadDataSourceFromLocalDB];
}
//自动登录需要在有接口的时候进行调试
EMError*error2 = [[EMClient sharedClient] loginWithUsername:@"123123123" password:@"123456"];
if (!error2)
{
[[EMClient sharedClient].options setIsAutoLogin:YES];
NSLog(@"登陆成功2");
}
//这是退出登录的时候,需要跟用户退出的时候进行同步
/*
EMError *error = [[EMClient sharedClient] logout:YES];
if (!error) {
NSLog(@"退出成功");
}
*/
[self loginWithUsername:@"123123123" password:@"123456"];
}
//登陆后的操作异步登录
- (void)loginWithUsername:(NSString *)username password:(NSString *)password{
//异步登陆账号
__weak typeof(self) weakself = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
EMError *error = [[EMClient sharedClient] loginWithUsername:username password:password];
dispatch_async(dispatch_get_main_queue(), ^{
[weakself hideHud];
if (!error) {
//设置是否自动登录
[[EMClient sharedClient].options setIsAutoLogin:YES];
//获取数据库中数据
[MBProgressHUD showHUDAddedTo:weakself.view animated:YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/** 数据库操作*/
[[EMClient sharedClient] migrateDatabaseToLatestSDK];
dispatch_async(dispatch_get_main_queue(), ^{
/** 获取用户所有群组*/
[[ChatDemoHelper shareHelper] asyncGroupFromServer];
/** 获取所有会话,如果内存中不存在会从DB中加载*/
[[ApplyViewController shareController] loadDataSourceFromLocalDB];
[[ChatDemoHelper shareHelper] asyncConversationFromDB];
//从服务器获取推送属性
[[ChatDemoHelper shareHelper] asyncPushOptions];
// [MBProgressHUD hideAllHUDsForView:weakself.view animated:YES];
//发送自动登陆状态通知
[[NSNotificationCenter defaultCenter] postNotificationName:KNOTIFICATION_LOGINCHANGE object:@([[EMClient sharedClient] isLoggedIn])];
//保存最近一次登录用户名
[weakself saveLastLoginUsername];
});
});
}
});
});
}
#pragma mark - private
- (void)saveLastLoginUsername
{
NSString *username = [[EMClient sharedClient] currentUsername];
if (username && username.length > 0) {
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
[ud setObject:username forKey:[NSString stringWithFormat:@"em_lastLogin_username"]];
[ud synchronize];
}
}
这里需要说一句的是 [[ApplyViewController shareController] loadDataSourceFromLocalDB];这个方法就是我自己从扩展类中添加到这里的,这个方法是获取好友申请列表数量,如果没有这个方法,好友数量在开始进入app 是显示为0的。
2.然后我们可以观察官方demo
a.ChatDemoHelper 这个类是主要的,我们必须要看懂这个类以及里面的方法,我自己标记了一下各个控制对应的页面,然后看这个单利里面的方法, 它将环信用到的通知以及回调方法全部写好了,自己可以根据demo多跳转跳转看看
我们需要注意的地方就是 MainViewController 这个控制器,很多项目已经存在根控制器,所以需要将它里面的方法放到项目的根控制器中,然后就是所有对应的聊天界面 会话界面的控制器也会发生改变,我们只需要改成我们对应的就行。
这个时候可能会报错,原因是少了一些类以及框架,我这里将红包和实时语音注释掉后,又自已一个一个进行的添加,这得慢慢来。
b 这里要说的一点就是可以自己写一个控制器继承环信对应的会话列表控制器,当然也可以用它的,然后进行修改就行,这也是需要时间和细心,因为在前面进行的时候很可能会出现一些代码功能不实现的状况。
c .在做这些的时候,你应该会看到环信对应的修改头像和昵称的方法,以及修改默认头像的地方,有的默认头像是在EaseUI对应的文件中,需要打开进行修改,或者你自己定义的一些功能图片
d 然后就是修改昵称和头像的问题,这个需要在我们后台保存好后进行存在model里面,个人还没有做,但是环信的model里面已经写了,我觉得只要我们写到对应的model里面就可以了
存到这个model 里面就行 我觉得 UserProfileManager,等我最后优化