前言
最近项目需要增加即时通讯
功能,主要有2大需求 单聊
和 群聊
,花了点时间研究了一下,最近项目也集成完毕,在这里总结一下。
简介
融云
可以向开发者和企业提供即时通讯和实时音视频通信服务。通过融云平台,开发者不必搭建服务端硬件环境,就可以将即时通讯、实时网络能力快速集成至应用中。消息类型上支持文字
、表情
、图片
、语音
、视频
、地理位置
、红包
、实时音视频
、通知消息
等消息类型。
一、注册开发者账号_获取AppKey
首先需要进入融云官网 注册开发者账号, 创建自己的应用, 拿到AppKey
, AppKey
分2个环境 开发环境
和 生产环境
,根据自己项目需求获取相应环境的AppKey
注:两个环境消息不互通。
二、在AppDelegate中需要进行融云的初始化与配置
#import <RongIMKit/RongIMKit.h> 导入头文件
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[RCIM sharedRCIM]initWithAppKey:RongClour_AppKey]; // 设置app key,初始化 SDK,必须设置
// 以下根据自己项目需求.进行配置
[RCIM sharedRCIM].enablePersistentUserInfoCache = YES; // 开启用户信息和群组信息的持久化
[RCIM sharedRCIM].userInfoDataSource = [RCDRCIMDataSource shareInstance]; // 设置RongCloud用户信息数据源
[RCIM sharedRCIM].groupInfoDataSource = [RCDRCIMDataSource shareInstance]; // 设置RongCloud群组信息数据源
[RCIM sharedRCIM].enableMessageAttachUserInfo = YES; // 是否在发送的所有消息中携带当前登录的用户信息
[RCIM sharedRCIM].receiveMessageDelegate = self; // 设置接收消息代理
[RCIM sharedRCIM].enableTypingStatus =YES; // 开启输入状态监听
[RCIM sharedRCIM].showUnkownMessage = YES; // 设置显示未注册的消息
[RCIM sharedRCIM].showUnkownMessageNotificaiton = YES; // 未注册的消息类型是否显示本地通知
[RCIM sharedRCIM].disableMessageAlertSound = YES; // 声音提示
[[RCIM sharedRCIM] setConnectionStatusDelegate:self]; // 设置会话列表头像和会话界面头像
[[RCIM sharedRCIM] registerMessageType:[RRTCustomFriendMessage class]]; // 注册自定义消息类型
[RCIM sharedRCIM].globalConversationPortraitSize = CGSizeMake(50, 50); // 会话列表界面中显示的头像大
return YES;
}
注:
以上配置主要是根据我自己项目需求.还有很多其他配置,大家可以根据自己项目需求进行配置.可参考官方文档.
这里需要注意一下: 2个数据源配置
[RCIM sharedRCIM].userInfoDataSource = [RCDRCIMDataSource shareInstance]// 设置RongCloud用户信息数据源
[RCIM sharedRCIM].groupInfoDataSource = [RCDRCIMDataSource shareInstance] // 设置RongCloud群组信息数据源
这2处是决定 以后 好友信息
和群组信息
展示的重要因素,下面会介绍 这2个数据源的代理方法
三、获取 Token
- 基本配置设置完毕后.接着需要和融云建立连接了.在建立连接前.需要获取您账号对应的
Token (Token 即用户令牌,相当于您 APP 上当前用户连接融云的身份凭证。)
- 每个账号都有自己对应的
Token
,是需要自己服务器配置的, 通过调用自己服务器接口获取的, 在拿到账号对应的Token
之后,就可以进行融云连接了.代码如下:
/** 融云连接 */
- (void)rongCloudConnect{
NSString * ImToken = “根据服务器接口获取”
[[RCIM sharedRCIM]connectWithToken:ImToken success:^(NSString *userId) {
// 连接成功后.融云会返回 用户的UserId,并创建RCUserInfo
RCUserInfo *currentUserInfo = [[RCUserInfo alloc]initWithUserId:userId name:”昵称” portrait:@“头像地址”];
// 告诉融云当前登录用户的基本信息,账号Id,头像地址,和昵称
[RCIMClient sharedRCIMClient].currentUserInfo = currentUserInfo;
// 同步好友信息,根据项目需求
[RCDDataSource syncFriendList:^(NSArray *friends) {}];
// 同步群组信息,,根据项目需求
[RCDDataSource syncGroups];
} error:^(RCConnectErrorCode status) {
NSLog(@"rongcloud连接错误%ld",(long)status);
} tokenIncorrect:^{
NSLog(@"token错误或者过期");
}];
}
做完以上操作, 和融云的连接,就算建立完成了.
补充一下
: 如果前期后台服务器没有集成融云, 还获取不到账号对应的Token
自己可以 去融云官网,在自己的应用中获取 调试Token,如下图
选择获取Token
,输入UserId
和Name
点击提交,即可获取账号对应的Token
,用来测试.
四 、会话列表&&会话详情页面
融云成功建立连接之后, 好友如果发来消息,接下来就是如何展示 会话列表
和 会话详情页面
了 融云提供了2个 类
RCConversationListViewController // 会话列表
RCConversationViewController // 会话详情页面
4.1 会话列表
融云 IMKit 已经实现了一个默认的会话列表视图控制器,您直接使用或继承 RCConversationListViewController
,即可快速启动和使用会话列表界面。
在 viewDidLoad
中设置需要显示的会话类型,需要将哪些类型的会话聚合显示。
- (void)viewDidLoad {
[super viewDidLoad];
//设置需要显示哪些类型的会话
[self setDisplayConversationTypes:@[@(ConversationType_PRIVATE),
@(ConversationType_DISCUSSION),
@(ConversationType_CHATROOM),
@(ConversationType_GROUP),
@(ConversationType_APPSERVICE),
@(ConversationType_SYSTEM)]];
//设置需要将哪些类型的会话在会话列表中聚合显示
[self setCollectionConversationType:@[@(ConversationType_DISCUSSION),
@(ConversationType_GROUP)]];
}
以上代码实现了.可以实现基本的聊天列表显示,.如果有好友消息进来,会在 会话列表
显示 聊天信息了,如图:
4.2会话详情页面
融云IMKit
中已经实现了完整的会话页面,包含发送、接收、更新等 UI,并覆盖常用的 IM 交互场景,您直接使用或继承RCConversationViewController
,即可快速启动和使用会话页面。
如下面的例子,创建一个 RCConversationViewController 对象并设置好会话类型、目标会话 ID,显示即可进行聊天。
/** 点击进入会话界面 */
-(void)onSelectedTableRow:(RCConversationModelType)conversationModelType conversationModel:(RCConversationModel *)model atIndexPath:(NSIndexPath *)indexPath{
//在这个方法中需要用到 聊天界面类 RCConversationViewController
RCConversationViewController *chat = [RCConversationViewController alloc] initWithConversationType:conversationType targetId:targetId];
//设置会话的类型,如单聊、讨论组、群聊、聊天室、客服、公众服务会话等
chat.conversationType = ConversationType_PRIVATE;
//设置会话的目标会话ID。(单聊、客服、公众服务会话为对方的ID,讨论组、群聊、聊天室为会话的ID)
chat.targetId = @"targetIdYouWillChatIn";
//设置聊天会话界面要显示的标题
chat.title = @"想显示的会话标题";
//显示聊天会话界面
[self.navigationController pushViewController:chat animated:YES];
}
}
五、好友/群组的 头像、昵称、群组名称信息展示异常问题
在集成了以上代码后,如果好友发来信息,可能会发现会话列表用户头像和昵称为空
或者聊天页面用户头像昵称为空
,因为融云是不去管理用户的头像以及昵称的,需要自己去维护,融云提供的逻辑图 如下:
通过上图.可以知道: 好友发来信息后.融云会先从缓存中获取好友的头像及昵称信息 .如果缓存没有 则会调用 代理方法 ,代理设置如下:
[RCIM sharedRCIM].userInfoDataSource = RCDDataSource; // 设置RongCloud用户信息数据源
这就是文章最开始说的,需要设置用户信息数据源,融云会调用改方法,来获取 好友的头像以及昵称信息
/*!
获取用户信息
@param userId 用户ID
@param completion 获取用户信息完成之后需要执行的Block
@param userInfo(in completion) 该用户ID对应的用户信息
@discussion SDK通过此方法获取用户信息并显示,请在completion中返回该用户ID对应的用户信息。
在您设置了用户信息提供者之后,SDK在需要显示用户信息的时候,会调用此方法,向您请求用户信息用于显示。
*/
- (void)getUserInfoWithUserId:(NSString *)userId
completion:(void (^)(RCUserInfo *userInfo))completion;
如果群组头像和群名称不显示.通上.需要实现如下数据源方法:
/*!
获取群组信息
@param groupId 群组ID
@param completion 获取群组信息完成之后需要执行的Block
@param groupInfo(in completion) 该群组ID对应的群组信息
@discussion SDK通过此方法获取用户信息并显示,请在completion的block中返回该用户ID对应的用户信息。
在您设置了用户信息提供者之后,SDK在需要显示用户信息的时候,会调用此方法,向您请求用户信息用于显示。
*/
- (void)getGroupInfoWithGroupId:(NSString *)groupId
completion:(void (^)(RCGroup *groupInfo))completion;
以上操作都执行完毕, 好友和群组的聊天就基本都实现了.头像和昵称也可以正常显示了
六、应用内部业务逻辑
最后说一下 好友的申请、同意、删除、以及群组的创建、删除、添加成员等业务逻辑操作 融云是不处理的.需要自己服务器提供接口,自己来维护和管理了.融云只是提供一个通讯的功能.
注
:一些添加好友,或者一些系统消息,服务器可以通过融云平台来消息推送