融云三(自定義紅包狀態(tài))

上篇文章講了怎么自定義消息和自定義消息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),是不會更改的。

打工是不可能的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容