融云三(自定义红包状态)

作者: 蚯小麦 | 来源:发表于2018-07-11 14:30 被阅读1次
上篇文章讲了怎么自定义消息和自定义消息cell,这篇讲解怎么模拟红包发送和领取的思路!
  • 首先是发送和领取红包的逻辑
    1. 发送者 --> 发送红包 --> 发送者会话界面增加一条数据。
    2.  接收方 --> 收到红包 --> 接受者会话界面增加一条数据。
    3. 接收方点击红包进行接收 --> 接收成功 --> 发送一条红包已接收的消息 -->    
     -->   会话界面发送者发送的那条红包消息的状态变更为已领取。
    4. 发送者接收到接收方 --> 红包已接收的消息 --> 同时会话界面发送者那条红    
       包消息变更为已领取。
    
红包接收
  • 接下来就是看具体实现了。

这其中我们规定消息的附加字段extra的格式为 0/messageUId 1/messageUId
其中0 ,1各代表红包未领取和红包领取的状态,而messageUId是服务器消息唯一ID(在同一个Appkey下全局唯一),我们用它来找到数据库中需要变更状态的那条消息。

  • 1,首先我们发送一条消息
 HongBaoMessage *mes = [[HongBaoMessage alloc] init];
        mes.senderUserInfo = [RCIM sharedRCIM].currentUserInfo;
        mes.money = @"4000";
        mes.extra = @"0";
        [[RCIM sharedRCIM] sendMessage:ConversationType_PRIVATE targetId:self.targetId content:mes pushContent:nil pushData:nil success:^(long messageId) {
            
        } error:^(RCErrorCode nErrorCode, long messageId) {
            
        }];
  • 2, 然后在接收到我们点击这个红包准备领取的时候,需要拿到这条消息的messageUId,并且发送一条已经领取的消息
HongBaoMessage *mes = [[HongBaoMessage alloc] init];
        mes.senderUserInfo = [RCIM sharedRCIM].currentUserInfo;
        mes.money = @"已收到4000钱";
        mes.extra = [NSString stringWithFormat:@"1/%@",model.messageUId];
        
        [[RCIM sharedRCIM] sendMessage:ConversationType_PRIVATE targetId:self.targetId content:mes pushContent:nil pushData:nil success:^(long messageId) {
            
            RCMessage *oldMess = [[RCIMClient sharedRCIMClient] getMessageByUId:model.messageUId];
            [[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra];
            dispatch_sync(dispatch_get_main_queue(), ^{
                for (RCMessageModel *model in self.conversationDataRepository) {
                    if (model.messageId == oldMess.messageId) {
                        HongBaoMessage *oldHongBao = (HongBaoMessage *)model.content;
                        oldHongBao.extra = mes.extra;
                        model.content = oldHongBao;
                    }
                }
                
                [self.conversationMessageCollectionView reloadData];

在上面的方法中,首先,我们拼接extra的格式为1/messageUId,然后我们根据
messageUId拿到会话中的RCMessage对象RCMessage *oldMess = [[RCIMClient sharedRCIMClient] getMessageByUId:model.messageUId];
因为融云不像环信一样可以直接更新某条消息的状态,所以我们只能[[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra];这样去更新一下这个消息的拓展属性。接下来的循环就是去变更发送的那条消息为已领取的状态,实时刷新UI(融云也没有实时更新UI的方法,只能去更改数据源去刷新)。

综上接收方的代码已经完成
接下来我们去看发送方,怎么去更新UI
  • 首先我们要先实现RCIMReceiveMessageDelegate
- (void)onRCIMReceiveMessage:(RCMessage *)message left:(int)left {
    if ([message.content isKindOfClass:[HongBaoMessage class]]) {
        HongBaoMessage *mes = (HongBaoMessage *)message.content;
        NSString *ex = mes.extra;

        NSString *sta = [ex componentsSeparatedByString:@"/"][0];
        NSString *oldMessID = [ex componentsSeparatedByString:@"/"][1];
        if ([sta isEqualToString:@"1"])  {//已接收
            dispatch_sync(dispatch_get_main_queue(), ^{
                RCMessage *oldMess = [[RCIMClient sharedRCIMClient] getMessageByUId:oldMessID];

                for (RCMessageModel *model in self.conversationDataRepository) {
                        if (model.messageId == oldMess.messageId) {
                            HongBaoMessage *oldHongBao = (HongBaoMessage *)model.content;
                            oldHongBao.extra = ex;
                            model.content = oldHongBao;
                        }
                    }
                [[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra];
                
                [self.conversationMessageCollectionView reloadData];
            });
            
        }
    }
}

上面代码表示,首先过滤如果收到的是红包消息,并且判断extra 值,看是否是对方已接收的状态,接下里的处理和接收方的实现一样,直接刷新UI即可。

划重点一定要实现 [[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra]; 这个方法,否则你退出会话,重新进入的时候,发送者的那条消息还是未领取状态,是不会更改的。

打工是不可能的

相关文章

网友评论

    本文标题:融云三(自定义红包状态)

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