// 注册成为开发者 创建自己的app 获取AppKey
// 按照融云的集成步骤集将IMKit 集成至自己的App 内
// iOS 快速集成 http://www.rongcloud.cn/docs/ios.html
// 融云官网 http://www.rongcloud.cn
// 集成时遇到的问题
- 发送者 和 被发送者的头像及用户名信息显示问题
刚开始以为是在融云官网创建测试账号填写测试账号的name 和 头像url 后,使用测试账号token 进行登录时融云会自动获取用户及聊天对象的详细信息(头像url 及 用户名),后来发现融云并不会主动帮用户获取这些详细信息 而是给用户提供了接口需要用户将信息返回给指定接口 , 融云接收到用户传递的信息后会去刷新UI (填充用户名和 头像信息)
[[RCIM sharedRCIM] connectWithToken:token success:^(NSString *userId) {
//设置用户信息提供者(最近联系人及聊天界面需要用到的用户名和头像链接都会从代理方法获取)
[[RCIM sharedRCIM] setUserInfoDataSource:self];
// 可能建立连接时是在子线程需要回到主线程
// 若不回到主线程会导致界面无法跳转
dispatch_async(dispatch_get_main_queue(), ^{
// 登录成功后跳转到 最近联系的好友界面
ChatListViewController *chatListViewController = [[ChatListViewController alloc]init];
chatListViewController.hidesBottomBarWhenPushed = YES ;
[self.navigationController pushViewController:chatListViewController animated:YES];
});
} error:^(RCConnectErrorCode status) {
NSLog(@"login error status: %ld.", (long)status);
} tokenIncorrect:^{
NSLog(@"token 无效 ,请确保生成token 使用的appkey 和初始化时的appkey 一致");
}];
// 实现获取最近联系人及聊天界面需要用到的用户名和 头像信息的代理方法
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void(^)(RCUserInfo* userInfo))completion
{
// 所有的用户名 和 头像url 信息均需要通过自己的服务器去获取
// 登录用户的id 请替换成自己的id
NSString *myid = [GetUserInfo getUserID];
if ([userId isEqualToString:myid]) {
// 返回登录用户的详细信息
NSString *picUrl = [GetUserInfo getUserPic];
NSString *name = [GetUserInfo getUseName];
RCUserInfo *user = [[RCUserInfo alloc]init];
user.userId = myid;
user.name = name ;
user.portraitUri = picUrl ;
return completion(user);
}else{
// 返回除登录用户以外 其它聊天对象的信息
// 注意 如果是通过服务器 获取用户信息 可以在 为获取前设置默认的返回值 // 获取到返回值后 重新调用融云的接口刷新用户信息
NSString *path = [[NSBundle mainBundle] pathForResource:@"default_avator" ofType:@".png"];
user.userId = userId ;
user.name = userId ;
user.portraitUri = path ;
completion(user);
[UserInfoWebManage getUserInfoWithUserId:userId WithSuccess:^(NSDictionary *dic) {
// 获取到信息后刷新用户信息
RCUserInfo *user = [[RCUserInfo alloc]init];
user.userId = userId ;
user.name = userId ;
user.portraitUri = path ;
return completion(user);
} filure:^(NSError *error) {
// 获取用户信息失败
}];
}
}
2 在聊天界面中点击下方工具条上的加号 可以选择发送照片 拍照 及发送位置信息的功能 如果某项功能不需要可以通过以下方法删除
// 自己创建聊天界面控制器 要继承 RCConversationViewController
// 然后在viewDidLoad 方法中 添加以下代码
[self.chatSessionInputBarControl.pluginBoardView removeItemAtIndex:index];
3 添加badageNum
3.1 tabbar 加载的时候设置badageNum
3.2 接收到新消息后更新badageNum
3.3阅读消息后重设badageNum
// 获取未读消息个数
// 在需要获取未读消息个数的类中引入融云头文件
#import <RongIMKit/RongIMKit.h>
// 获取未读消息个数的方法
-(NSInteger)getUnreadCount{
int unreadMsgCount = [[RCIMClient sharedRCIMClient] getUnreadCount:@[
@(ConversationType_PRIVATE),
@(ConversationType_DISCUSSION),
@(ConversationType_APPSERVICE),
@(ConversationType_PUBLICSERVICE),
@(ConversationType_GROUP)
]];
return unreadMsgCount ;
}
// 收到消息重设badageNum 实现监听接收信息的代理方法 程序内收到消息会调用代理方法
//遵守协议
RCIMReceiveMessageDelegate
// 设置代理
[[RCIM sharedRCIM] setReceiveMessageDelegate:self];
// 实现代理方法 在代理方法中处理UI 要回到主线程进行操作,刚开始没有在主线程操作设置badageNum会有很长的延时控制台会有警告出现
-(void)onRCIMReceiveMessage:(RCMessage *)message left:(int)left{
dispatch_async(dispatch_get_main_queue(), ^{
[self setBadageNum];
});
}
-(void)setBadageNum{
NSInteger unreadMessageCount = [self getUnreadCount];
// 设置tabbar 的icon
UITabBarController *tabbar = (UITabBarController *)[UIApplication sharedApplication].keyWindow.rootViewController ;
if ([tabbar isKindOfClass:[UITabBarController class]]) {
UITabBarItem *item = [tabbar.tabBar.items objectAtIndex:1];
// 如果没有未读消息返回值为nil
if (unreadMessageCount == 0 || unreadMessageCount == nil) {
item.badgeValue = nil ;
return ;
}
item.badgeValue = [NSString stringWithFormat:@"%d",unreadMessageCount];
}
}
3.2 阅读消息后重设badage 只需要在需要的地方调用setBadageNum 方法即可