一、 融云设置头像和昵称
1. 给自己设置头像和昵
给自己设置头像和昵称的时候,一般都是在所有要要登录融云的地方(我公司项目有几种登录方式,每一种登录成功后,才可以连接融云,所以有几个地方调用到),登录成功后就给自己设置头像和昵称的。
// 连接融云
[[RCIM sharedRCIM] connectWithToken:@"LqWuHyw639I+N/NxLK1vgd364tkAAG9LQ/noLNtW9iD4dLdnOfiMK/5rEO5+6+EyUkCYC8DW6mAOpABTN7DJlB4S8yEP3s3V" success:^(NSString *userId) {
NSLog(@"登陆成功。当前登录的用户ID:%@", userId);
[[RCIM sharedRCIM] setUserInfoDataSource:self];
RCUserInfo *myUser = [[RCUserInfo alloc]init];
myUser.userId = @"#123456";
myUser.portraitUri = @"http://p2.wmpic.me/article/2014/09/26/1411703269_MyeEjKTf.jpeg";
myUser.name = @"自己";
[RCIM sharedRCIM].currentUserInfo = myUser;
} error:^(RCConnectErrorCode status) {
NSLog(@"登陆的错误码为:%ld", status);
} tokenIncorrect:^{
//token过期或者不正确。
//如果设置了token有效期并且token过期,请重新请求您的服务器获取新的token
//如果没有设置token有效期却提示token错误,请检查您客户端和服务器的appkey是否匹配,还有检查您获取token的流程。
NSLog(@"token错误");
}];
2. 给其他人设置头像和昵称
融云给了一个代理让我们给相应的用户ID赋值头像,这个代理是只要有新的用户ID给你发消息,就会走一次的,数据源是全局的只需要在一个地方赋值,其他地方就不用赋值了,我这里是在Appdelegate做的
①添加代理
@interface AppDelegate ()<RCIMUserInfoDataSource>
②设置代理
[[RCIM sharedRCIM] setUserInfoDataSource:self];
③实现代理
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *))completion {
if ([userId isEqualToString:@"#11111"])
{
RCUserInfo *userInfo = [[RCUserInfo alloc]init];
userInfo.userId = userId;
userInfo.name = @"小美";
userInfo.portraitUri = @"http://www.hinews.cn/pic/0/16/23/56/16235619_993606.jpg";
return completion(userInfo);
}
else if([userId isEqualToString:@"#22222"])
{
RCUserInfo *otherUser = [[RCUserInfo alloc]init];
otherUser.userId = userId;
otherUser.portraitUri = @"http://img.jf258.com/uploads/2013-07-13/064651670.jpg";
otherUser.name = @"大头";
return completion(otherUser);
}
else if ([userId isEqualToString:@"#33333"])
{
RCUserInfo *otherUser = [[RCUserInfo alloc]init];
otherUser.userId = userId;
otherUser.portraitUri = @"http://p2.wmpic.me/article/2014/09/26/1411703269_MyeEjKTf.jpeg";
otherUser.name = @"客服1";
return completion(otherUser);
}
//上面三组是测试用的,实际开发的时候应该是后台提供一条接口,传入Userid 能够返回对应Userid 的昵称和头像
[manager POST:kGetUserBaseInfo parameters:parameter progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSDictionary *repData = (NSDictionary *)responseObject;
UCUNewBaseClass *baseData = [UCUNewBaseClass modelObjectWithDictionary:repData];
if ([baseData.status isEqualToString:xRequestStatusOK])
{
RCUserInfo *userInfo = [[RCUserInfo alloc]init];
userInfo.userId = baseData.data.dataIdentifier;
userInfo.name = baseData.data.nickName;
userInfo.portraitUri = baseData.data.profilePhoto;
// 刷新融云对应用户信息 ,一定要记得写上这句代码,否则无法刷新,因为是异步的
[[RCIM sharedRCIM] refreshUserInfoCache:userInfo withUserId:userId];
return completion(userInfo);
}
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];
}
二、所有未读消息的显示
不管你集成多简单的单聊都会跟着要集成一个会话列表的,有了会话列表就要做所有的对话未读的信息数量,会话列表就不用多说了,看官网就可以集成,现在主要说说如何显示未读信息数。
从官网的文档上可以知道,通过下面这个方法可以获取所有的未读消息数,是动态的,
int totalUnreadCount = [[RCIMClient sharedRCIMClient] getTotalUnreadCount]
获得的未读消息数,什么时候去刷新未读消息数呢,SDK 提供了两个代理分别是代理①和代理②,可以监听什么时候有消息过来。者两个代理长得很像,如果用错了,将会导致严重的 bug , 会话界面用户将不能主动接受消息,如果你是集成的 IMKit 的东西,就不要用代理②,一定要用代理①,一定要用代理①,一定要用代理①!!!
代理①
<RCIMReceiveMessageDelegate>
[[RCIM sharedRCIM] setReceiveMessageDelegate:self];
- (void)onRCIMReceiveMessage:(RCMessage *)message left:(int)left {
// 这个代理是在分线层的, 刷新数据要在主线程进行哦,我的工程未读消息是在一个 cell 上的,所以我刷新数据就可以了。
dispatch_async(dispatch_get_main_queue(), ^{
[self.mainTableView reloadData];
});
}
代理②
<RCIMClientReceiveMessageDelegate>
[[RCIMClient sharedRCIMClient] setReceiveMessageDelegate:self object:nil];
- (void)onReceived:(RCMessage *)message left:(int)nLeft object:(id)object {
}
三、 集成客服
官网写的很简单,我就按照官网的写了,可是不管是机器人,还是人工的按钮,为啥都不会跳出来呢,客服ID 也没有写错,原来是当你去融云后台开通客服后,至少要等上2个小时甚至是半天才能生效,生效之后你点击聊天,就会有个蠢蠢的机器人跟你聊天了,当你在客服后台登录账号之后,即可以测试人工聊天啦
- (IBAction)serviceBtnClicked:(id)sender {
RCConversationViewController *conversationVC = [[RCConversationViewController alloc]init];
conversationVC.conversationType = ConversationType_CUSTOMERSERVICE;
#define SERVICE_ID @"KEFU152332895163221"
conversationVC.targetId = SERVICE_ID;
conversationVC.title = @"客服";
self.tabBarController.tabBar.hidden = YES;
[self.navigationController pushViewController:conversationVC animated:YES];
}