上篇文章講了怎么自定義消息和自定義消息cell,這篇講解怎么模擬紅包發(fā)送和領(lǐng)取的思路!
-
首先是發(fā)送和領(lǐng)取紅包的邏輯
1. 發(fā)送者 --> 發(fā)送紅包 --> 發(fā)送者會話界面增加一條數(shù)據(jù)。 2. 接收方 --> 收到紅包 --> 接受者會話界面增加一條數(shù)據(jù)。 3. 接收方點擊紅包進(jìn)行接收 --> 接收成功 --> 發(fā)送一條紅包已接收的消息 --> --> 會話界面發(fā)送者發(fā)送的那條紅包消息的狀態(tài)變更為已領(lǐng)取。 4. 發(fā)送者接收到接收方 --> 紅包已接收的消息 --> 同時會話界面發(fā)送者那條紅 包消息變更為已領(lǐng)取。

紅包接收
-
接下來就是看具體實現(xiàn)了。
這其中我們規(guī)定消息的附加字段extra的格式為 0/messageUId 1/messageUId
其中0 ,1各代表紅包未領(lǐng)取和紅包領(lǐng)取的狀態(tài),而messageUId是服務(wù)器消息唯一ID(在同一個Appkey下全局唯一),我們用它來找到數(shù)據(jù)庫中需要變更狀態(tài)的那條消息。
- 1,首先我們發(fā)送一條消息
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, 然后在接收到我們點擊這個紅包準(zhǔn)備領(lǐng)取的時候,需要拿到這條消息的messageUId,并且發(fā)送一條已經(jīng)領(lǐng)取的消息
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,然后我們根據(jù)
messageUId拿到會話中的RCMessage對象RCMessage *oldMess = [[RCIMClient sharedRCIMClient] getMessageByUId:model.messageUId];
因為融云不像環(huán)信一樣可以直接更新某條消息的狀態(tài),所以我們只能[[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra];這樣去更新一下這個消息的拓展屬性。接下來的循環(huán)就是去變更發(fā)送的那條消息為已領(lǐng)取的狀態(tài),實時刷新UI(融云也沒有實時更新UI的方法,只能去更改數(shù)據(jù)源去刷新)。
綜上接收方的代碼已經(jīng)完成
接下來我們?nèi)タ窗l(fā)送方,怎么去更新UI
-
首先我們要先實現(xiàn)
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 值,看是否是對方已接收的狀態(tài),接下里的處理和接收方的實現(xiàn)一樣,直接刷新UI即可。
劃重點一定要實現(xiàn) [[RCIMClient sharedRCIMClient] setMessageExtra:oldMess.messageId value:mes.extra]; 這個方法,否則你退出會話,重新進(jìn)入的時候,發(fā)送者的那條消息還是未領(lǐng)取狀態(tài),是不會更改的。

打工是不可能的