之前虽然稍微了解过即时通讯方面的内容,但是一直没有怎么去做过聊天部分的。这次是刚刚使用融云,做一下记录。
关于融云SDK集成的具体步骤,我都是参考以下这些文章(很多图片都是直接从这些地方拿的,我真是太懒了),链接在这里:
https://www.jianshu.com/p/eabfb0a93cf9
https://www.cnblogs.com/ithongjie/p/5036383.html
还有融云的官方指南:http://www.rongcloud.cn/docs/ios.html
代码下载:
https://github.com/AmoAmoAmo/RongChat
1.首先打开融云官网http://www.rongcloud.cn/,注册自己的账户,并登陆。
2.点击左边创建应用,在打开的小窗口填写你的项目的一些信息(如果正在开发阶段可以选择未运营商务用户,如果项目上线后是需要提交申请审核)。
3.点击创建 点击我的应用 然后在左边点击我的应用名称
4.点击AppKey进入。里面包含开发环境和生产环境,不同环境下的App Key是不一样的,融云基本是免费的,但是他会提供给你一些付费的服务(视自己项目而定)。记录好App Key,因为在后面工程中需要。融云开发环境允许100个测试用户,如果超过了100个测试用户,需要在后台手动添加用户,一次只能添加20个。
5.导入SDK到项目。需要什么功能就导入哪一个sdk模块,这里只需要简单的聊天功能加聊天界面,所以导入融云 IM 通讯能力库 - RongCloudIM/IMLib
融云 IM 界面组件 - RongCloudIM/IMKit),融云支持下载到本地手动导入,但是用cocoapods挺方便的,这里就用cocoapods导入
1)创建一个工程,并创建podfile配置文件
cd 到你的项目路径
然后:输入touch podfile 或者 pod init (会自动生成podfile文件)
pod init后直接继续:
pod install
这就成功了,然后再看看你的项目路径里面,是不是多出来很多文件?
如下图:
2)写podfile文件:
3)在终端 pod install:
(之前写了好多,今天发现忘记保存了。。。)
6.获取Token
连接融云服务器的时候需要传给融云服务器一个token,相当于登录融云的一个"用户名",这个"用户名"是你们后台服务器集成的事情,所以你不用管,到时候后台会在你需要的地方返回给你这个token。在测试的时候需要我们在融云控制台获取一个测试的token,用来登录。方法如下
7,SDK集成
1)初始化
在项目中AppDelegate.h文件中导入头文件
#import然后遵守RCIMConnectionStatusDelegate代理
初始化
//初始化融云SDK。
[[RCIM sharedRCIM] initWithAppKey:MY_APPKEY];
2)连接服务器
[[RCIM sharedRCIM] connectWithToken:MY_TOKEN success:^(NSString *userId) {
// [[RCIM sharedRCIM] setUserInfoDataSource:self];
NSLog(@"登陆成功。当前登录的用户ID:%@", userId);
} error:^(RCConnectErrorCode status) {
NSLog(@"登陆的错误码为:%ld", (long)status);
} tokenIncorrect:^{
//token过期或者不正确。
//如果设置了token有效期并且token过期,请重新请求您的服务器获取新的token
//如果没有设置token有效期却提示token错误,请检查您客户端和服务器的appkey是否匹配,还有检查您获取token的流程。
NSLog(@"token 无效 ,请确保生成token 使用的appkey 和初始化时的appkey 一致");
}];
此时即可运行了,打印如下:
3)会话列表
融云 IMKit 已经实现了一个默认的会话列表视图控制器,您直接使用或继承 RCConversationListViewController,即可快速启动和使用会话列表界面。
首先,新建一个类继承自RCConversationListViewController。
并在.m文件的- (void)viewDidLoad方法中设置需要显示哪些类型的会话以及哪些类型的会话可以在会话列表页面聚合显示。如下:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
//设置需要显示哪些类型的会话
[self setDisplayConversationTypes:@[@(ConversationType_PRIVATE),
]];
//设置需要将哪些类型的会话在会话列表中聚合显示
[self setCollectionConversationType:@[@(ConversationType_DISCUSSION),
@(ConversationType_GROUP)]];
}
这样一个回话列表界面就已经集成完成,我们可以在融云控制着后台发送一条测试消息,看一下回话列表能不能收到消息。
然后马上就能在会话列表看到一条刚刚收到的消息
点击会话列表,进入聊天会话界面
在自定义的会话列表 View Controller 中加入以下代码,即可点击进入聊天会话界面。
//重写RCConversationListViewController的onSelectedTableRow事件
- (void)onSelectedTableRow:(RCConversationModelType)conversationModelType
conversationModel:(RCConversationModel *)model
atIndexPath:(NSIndexPath *)indexPath {
// 初始化一个聊天页面
RCConversationViewController *conversationVC = [[RCConversationViewController alloc]init];
conversationVC.conversationType = model.conversationType;
conversationVC.targetId = model.targetId;
conversationVC.title = @"想显示的会话标题";
[self.navigationController pushViewController:conversationVC animated:YES];
}运行结果如下:
其中我又加了其他一些如tabbar、导航栏,还有聚合显示等,具体可以去看我的代码,效果如下:
4)设置会话的头像和昵称,昵称的字体颜色等等
在AppDelegate.h中设置RCIMUserInfoDataSource代理,连接成功后 设置代理(用户信息代理)
当融云服务器连接成功后 设置代理(用户信息代理)
[[RCIM sharedRCIM] setUserInfoDataSource:self];
实现代理方法:
// 设置会话的头像和昵称等 是好友的头像和昵称,不是自己的
- (void)getUserInfoWithUserId:(NSString *)userId
completion:(void (^)(RCUserInfo *userInfo))completion
{
NSLog(@"------ userID = %@ ---------", userId);
// 设置用户头像
if ([userId isEqualToString:@"199"]) {
RCUserInfo *userInfo = [[RCUserInfo alloc] init];
userInfo.userId = userId;
userInfo.name = @"小月月";
userInfo.portraitUri = @"https://img-blog.csdn.net/20180401185902182";
return completion(userInfo);
}
if ([userId isEqualToString:@"888"]) {
RCUserInfo *userInfo = [[RCUserInfo alloc] init];
userInfo.userId = userId;
userInfo.name = @"baby";
userInfo.portraitUri = @"https://img-blog.csdn.net/2018032015362964";
return completion(userInfo);
}
return completion(nil);
}
设置昵称颜色:
- (void)willDisplayConversationTableCell:(RCConversationBaseCell *)cell
atIndexPath:(NSIndexPath *)indexPath
{
RCConversationModel *model = self.conversationListDataSource[indexPath.row];
if (model.conversationType == ConversationType_PRIVATE) {
RCConversationCell *conversationCell = (RCConversationCell *)cell;
// 设置昵称的字体颜色
conversationCell.conversationTitle.textColor = [UIColor redColor];
}
}