前言:
对于iOS开发,目前比较流行的即时通信有:融云、环信、网易云信,都是不错的选择。由于工作需求,笔者粗略的学习了一下融云即时通讯。下面就简单的总结一下如何集成单聊的聊天界面。
简介:
融云是国内首家专业的即时通讯云服务提供商,专注为互联网、移动互联网开发者提供免费的即时通讯基础能力和云端服务。通过融云平台,开发者不必搭建服务端硬件环境,就可以将即时通讯、实时网络能力快速集成至应用中。
融云 SDK 包括两部分:IM 界面组件和 IM 通讯能力库。
IM 界面组件 - IMKit
IMKit 是融云 SDK 的核心特色之一。融云将即时通讯产品中最复杂的会话列表、聊天窗口、消息内容展现、会话设置等功能封装为组件,通过简短的代码,您就可以直接将以上界面集成到您的 App 产品中,省去大量的开发调试时间。融云同时支持业内最丰富的自定义界面组件功能,您可以针对自己界面需求自由设计开发。
IM 通讯能力库 - IMLib
IMLib 是不含界面的基础 IM 通讯能力库,封装了通信能力和会话、消息等对象。引用到 App 工程中后,需要开发者自己实现 UI 界面,相对较轻量,适用于对 UI 有较高订制需求的开发者。
前期准备:
建议先浏览融云SDK开发文档: http://www.rongcloud.cn/docs/ios.html, 因为里面讲的很详细
一.注册开发者账号 http://www.rongcloud.cn
二.创建应用,创建完应用之后,在你的应用中,会自动创建两套的环境,即:开发环境和生产环境。同时你会获得App Key 和App Secret,它们是融云 SDK 连接服务器所必须的标识,每一个 App 对应一套 App Key 和 Secret。
三.下载与导入SDK,有两种方式可选(推荐使用CocoaPods安装SDK,因为可极大简化安装过程)
1.使用CocoaPods导入融云SDK,这里就不再赘述,自行百度,很简单的。
2.手动导入融云SDK,你可以到融云官方网站下载融云SDK http://www.rongcloud.cn/downloads
注意:如果你使用 IMKit,您需要将所有的文件导入您的工程中; 如果您使用 IMLib,您需要导入除 RongIMKit.framework 和 RongCloud.bundle 之外的所有文件。
代码编写:
1.初始化SDK(在AppDelegate.m方法中引入SDK以及注册应用)
#import <RongIMKit/RongIMKit.h>
#define kRongCloudKey @"bmdehs6pdbp3s" //你注册应用的App Key
[[RCIM sharedRCIM] initWithAppKey:kRongCloudKey];
2.获取Token值
Token 即用户令牌,相当于您 APP 上当前用户连接融云的身份凭证。在您连接融云服务器之前,您需要请求您的 App Server,您的 App Server通过Server API 获取 Token 并返回给您的客户端,客户端获取到这个 Token 即可进入下一步连接融云服务器。
为什么必须在服务器端请求 Token,客户端不提供获取 Token的接口?
因为获取 Token 时需要提供 App Key 和 App Secret。如果在客户端请求 Token,假如您的 App 代码一旦被反编译,则会导致您的 App Key和App Secret 泄露。所以,务必在您的服务器端获取 Token。
我们在开发者控制台提供了 API 调试的功能,在开发初期阶段,您可以通过其中获取 Token 功能,手动获取 Token 进行测试。
3.连接服务器
将您在上一步获取到的 Token,通过 RCIM 的单例,传入 -connectWithToken:success:error:tokenIncorrect:
方法,即可建立与服务器的连接。
//获取Token值
NSString *token1 = @"获取的第一组的token";
//连接服务器
[[RCIM sharedRCIM] connectWithToken:token1 success:^(NSString *userId) {
NSLog(@"登录成功。当前登录的用户ID:%@",userId);
[[NSUserDefaults standardUserDefaults] setObject:userId forKey:@"userId"];
[[NSUserDefaults standardUserDefaults] synchronize];
} error:^(RCConnectErrorCode status) {
NSLog(@"登录的错误码为:%ld",status);
} tokenIncorrect:^{
//token过期或者不正确。
//如果设置了token有效期并且token过期,请重新请求您的服务器获取新的token
//如果没有设置token有效期却提示token错误,请检查您客户端和服务器的appkey是否匹配,还有检查您获取token的流程。
NSLog(@"token错误");
}];
4.启动聊天界面
融云 IMKit 中已经实现了完整的聊天界面,包含发送、接收、更新等 UI,并覆盖常用的IM交互场景,您直接使用或继承 RCConversationViewController,即可快速启动和使用聊天界面。
添加一个启动聊天按钮,直接调起单聊界面
- (IBAction)xiaoming:(id)sender {
//新建一个聊天会话View Controller对象
RCConversationViewController *chat = [[RCConversationViewController alloc] init];
//设置会话的类型,如单聊、讨论组、群聊、聊天室、客服、公众服务会话等
chat.conversationType = ConversationType_PRIVATE;
//设置会话的目标会话ID。(单聊、客服、公众服务会话为对方的ID,讨论组、群聊、聊天室为会话的ID)
chat.targetId = @"获取第二组的用户id";//实现两个账号间通信
//设置聊天会话界面要显示的标题
chat.title = @"会话标题";
//显示聊天会话界面
[self.navigationController pushViewController:chat animated:YES];
}
5.启动会话列表界面
融云 IMKit 已经实现了一个默认的会话列表视图控制器,你直接使用或继承 RCConversationListViewController,即可快速启动和使用会话列表界面。
首先新建一个TestChatViewController的类,继承于RCConversationListViewController,在viewDidLoad中设置需要显示的会话类型,需要将哪些类型的会话聚合显示。
//TestChatViewController.h
#import <RongIMKit/RongIMKit.h>
@interface TestChatViewController : RCConversationListViewController
@end
//TestChatViewController.m
#import "TestChatViewController.h"
@interface TestChatViewController ()
@end
@implementation TestChatViewController
- (void)viewDidLoad {
//重写显示相关的接口,必须先调用super,否则会屏蔽SDK默认的处理
[super viewDidLoad];
//聚合显示指的是此类型所有会话,在会话列表中聚合显示成一条消息,点击进去会再显示此类型的具体会话列表
//设置需要显示哪些类型的会话
[self setDisplayConversationTypes:@[@(ConversationType_PRIVATE),
@(ConversationType_DISCUSSION),
@(ConversationType_CHATROOM),
@(ConversationType_GROUP),
@(ConversationType_APPSERVICE),
@(ConversationType_SYSTEM)]];
//设置需要将哪些类型的会话在会话列表中聚合显示
[self setCollectionConversationType:@[@(ConversationType_DISCUSSION),
@(ConversationType_GROUP)]];
}
/**
*重写RCConversationListViewController的onSelectedTableRow事件
*
* @param conversationModelType 数据模型类型
* @param model 数据模型
* @param indexPath 索引
*/
//在你的会话列表中加入以下代码,即可点击进入聊天会话界面。
-(void)onSelectedTableRow:(RCConversationModelType)conversationModelType conversationModel:(RCConversationModel *)model atIndexPath:(NSIndexPath *)indexPath{
RCConversationViewController *conversationVC = [[RCConversationViewController alloc] init];
conversationVC.conversationType = ConversationType_PRIVATE;
conversationVC.targetId = model.targetId;
conversationVC.title = @"会话标题";
[self.navigationController pushViewController:conversationVC animated:YES];
}
然后初始化会话列表并显示
TestChatViewController *chatList = [[TestChatViewController alloc] init];
[self.navigationController pushViewController:chatList animated:YES];
尾巴:
以上就是实现单聊的聊天界面和会话列表界面的全部内容,你只需要在模拟器上运行一遍,更换token值和UserId,再次运行在真机上,就可实现真机与模拟器间即时通讯。
最后补充一点:如果你的融云账号创建的项目 是很久之前的, 一直没使用, 那融云会默认 APP Key 失效, 无法在API调试中 获取到token.