上篇文章讲了怎么自定义消息和自定义消息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即可。