融云即时通讯(一)

第一次写文章,用来记录自己研究的融云iOS开发。

http://www.rongcloud.cn/docs/ios.html 这个是官方的文档,看了非常有帮助,有不懂的也可以查询。

(1) 使用cocoa pods导入,使用[[RCIMsharedRCIM]initWithAppKey:AppKey]类方法,连接融云服务器。

(2)[[RCIMsharedRCIM]connectWithToken:APPTokensuccess:^(NSString *userId) {

        NSLog(@"登陆成功。当前登录的用户ID%@", userId);

    } error:^(RCConnectErrorCode status) {

        NSLog(@"登陆的错误码为:%ld", (long)status);

    } tokenIncorrect:^{

        //token过期或者不正确。

        //如果设置了token有效期并且token过期,请重新请求您的服务器获取新的token

        //如果没有设置token有效期却提示token错误,请检查您客户端和服务器的appkey是否匹配,还有检查您获取token的流程。

        NSLog(@"token错误");

    }];

使用上面的方法通过token值登陆,这里要说的是token值要通过请求获取,融云建议的是自己公司的服务器端向融云服务器请求,然后再由app端向自己公司的服务器请求,这是为了安全考虑。在自己测试时可以自己写个请求方法,要注意设置请求头,具体的可以自行百度,也可以使用融云的api调试工具获取token。(提示一下,如果很久以前申请的app应用信息可能会出现请求失败,我就被坑了很久,然后重新申请了一个应用)。

(3)一对一的聊天窗口

    RCConversationViewController *chat = [[RCConversationViewControlleralloc]init];

    //设置会话的类型,如单聊、讨论组、群聊、聊天室、客服、公众服务会话等

    chat.conversationType =ConversationType_PRIVATE;

    //设置会话的目标会话ID。(单聊、客服、公众服务会话为对方的ID,讨论组、群聊、聊天室为会话的ID

    chat.targetId =@"对方的id";

    //设置聊天会话界面要显示的标题

    chat.title =@"想显示的会话标题";

    //显示聊天会话界面

    [self.navigationControllerpushViewController:chatanimated:YES];

使用上面的方法就能进入集成好的聊天页面了

(4)用户的头像和昵称显示

这里融云是没有方法直接获取头像和昵称的数据的,所以我们需要通过自己公司服务器获取和存储数据,然后设置数据。

<RCIMUserInfoDataSource>实现代理

[[RCIMsharedRCIM]setUserInfoDataSource:self];

需要重写这个代理方法

- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *))completion{

        RCUserInfo *userinfo = [[RCUserInfoalloc]init];

        userinfo.userId = userId;

//通过网络请求获取name和URL

        userinfo.name =@“name”;

        NSString *image =@"http://tx.haiqq.com/uploads/allimg/160417/1_041F15KK0L.jpg"; //头像的url

        completion(userinfo);

}

当进入到聊天界面的时候系统会自动调用这个代理方法设置,注意测试的时候使用图片不能太大,不然显示不出来,不要超过200*200,最好是100*100以内

这时候就会显示出头像和昵称了。融云还提供了刷新用户信息的方法,不过只是在推送时用到。

- (void)refreshUserInfoCache:(RCUserInfo *)userInfo withUserId:(NSString *)userId;//通过单例调用

设置当前的用户信息

[RCIMsharedRCIM].currentUserInfo = userinfo;

[RCIMsharedRCIM].globalConversationAvatarStyle =RC_USER_AVATAR_CYCLE;//设置头像是圆形还是方形,默认是方形,聊天列表

[RCIMsharedRCIM].globalConversationPortraitSize =CGSizeMake(50,50);//设置头像大小,默认是46*46,设置时必须大于36*36,否则无效

    [RCIMsharedRCIM].globalMessageAvatarStyle =RC_USER_AVATAR_CYCLE;//聊天对话窗口

[RCIMsharedRCIM].globalMessagePortraitSize = CGSizeMake(50,50);


(5)聊天列表的显示

这里是自己新建一个类 YourTestChatViewController ,继承自RCConversationListViewController

- (void)viewDidLoad {

    //重写显示相关的接口,必须先调用super,否则会屏蔽SDK默认的处理

    [superviewDidLoad];

    

    //设置需要显示哪些类型的会话

    [selfsetDisplayConversationTypes:@[@(ConversationType_PRIVATE),

                                        @(ConversationType_DISCUSSION),

                                        @(ConversationType_CHATROOM),

                                        @(ConversationType_GROUP),

                                        @(ConversationType_APPSERVICE),

                                        @(ConversationType_SYSTEM)]];

    //设置需要将哪些类型的会话在会话列表中聚合显示

    [selfsetCollectionConversationType:@[@(ConversationType_DISCUSSION),

                                          @(ConversationType_GROUP)]];

}


- (void)onSelectedTableRow:(RCConversationModelType)conversationModelType

         conversationModel:(RCConversationModel *)model

               atIndexPath:(NSIndexPath *)indexPath {

    RCConversationViewController *conversationVC = [[RCConversationViewControlleralloc]init];

    conversationVC.conversationType = model.conversationType;

    conversationVC.targetId = model.targetId;

    conversationVC.title =@"想要的title";

    [self.navigationControllerpushViewController:conversationVCanimated:YES];

}

这两个方法是直接融云文档上抄的,还没研究过,不过显示的是一个对话的列表页面。

(6)讨论组和聊天室创建

讨论组

 NSArray *array = [NSArrayarrayWithObjects:@"111",@"123",@"0001",@"0002",nil];

    [[RCIMsharedRCIM] createDiscussion:@"讨论组"userIdList:array success:^(RCDiscussion *discussion) {

        dispatch_sync(dispatch_get_main_queue(), ^{//这个必须是在主线程执行,因为融云的讨论组创建方法是在子线程创建的,所以不调用主线程就不能跳转

            [selfset:discussion];

        });        

    } error:^(RCErrorCode status) {

        NSLog(@"%ld",(long)status);

    }];


- (void)set:(RCDiscussion *)discussion{

    RCConversationViewController *chatRoom = [[RCConversationViewControlleralloc]init];

    chatRoom.conversationType =ConversationType_DISCUSSION;

    chatRoom.targetId = discussion.discussionId;

    chatRoom.title = discussion.discussionName;

    //设置加入聊天室时需要获取的历史消息数量,最大值为50

    chatRoom.defaultHistoryMessageCountOfChatRoom =20;

    [self.navigationControllerpushViewController:chatRoomanimated:YES];

}

聊天室

RCConversationViewController *chat = [[RCConversationViewController alloc]init];

        //设置会话的类型为聊天室

        chat.conversationType = ConversationType_CHATROOM;

        //设置会话的目标会话ID

        chat.targetId = @"123456";

        //设置聊天会话界面要显示的标题

        chat.title = @"聊天室";

        //设置加入聊天室时需要获取的历史消息数量,最大值为50

        chat.defaultHistoryMessageCountOfChatRoom = 20;

        //显示聊天会话界面

        [self.navigationController pushViewController:chat animated:YES];


(7)获取对话列表

NSArray *array = [NSArrayarrayWithObjects:[NSNumbernumberWithInteger:ConversationType_PRIVATE],[NSNumbernumberWithInteger:ConversationType_DISCUSSION],nil];

    NSArray *listArray = [[RCIMClient sharedRCIMClient]getConversationList:array];

(8)扩展功能板块的自定义

首先要新建一个类,继承自RCConversationViewController

- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view.

    [self.pluginBoardView insertItemWithImage:imagePic

                                        title:title

                                      atIndex:0

                                          tag:101];

//    或添加到最后的:

    [self.pluginBoardView insertItemWithImage:imagePic

                                        title:title

                                          tag:101];

//    删除指定位置的方法:

    [self.pluginBoardViewremoveItemAtIndex:0];

//    删除指定标签的方法:

    [self.pluginBoardViewremoveItemWithTag:101];

//    删除所有:

    [self.pluginBoardViewremoveAllItems];

//    更换现有扩展项的图标和标题:

    [self.pluginBoardView updateItemAtIndex:0 image:newImage title:newTitle];

//    或者根据tag来更换

    [self.pluginBoardView updateItemWithTag:101 image:newImage title:newTitle];

}

//重写点击方法

- (void)pluginBoardView:(RCPluginBoardView *)pluginBoardView clickedItemWithTag:(NSInteger)tag{

//系统本来带有3个扩展功能,tag=1001是照片,tag=1002是拍照,tag=1003是定位

    [superpluginBoardView:pluginBoardViewclickedItemWithTag:tag];

    if (tag ==101) {

        //点击事件处理

    }

}

(10)改变聊天背景

在 RCConversationViewController 的继承类的 viewDidLoad 方法中,加入以下代码即可设置聊天界面背景图:

self.conversationMessageCollectionView.backgroundView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"图片名"]];

但是上面的方法在frame变换时会变形,下面可以解决

//设置conversationMessageCollectionView的背景色为透明

    self.conversationMessageCollectionView.backgroundColor = [UIColorclearColor];

    //设置self.view.backgroundColor用自己的背景图片

    self.view.backgroundColor = [UIColorcolorWithPatternImage:[UIImageimageNamed:@""]];

(11)发送消息

- (void)sendMessage:(RCMessageContent *)messageContent pushContent:(NSString *)pushContent; //文字

- (void)sendImageMessage:(RCImageMessage *)imageMessage pushContent:(NSString *)pushContent; //图片

- (void)resendMessage:(RCMessageContent *)messageContent;//重新发送

- (void)deleteMessage:(RCMessageModel *)model;//删除消息


总结一下,使用IMKit框架的话,融云有继承好的RCConversationViewController类,直接调用就可以用,也可以自己写一个类,继承自RCConversationViewController,在用到的方法里面使用[super 。。。]就可以使用融云添加好的方法,后面可以自己添加想要的内容,在聊天界面需要使用的接口操作可以查看RCConversationViewController.h,里面方法介绍很详细也很全面。如果还需要功能只能自己写或者在融云上提交工单,申请开发。




你可能感兴趣的:(融云即时通讯(一))