项目中包含直播通讯聊天以及客服聊天功能,在这里我集成了融云即时通讯的sdk,当然了,也碰到了相应的坑点,在这里记录一下。
1.导入sdk包
在这里我用的是cocoapods导入的,简单无污染,最重要的是不用配置任何环境变量,舒服!
pod 'RongCloudIM/IMLib', '~> 2.8.3'
pod 'RongCloudIM/IMKit', '~> 2.8.3'
在这里一定要导入这两个,再也不要只导入一个了,因为IMLib负责通讯,但是IMKit负责界面,如果以后需要添加新功能的话,IMKit是包含于IMLib的,最好两个都导入。
2.初始化
问题:我一开始初始化如下
[[RCIMClient sharedRCIMClient] initWithAppKey:RONGYUNAPPKEY];
后来改成了
[[RCDLive sharedRCDLive] initRongCloud:RONGYUNAPPKEY];
但是,如果项目里用到了界面的东西,比如客服聊天这块,这样初始化是无法自动更新消息的,所以要用到IMKit包的初始化
[[RCIM sharedRCIM] initWithAppKey:RONGYUNAPPKEY];
用IMKit包初始化,前台接受消息默认会有声音,关掉声音如下
[[RCIM sharedRCIM] setDisableMessageAlertSound:YES];//关掉声音
3.链接token
在这里用IMKit包方法连接token,其实用IMLib包貌似也是没问题的,这里不赘述。
[[RCIM sharedRCIM] connectWithToken:token success:^(NSString *userId) {
JJLog(@"successtOKEN == %@",userId);
AccountModel *model = [AccountTool account];
model.RYUserID = userId;
[AccountTool saveAccount:model];
//登录成功后,与融云建立连接,设置聊天人的属性
RCUserInfo *user = [[RCUserInfo alloc]init];
user.userId = [AccountTool account].RYUserID;
// user.portraitUri = @"logo_red_ry";
user.portraitUri = [AccountTool account].portraitUri;
// user.name = @"大圣归来";
user.name = [AccountTool account].name;
[RCIMClient sharedRCIMClient].currentUserInfo = user;
} error:^(RCConnectErrorCode status) {
} tokenIncorrect:^{
}];
4.融云即时通讯(直播聊天部分)
在这里,可以直接去官网下载给的demo,基本上可以按照他上面的来写,但是有一个问题是,demo上用的是IMLib包来接收消息的,这个时候,你在appdelegate中只有将融云初始化写成
[[RCDLive sharedRCDLive] initRongCloud:RONGYUNAPPKEY];
才可以正常和别人聊天,否则永远只有你自己在聊天。
但是我们上面的初始化也说了,要照顾到以后还会有别的拓展性功能,所以我们没有用到IMLib包,用了IMKit包的话,我们就要修改这里通讯接收消息的方法。具体如下:
1.原demo中,在当前聊天界面,设置了消息监听代理代码如下
[[RCIMClient sharedRCIMClient]setRCConnectionStatusChangeDelegate:self];
现在要改成IMKit包中的监听代理,如下:
[[RCIM sharedRCIM] setConnectionStatusDelegate:self];
2.再更改了代理后,需要实现代理方法中的IMKit连接状态的的监听器方法
将原demo中的
/**
* 连接状态改变的回调
*
* @param status <#status description#>
*/
- (void)onConnectionStatusChanged:(RCConnectionStatus)status {
self.currentConnectionStatus = status;
}
修改成
- (void)onRCIMConnectionStatusChanged:(RCConnectionStatus)status {
self.currentConnectionStatus = status;
}
3.在当前聊天界面中,找到注册监听Notification的方法,原demo方法如下
- (void)registerNotification {
//注册接收消息
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(didReceiveMessageNotification:)
name:RCDLiveKitDispatchMessageNotification
object:nil];
}
很明显看到RCDLiveKitDispatchMessageNotification通知名是IMLib包中的东西,所以要改成如下:
/**
* 注册监听Notification
*/
- (void)registerNotification {
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(didReceiveMessageNotification:)
name:RCKitDispatchMessageNotification
object:nil];
}
好了,其余的包括接收历史消息,发送消息,退出断开连接的都用原dmeo中的即可,不用更改。
5.融云客服功能
融云客服功能用到的包就是IMKit包的内容,在这里界面的UI我们用到了demo中给的UI部分的代码,由于demo中的代码太多,在这里我单独将我们需要的聊天界面代码给抽了出来,点击下载 。然后直接贴上如下代码即可
[[RCIM sharedRCIM] setReceiveMessageDelegate:self];
RCDCustomerServiceViewController *chatService = [[RCDCustomerServiceViewController alloc] init];
#define SERVICE_ID @"您在融云后台开通的客服ID"
chatService.hidesBottomBarWhenPushed = YES;
chatService.conversationType = ConversationType_CUSTOMERSERVICE;
chatService.targetId = RONGYUNKEFUID;
chatService.title = @"客服服务";
RCCustomerServiceInfo *csInfo = [[RCCustomerServiceInfo alloc] init];
csInfo.nickName = [AccountTool account].name;
csInfo.portraitUrl = [AccountTool account].portraitUri;
chatService.csInfo = csInfo; //用户的详细信息,此数据用于上传用户信息到客服后台,数据的nickName和portraitUrl必须填写。(目前该字段暂时没用到,客服后台显示的用户信息是你获取token时传的参数,之后会用到)
[self.viewController.navigationController pushViewController :chatService animated:YES];
基本上没有什么bug了。
再有什么问题,可以去融云的知识库中查询一下。
总结:其实融云最坑的不是代码难易的问题,而是多种功能用的不同的包的问题,在这里由于项目中用到了这两种包的东西,在这里碰到了坑,总结了一下。写的可能不是对每个人都有帮助,如果你也赞同的话,请给我点个赞,如果你有问题的话,可以留言告诉我。