融云RCIMKit使用小结

作者: 马铃薯蜀黍 | 来源:发表于2016-11-13 16:41 被阅读1224次
    11111.gif

    目录:
    1.会话列表页没有回话聊天的时候显示内容自定义
    2.实现收到消息时候,位于tabbar自定义小红点的出现(并及时出现)
    3.#import "IQKeyboardManager.h"与会话聊天键盘弹出的冲突
    4.介绍一个做的时候比较麻烦的功能,关于消息的处理与查看的消息小红点
    5.当首次进入聊天时候,默认发送一条信息

    1.会话列表页没有回话聊天的时候显示内容自定义

    对比图

    只需要在继承了RCConversationListViewController这个类中,赋值这个emptyConversationView属性即可

    - (void)setupEmptyConversationView {
        
        UIImageView *emptyImageView = [[UIImageView alloc] init];
        emptyImageView.image = [UIImage imageNamed:@"facai"];
        emptyImageView.size = CGSizeMake(kScreenWidth, kScreenHeight);
        emptyImageView.center = self.view.center;
        UIView * emptyView = [[UIView alloc] initWithFrame:self.view.bounds];
        UILabel * emptyLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 350, 200, 50)];
        emptyLabel.text = @"都没有人跟我聊天";
        UILabel * emptyLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(55, 200, 200, 50)];
        emptyLabel1.text = @"蓝瘦~";
        UILabel * emptyLabel2 = [[UILabel alloc] initWithFrame:CGRectMake(20, 250, 200, 50)];
        emptyLabel2.text = @"香菇~~";
        [emptyView addSubview:emptyImageView];
        [emptyView addSubview:emptyLabel];
        [emptyView addSubview:emptyLabel1];
        [emptyView addSubview:emptyLabel2];
        self.emptyConversationView = emptyView;
    }
    

    当然这是非常简单的功能甚至在融云开发文档中com + f 搜索关键字就能找到

    2.实现收到消息时候,位于tabbar自定义小红点的出现(并及时出现)

    小红点的消失与出现 | 项目隐私做了遮挡

    本人这里的实现是直接在tabbar上添加的原点图片只要调整好frame完全没有问题,而且采用[tabbar addSubView]的方法不用担心每次收到消息都会覆盖添加的问题,所以移除的时候也是只需要移除一次就可以

    // 创建imageView
    _imageViewMessage = [[UIImageView alloc] init];
        _imageViewMessage.frame = CGRectMake(kScreenWidth * 0.5, 8, 10, 10);
        [_imageViewMessage setImage:[UIImage imageNamed:@"jindudian"]];
    
    /// 接收到融云消息时调用
    - (void)addRcMessage {
        if (self.selectedIndex == 2) {
            return;
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [self.tabBar addSubview:_imageViewMessage];
        });
    }
    
        /// 其他地方处理融云消息,移除tabbar上的小红点
        [[NSNotificationCenter defaultCenter] addObserverForName:KRCMessageOver object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
            [_imageViewMessage removeFromSuperview];
        }];
    

    这里的重点就是一定要利用线程才能达到及时添加的效果, 否则大概每次出现UI上的更新要有30s的延迟,个人猜测这个可能和运行循环有关,所以这里加线程来做就可以了.关于接收消息会调用的方法,大家看融云的开发文档就可以了,而且如果你想加上数字角标也是可以的.self.tabBarItem.badgeValue = @"3";

    ps:这里贴一个自己查资料时候的小乌龙 .. 算是绝处逢生吧

    这个时间...
    心里苦啊
    3.记录一个自己遇到的犯二的小点,关于#import "IQKeyboardManager.h"这个是很好用的框架具体使用方法的帖子介绍
    导入IQKeyboardManager后,默认所有的页面都有了这个功能,如果你在哪一个界面不想有这个效果可以在当前界面控制器的生命周期方法中进行设置:
    #import <IQKeyboardManager.h>
    
    - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated]; 
    [IQKeyboardManager sharedManager].enable = NO;
    }
    - (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
     [IQKeyboardManager sharedManager].enable = YES;
    }
    
    

    这里需要自定义一个继承RCConversationViewController的类MKConversationViewController进行跳转并在自定义的类的视图生命周期里写上面的方法

    //重写RCConversationListViewController的onSelectedTableRow事件
    - (void)onSelectedTableRow:(RCConversationModelType)conversationModelType
             conversationModel:(RCConversationModel *)model
                   atIndexPath:(NSIndexPath *)indexPath {
        NSLog(@"%@%@",model.conversationTitle,model.targetId);
        RCConversationViewController *conversationVC = [[MKConversationViewController alloc]init];
        conversationVC.conversationType = model.conversationType;
        conversationVC.targetId = model.targetId;
        conversationVC.title = model.conversationTitle;
        [self.navigationController pushViewController:conversationVC animated:YES];
    }
    

    4.这里介绍一个做的时候比较麻烦的功能,就是关于消息的处理与查看

    注意右上角的小红点和tabbar小红点 | 保护项目隐私这里做了遮挡

    这是一个个人感觉比较麻烦的处理地方,因为要实现一旦接受到消息所有界面右上角的聊天入口都要显示小红点,而且任意一个界面进入消息列表页面查看过消息,其他页面的小红点都要消失,就像gif图里这种效果,当然这是一个不是很完美的效果,按照QQ微信这种做法应该是进入到具体的消息会话中消息提醒才会消息,这里做的是只要进入到消息列表页就视为消息查看过的状态取消小红点.

    a,发送消息的时机,当我们的聊天列表页面出现在与我们的主Window重合的时候就可以视为跳转到了此页面,即相当于此消息已处理,发送一个通知消息供其他页面接收做UI上的处理

    /// 判断聊天页面是不是跟主窗口重叠 ,如果是就发送已经处理了信息的消息
    - (void)setupMessageRead {
        
        CGRect windowRect = [UIApplication sharedApplication].keyWindow.bounds;
        CGRect myViewRect = [self.view convertRect:self.view.bounds toView:nil];
        BOOL overlap = CGRectIntersectsRect(windowRect, myViewRect);
        if (overlap) {
            //        NSLog(@"======chongdie ====重叠 ====");
            [[NSNotificationCenter defaultCenter] postNotificationName:KRCMessageOver object:nil];
        }
    }
    

    这里涉及到坐标系转换的方法来判断是否跳转相关页面,很方便

    b.给要跳转的页面增加一个BOOL属性来判断消息处理的情况,达到第一次进入界面的时候做是否有红点的处理

    // 判断是否有为添加的新消息 调整rightItembar
    @property(assign,nonatomic ) BOOL messageNew;
    -----------------------
        /// 融云监听是否改变聊天入口的状态
        [[NSNotificationCenter defaultCenter] addObserverForName:KRCMessage object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            self.messageNew = YES;
        }];
        /// 融云监听是否改变聊天入口的状态
        [[NSNotificationCenter defaultCenter] addObserverForName:KRCMessageOver object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            self.messageNew = NO;
        }];
        /// 融云信息查看传到下一个界面
        details.messageNew = self.messageNew;
        [self.navigationController pushViewController:details animated:YES];
    
    

    c.然后在即将显示的见面里通过_messageNew这个BOOL值做处理

    ///  导航栏根据融云消息按钮
        if (self.messageNew) {
            
            _message = [UIBarButtonItem BarButtonItemWithBackgroudImageName:@"xiaoxitixing" highBackgroudImageName:nil target:self action:@selector(messageCenter)];
        }else {
            
            _message = [UIBarButtonItem BarButtonItemWithBackgroudImageName:@"xiaoxi" highBackgroudImageName:nil target:self action:@selector(messageCenter)];
        }
        self.navigationItem.rightBarButtonItem = _message;
    
    

    这里做的是切换rightBarButtonItem的图片,不再是加小圆点了.效果是一样的.

    d.实时监听页面消息的变化

        /// 融云消息实时改变UIBarButtonItem的显示
        [[NSNotificationCenter defaultCenter] addObserverForName:KRCMessage object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            [self setupRCMessageImageDetail];
        }];
        [[NSNotificationCenter defaultCenter] addObserverForName:KRCMessageOver object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
            [self readRCMessageImageDetail];
        }];
    
    /// 未查看消息要做的事.| 同样在改变`rightBarButtonItem`时候也要注意线程
    - (void)setupRCMessageImageDetail {
        dispatch_sync(dispatch_get_main_queue(), ^{
        
            _message = [UIBarButtonItem BarButtonItemWithBackgroudImageName:@"xiaoxitixing" highBackgroudImageName:nil target:self action:@selector(messageCenter)];
        });
    }
    
    /// 已查看消息要做的事.
    - (void)readRCMessageImageDetail {
        
        _message = [UIBarButtonItem BarButtonItemWithBackgroudImageName:@"xiaoxi" highBackgroudImageName:nil target:self action:@selector(messageCenter)];
        
    }
    
    

    e.移除通知

    #pragma mark - 移除通知
    - (void)dealloc {
        
        [[NSNotificationCenter defaultCenter] removeObserver:self name:KRCMessageOver object:nil];
        [[NSNotificationCenter defaultCenter] removeObserver:self name:KRCMessage object:nil];
        NSLog(@"===详情页死了====");
    }
    

    5.当首次进入聊天时候,默认发送一条信息,比如我们需要知道买家查看的哪个商品并从哪个商品的详情进入到与卖家的聊天的,这样方便知道买家对哪个商品感兴趣

    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
        //判断是否与刚刚查看的商品是同一个,避免每次进入都发送同样的内容
        if (self.isSame) {
            return;
        }
        RCTextMessage * text = [RCTextMessage new];
        text.content = [NSString stringWithFormat:@"正在查看: %@  价格: %@元/米",_modell.group_title,_modell.group_price];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            [self sendMessage:text pushContent:@"远程推送消息"];
        });
    }
    

    上面这个是我在百度查到的因为官方文档里这里有个坑,如下:

    这里提示消息要和发送的消息区分开

    这里提示消息要和发送的消息区分开,因为提示消息仅仅买家能够看得到,仅仅相当于给买家一个提示,而并非也会发给卖家

    到此基本完成了.整体思路仅供参考交流,暂无demo.大神勿喷.如有不足或者错误望斧正.原创,转载请注明.

    相关文章

      网友评论

      • 香橙柚子:你能发个demo吗
      • overla5:你好,我们项目本来别人写的,lib和kit都导入了。收到消息的回调都不走。。:joy:怎么破。有demo吗?借读
        overla5:@马铃薯蜀黍 发,可以收到推送。但是在app打开的时候,不走回调,还请帮忙。是不是要把lib删了?或者说你那边接受消息,更新ui走什么回调可以告诉我一下吗
        马铃薯蜀黍:@失格人间 没有你的项目里能发消息还是说只是接收消息不能收到?
      • 小默森:最近在做lib
        马铃薯蜀黍:@万能森森 lib的聊天记录好像也不能免费用吧,都是只能保留几天,长期保留得花钱..好像是.
        小默森:@马铃薯蜀黍 不知道公司咋想的,要用聊天记录,还不想掏钱,太难了,各种坑
        马铃薯蜀黍:@万能森森 感觉那个比较难吧,为什么不用kit

      本文标题:融云RCIMKit使用小结

      本文链接:https://www.haomeiwen.com/subject/cldcpttx.html