iOS融云總結(jié)(一)

iOS使用融云相關(guān)用法總結(jié):

1、融云相關(guān)配置:
    // MARK: - 配置融云
    func configureRongCloud() {
       
        /// 初始化融云
        RCIM.shared()?.initWithAppKey(RongCloudAppKery)
        
        /// 設(shè)置用戶信息
        let currentUserInfo =  RCUserInfo.init(userId:"\(Caches.share.user?.id ?? 0)" , name: Caches.share.user?.nickname ?? "", portrait: Caches.share.user?.avatar ?? "")
        
        RCIM.shared()?.currentUserInfo = currentUserInfo
        
        /// 是否將用戶信息和群組信息在本地持久化存儲,默認(rèn)值為NO
        RCIM.shared()?.enablePersistentUserInfoCache = true
        
        /// 是否在發(fā)送的所有消息中攜帶當(dāng)前登錄的用戶信息,默認(rèn)值為NO
//        RCIM.shared()?.enableMessageAttachUserInfo = true
        
        /// 設(shè)置狀態(tài)監(jiān)聽
        RCIM.shared()?.connectionStatusDelegate = self
 
        /// 設(shè)置消息監(jiān)聽
        RCIM.shared()?.receiveMessageDelegate = self
        
        /// 是否關(guān)閉所有的本地通知,默認(rèn)值是NO
        RCKitConfig.default()?.message.disableMessageNotificaiton = false
      
        if !(RCIM.shared()?.getConnectionStatus() == .ConnectionStatus_Connected) {
            
            connectRoncloud(ryToken: Caches.share.user?.ryToken ?? "")
        }
        
        // 使用名片功能時,選擇聯(lián)系人用到
        /// 聯(lián)系人信息提供者
        RCContactCardKit.shareInstance()?.contactsDataSource = TPRCIMDataSource
        /// 群組信息提供者
        RCContactCardKit.shareInstance()?.groupDataSource = TPRCIMDataSource
        
        /// 用戶信息提供者
        RCIM.shared().userInfoDataSource = TPRCIMDataSource
        /// 群組信息提供者
        RCIM.shared().groupInfoDataSource = TPRCIMDataSource
        /// 群名片信息提供者
        RCIM.shared().groupUserInfoDataSource = TPRCIMDataSource
        /// 群成員信息提供者
        RCIM.shared().groupMemberDataSource = TPRCIMDataSource
        
        //注冊自定義消息
        RCIM.shared()?.registerMessageType(RCMTransferMessage.self)
        RCIM.shared()?.registerMessageType(RCMTransferReceiveMessage.self)
        RCIM.shared()?.registerMessageType(RCMRedPacketMeaasge.self)
        RCIM.shared()?.registerMessageType(RCMTipMessage.self)
        RCIM.shared()?.registerMessageType(RCMSystemMessage.self)
        RCIM.shared()?.registerMessageType(RCMGroupNotifiMessage.self)
        RCIM.shared()?.registerMessageType(RCMGroupChangeNameMessage.self)
        
        //設(shè)置圓形頭像
        RCKitConfig.default()?.ui.globalMessageAvatarStyle = .USER_AVATAR_CYCLE
        RCKitConfig.default()?.ui.globalConversationAvatarStyle = .USER_AVATAR_CYCLE
        
        /// 設(shè)置SDK中全局的導(dǎo)航按鈕字體顏色
        RCKitConfig.default()?.ui.globalNavigationBarTintColor = .OxColor333333
        
        
        //打開相冊的時候可以選擇視頻,需要拍攝視頻的話,設(shè)置成true
        RCKitConfig.default()?.message.isMediaSelectorContainVideo = false
        //關(guān)閉@功能
        RCKitConfig.default()?.message.enableMessageMentioned = false
        //開啟合并轉(zhuǎn)發(fā)功能
        RCKitConfig.default()?.message.enableSendCombineMessage = true
        //是否在會話頁面和會話列表界面顯示未注冊的消息類型,默認(rèn)值是 YES
        RCKitConfig.default()?.message.showUnkownMessage = true
        //消息撤回后可重新編輯的時間,單位是秒,默認(rèn)值是 300s。
        RCKitConfig.default()?.message.reeditDuration = 60
    }

2、監(jiān)聽網(wǎng)絡(luò)狀態(tài)變化
extension AppDelegate: RCIMConnectionStatusDelegate {
    
    /**
     *  網(wǎng)絡(luò)狀態(tài)變化。
     *
     *  @param status 網(wǎng)絡(luò)狀態(tài)。
     */
    func onRCIMConnectionStatusChanged(_ status: RCConnectionStatus) {
        
        if status == .ConnectionStatus_KICKED_OFFLINE_BY_OTHER_CLIENT {
            //被踢下線
            
            let alertVc = UIAlertController.tpAlertController(title: "下線通知", message: "您的帳號于另一臺手機上登錄", preferredStyle: .alert, cancelTitle: "退出", cancelActionStyle: .default, otherTitles: ["重新登錄"]) { (btnIndex, action) in
                
                if btnIndex == 0 {
                    TPLog(message: "退出")
                    Caches.share.save(newUser: nil)
                    RCIM.shared()?.logout()
                    
                    DispatchQueue.main.asyncAfter(deadline: .now()) {
                        
                        let keyWindow = Global.window
                        keyWindow?.rootViewController = UINavigationController.init(rootViewController: LoginViewController())
                    }
                    
                } else {
                    
                    //重新登錄
                    self.connectRoncloud(ryToken: Caches.share.user?.ryToken ?? "")
                }
            }
    
            let window = Global.window
            window?.rootViewController?.present(alertVc, animated: true, completion: nil)
            
        } else if status == .ConnectionStatus_TOKEN_INCORRECT {
            //token失效
            
            self.getRongCloudTokenAndConnect()
            
        } else if status == .ConnectionStatus_DISCONN_EXCEPTION {
            
            //與服務(wù)器的連接已斷開,用戶被封禁
            self.alertMessage(message: "您的帳號被封禁")
        }
    }
    
    
    /// 連接服務(wù)器
    func connectRoncloud(ryToken: String) {
        
        RCIM.shared()?.connect(withToken: ryToken, dbOpened: { (code) in
            
        }, success: { (userId) in
            
            DispatchQueue.main.async {
                
                if let w = self.window {
                    w.setupViewControlllers(delegate: self)
                }
            }
            
            
        }, error: { (status) in
            
            if (status == .RC_CONN_TOKEN_INCORRECT) {
                //從 APP 服務(wù)獲取新 token,并重連
                
                self.getRongCloudTokenAndConnect()
                
            } else if(status == .RC_CONNECT_TIMEOUT) {
                //連接超時,彈出提示,可以引導(dǎo)用戶等待網(wǎng)絡(luò)正常的時候再次點擊進(jìn)行連接
                
                self.alertMessage(message: "連接超時,請稍后再試")
                
            } else {
                //無法連接 IM 服務(wù)器,請根據(jù)相應(yīng)的錯誤碼作出對應(yīng)處理
                self.alertMessage(message: "無法連接 IM 服務(wù)器")
            }
            
        })
    }
    
    //獲取token,并重聯(lián)
    func getRongCloudTokenAndConnect() {
        
        self.request(config: ApiConfiguration.init(route: .getRyToken, params: ["":""])) { [weak self](result:Result<ApiResponse<String>, Error>, rawData:Data?) in
            
            switch result {
            case .success(let object):
                DispatchQueue.main.async {
                    self?.connectRoncloud(ryToken: object.data)
                }
            case .failure(let error):
                TPLog(message: "\(error.localizedDescription)")
            }
            
        }
    }
    
    
    func alertMessage(message: String) {
        
        let alertVc = UIAlertController.tpAlertController(title: "提示", message: message, preferredStyle: .alert, cancelTitle: "我知道了", cancelActionStyle: .default, otherTitles: []) { (btnIndex, action) in
            
            Caches.share.save(newUser: nil)
            RCIM.shared()?.disconnect()
            
            self.window?.rootViewController = UINavigationController.init(rootViewController: LoginViewController())
        }
        
        let window = Global.window
        window?.rootViewController?.present(alertVc, animated: true, completion: nil)
    }
    
}

3、IMKit消息接收的監(jiān)聽器,在此處可以設(shè)置tabbar消息紅點或者其他操作。
extension AppDelegate: RCIMReceiveMessageDelegate {
    
    func onRCIMReceive(_ message: RCMessage!, left: Int32) {
       
        let unreadCount = RCIMClient.shared()?.getTotalUnreadCount() ?? 0
        
        TPLog(message: "未讀消息數(shù) \(unreadCount)")
        
        DispatchQueue.main.async {
            
            let keyWindow = Global.window
            let tabBarVC = keyWindow?.rootViewController as? UITabBarController
            
            if unreadCount > 0 {
                
                tabBarVC?.tabBar.showBadgeOnTabBarItem(index: 0, count: Int(unreadCount))
                
            } else {
                
                tabBarVC?.tabBar.hideBadgeOnTabBarItem(index: 0)
            }
            
            if let model = message.content as? RCMSystemMessage {

                var param = [String: String]()
                param["groupId"] = model.msgId

                NotificationCenter.default.post(name: NSNotification.Name(GroupDissolutionNotification), object: param)

            }
        
            if let updateGroupNameModel = message.content as? RCMGroupChangeNameMessage {
                
                NotificationCenter.default.post(name: NSNotification.Name(UpdateGroupNameSuccessNotifi), object: ["grupName":updateGroupNameModel.tipContent])
            }
        }
        
    }
   
}
4、登錄成功設(shè)置用戶信息,修改頭像,修改昵稱等更新用戶信息,使用
let currentUserInfo = RCUserInfo(userId: "\(userInfo.id)" , name: userInfo.nickname, portrait: userInfo.avatar)
RCIM.shared()?.currentUserInfo = currentUserInfo
修改頭像,昵稱,如果使用了以下方法,會出現(xiàn)聊天的時候,對方看到你的用戶頭像,昵稱還是之前的,此方法是更新SDK緩存的用戶信息
 RCIM.shared().refreshUserInfoCache(RCUserInfo(userId: "\(userInfo.id)" , name: userInfo.nickname, portrait: userInfo.avatar), withUserId: "\(userInfo.id)")
5、更新好友信息,群組信息,如果不更新,會出現(xiàn)聊天的時候可能不會顯示用戶信息或群組信息
//更新好友信息
let userInfo = RCUserInfo(userId: "\(model.id)", name: (model.remark.isBlank == true) ? model.name: model.remark, portrait: model.avatar)                     
RCIM.shared()?.refreshUserInfoCache(userInfo, withUserId: "\(model.id)")
//更新群組信息
RCIM.shared()?.refreshGroupInfoCache(RCGroup(groupId: "\(model.id)", groupName: model.name, portraitUri: model.avatar), withGroupId: "\(model.id)")
6、開啟或關(guān)閉群免打擾,首先需要獲取群免打擾狀態(tài),然后點擊開啟或關(guān)閉按鈕的時候,再設(shè)置會話的消息提醒狀態(tài)。
/// 獲取免打擾狀態(tài)
    func getConversationNotifiStatus() {
        
        RCIMClient.shared()?.getConversationNotificationStatus(.ConversationType_GROUP, targetId: receiveGroupId, success: {[weak self] (nStatus) in
            
            switch nStatus {
            case .DO_NOT_DISTURB:
                self?.notifiStatus = true
            case .NOTIFY:
                self?.notifiStatus = false
            default:break
            }
            
            DispatchQueue.main.async {
                self?.tableView.reloadSections([3], with: .fade)
            }
            
        }, error: { (code) in
            self.notifiStatus = false
            DispatchQueue.main.async {
                self.tableView.reloadSections([3], with: .fade)
            }
        })
    }
    
    func setConversationNotifiStatus(isOn: Bool) {
        
        RCIMClient.shared()?.setConversationNotificationStatus(.ConversationType_GROUP, targetId: receiveGroupId, isBlocked: isOn, success: {[weak self] (nStatus) in
            
            switch nStatus {
            case .DO_NOT_DISTURB:
                self?.notifiStatus = true
            case .NOTIFY:
                self?.notifiStatus = false
            default:break
            }
            
            DispatchQueue.main.async {
                self?.tableView.reloadSections([3], with: .fade)
            }
            
        }, error: { (code) in
            
            self.notifiStatus = false
            DispatchQueue.main.async {
                self.tableView.reloadSections([3], with: .fade)
            }
        })
    }
7、清空聊天記錄,清空成功后,需要發(fā)送通知或者block到會話頁面進(jìn)行刷新,如果不刷新,會出現(xiàn)數(shù)據(jù)還在,需要返回到會話列表,再次進(jìn)入才會消失
// MARK: - 清空群聊聊天記錄
    func clearHistoryMessage() {
        
        let latestMessages = RCIMClient.shared()?.getLatestMessages(.ConversationType_GROUP, targetId: receiveGroupId, count: 1)
        
        if latestMessages?.count ?? 0 > 0 {
        
            RCIMClient.shared()?.clearHistoryMessages(.ConversationType_GROUP, targetId: receiveGroupId, recordTime: 0, clearRemote: false, success: {
                
                DispatchQueue.main.async {
                    
                    NotificationCenter.default.post(name: NSNotification.Name(ClearMessageNotifi), object: self)
                    
                    self.showToast(text: "操作成功")
                    self.setClearMessageHistory?()
                }
                
            }, error: { (status) in
                
            })
        }
    }

// MARK: - 刷新會話頁面
func refreshHistoryData() {
        
        self.conversationDataRepository.removeAllObjects()
        self.conversationMessageCollectionView.reloadData()
        
}

8、會話頁面配置加號區(qū)域按鈕,更新指定擴展項嘗試了以后沒變化,所以我采用的先全部刪除,然后重新添加。

// MARK: - 配置加號區(qū)域
    func configireAddArea() {
        
        //刪除原來的項
        self.chatSessionInputBarControl.pluginBoardView.removeAllItems()

        self.chatSessionInputBarControl.pluginBoardView.insertItem(UIImage(named: "xiangce"), highlightedImage: UIImage(named: "xiangce"), title: "相冊", tag: Int(PLUGIN_BOARD_ITEM_ALBUM_TAG))
        
        self.chatSessionInputBarControl.pluginBoardView.insertItem(UIImage(named: "paishe"), highlightedImage: UIImage(named: "paishe"), title: "拍照", tag: Int(PLUGIN_BOARD_ITEM_CAMERA_TAG))
        
        self.chatSessionInputBarControl.pluginBoardView.insertItem(UIImage(named: "hongbao1"), highlightedImage: UIImage(named: "hongbao1"), title: "紅包", tag: 20003)
        
        if self.conversationType == .ConversationType_PRIVATE {
            
            self.chatSessionInputBarControl.pluginBoardView.insertItem(UIImage(named: "zhuanzhang1"), highlightedImage: UIImage(named: "zhuanzhang1"), title: "轉(zhuǎn)賬", tag: 20004)
            
        } else {
            
        }
            
    
        self.chatSessionInputBarControl.pluginBoardView.insertItem(UIImage(named: "mingpian"), highlightedImage: UIImage(named: "mingpian"), title: "個人名片", tag: Int(PLUGIN_BOARD_ITEM_CARD_TAG))
            
        self.chatSessionInputBarControl.pluginBoardView.insertItem(UIImage(named: "weizhi"), highlightedImage: UIImage(named: "weizhi"), title: "位置", tag: Int(PLUGIN_BOARD_ITEM_LOCATION_TAG))
}
9、如果使用了自定義消息,那么會話頁面需要注冊自定義的cell,會話才會展示我們自定義的消息。
//注冊單元格
        self.register(TransferAccountSendCell.self, forMessageClass: RCMTransferMessage.self)
        
        self.register(TransferAccountReceiveCell.self, forMessageClass: RCMTransferReceiveMessage.self)
        
        self.register(RedPacketSendCell.self, forMessageClass: RCMRedPacketMeaasge.self)
        
        self.register(RedPacketNotifiCell.self, forMessageClass: RCMTipMessage.self)
        
        self.register(SystemMessageCell.self, forMessageClass: RCMSystemMessage.self)
        
        self.register(GroupNotifiCell.self, forMessageClass: RCMGroupNotifiMessage.self)
        
        self.register(GroupChangeNameTipCell.self, forMessageClass: RCMGroupChangeNameMessage.self)
10、如果自定義消息,需要改變狀態(tài),比如發(fā)紅包,拆紅包;轉(zhuǎn)賬給好友,好友接受后需要改變狀態(tài),這時候可以設(shè)置 IMlib 的消息擴展聽器來刷新顯示。
// 消息擴展監(jiān)聽
RCIMClient.shared()?.messageExpansionDelegate = self

extension ChatViewController: RCMessageExpansionDelegate {
    
    func messageExpansionDidUpdate(_ expansionDic: [String : String]!, message: RCMessage!) {
        TPLog(message: "已更新")
        
        let arr:[RCMessageModel] = self.conversationDataRepository as! [RCMessageModel]
        
        if arr.count > 0 {
            
            for item in arr {
                
                if item.messageUId == message.messageUId {
                    
                    item.expansionDic = message.expansionDic
                    
                }
            }
            
            DispatchQueue.main.async {
                self.conversationMessageCollectionView.reloadData()
            }
        }
     
    }
    
    func messageExpansionDidRemove(_ keyArray: [String]!, message: RCMessage!) {
        
    }
    
    
}

11、設(shè)置接受新消息通知狀態(tài),先查詢已設(shè)置的全局時間段消息提醒屏蔽;然后全局屏蔽某個時間段的消息提醒。
// MARK: -查詢已設(shè)置的全局時間段消息提醒屏蔽
override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        customNaviBar.style = .whiteNoDash
        
        RCIMClient.shared()?.getNotificationQuietHours({[weak self] (startTime, spansMin) in
            
            DispatchQueue.main.async {
                if spansMin >= 1439 {
                    self?.isReceiveNotification = false
                } else {
                    self?.isReceiveNotification = true
                }
                
                self?.tableView.reloadData()
            }
            
        }, error: { (status) in
            
            DispatchQueue.main.async {
                
                self.isReceiveNotification = true
                self.tableView.reloadData()
            }
        })
    }

/*!
 全局屏蔽某個時間段的消息提醒

 @param startTime       開始消息免打擾時間,格式為 HH:MM:SS
 @param spanMins        需要消息免打擾分鐘數(shù),0 < spanMins < 1440( 比如,您設(shè)置的起始時間是 00:00, 結(jié)束時間為
 23:59,則 spanMins 為 23 * 60 + 59 = 1439 分鐘。)
 @param successBlock    屏蔽成功的回調(diào)
 @param errorBlock      屏蔽失敗的回調(diào) [status:屏蔽失敗的錯誤碼]

 @discussion 此方法設(shè)置的屏蔽時間會在每天該時間段時生效。
 如果您使用 IMLib,此方法會屏蔽該會話在該時間段的遠(yuǎn)程推送;如果您使用
 IMKit,此方法會屏蔽該會話在該時間段的所有提醒(遠(yuǎn)程推送、本地通知、前臺提示音)。

 @remarks 會話
 */
func setReceiveNotification(isOn: Bool) {
        
        if isOn == false {
            
            RCIMClient.shared()?.setNotificationQuietHours("00:00:00", spanMins: 1439, success: {
               
                DispatchQueue.main.async {
                    
                    self.isReceiveNotification = false
                    self.tableView.reloadData()
                }
                
            }, error: { (status) in
                
                DispatchQueue.main.async {
                    
                    self.isReceiveNotification = true
                    self.tableView.reloadData()
                }
                
            })
            
        } else {
            
            RCIMClient.shared()?.removeNotificationQuietHours({
                
                DispatchQueue.main.async {
                    
                    self.isReceiveNotification = true
                    self.tableView.reloadData()
                }
                
            }, error: { (status) in
                
                DispatchQueue.main.async {
                    
                    self.isReceiveNotification = false
                    self.tableView.reloadData()
                }
                
            })
            
        }
}
12、自定義消息,需要自定義model,自定義cell,model的類型名需要和安卓,后臺統(tǒng)一,才能收到消息。
(1)自定義Model,需要繼承RCMessageContent。
// RCMRedPacketMeaasge.h文件

#import <RongIMLibCore/RongIMLibCore.h>
#import <RongIMKit.h>

/*!
 測試消息的類型名
 */
#define RCMRedPacketMeaasgeTypeIdentifier @"RC:RedPacketMsg"


NS_ASSUME_NONNULL_BEGIN

@interface RCMRedPacketMeaasge : RCMessageContent

/** 紅包個數(shù) */
@property (nonatomic, copy) NSString * packetCount;
/** 紅包備注 */
@property (nonatomic, copy) NSString * remark;
/** 發(fā)送者ID */
@property (nonatomic, copy) NSString * sendUserId;
/** 后臺生成的紅包id */
@property (nonatomic, copy) NSString * redPacketId;

/*!
 初始化測試消息

 @param content 文本內(nèi)容
 @return        測試消息對象
 */
+ (instancetype)messageWithContent:(NSString *)content;

@end

NS_ASSUME_NONNULL_END

// RCMRedPacketMeaasge.m文件

#import "RCMRedPacketMeaasge.h"

@implementation RCMRedPacketMeaasge
///初始化
+ (instancetype)messageWithContent:(NSString *)content {
    
    RCMRedPacketMeaasge *text = [[RCMRedPacketMeaasge alloc] init];
    if (text) {
        
    }
    return text;
}

///消息是否存儲,是否計入未讀數(shù)
+ (RCMessagePersistent)persistentFlag {
    return  MessagePersistent_ISCOUNTED;
}

/// NSCoding
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super init];
    if (self) {
        self.redPacketId = [aDecoder decodeObjectForKey:@"redPacketId"];
        self.packetCount = [aDecoder decodeObjectForKey:@"packetCount"];
        self.sendUserId = [aDecoder decodeObjectForKey:@"sendUserId"];
        self.remark = [aDecoder decodeObjectForKey:@"remark"];

    }
    return self;
}

/// NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.redPacketId forKey:@"redPacketId"];
    [aCoder encodeObject:self.packetCount forKey:@"packetCount"];
    [aCoder encodeObject:self.sendUserId forKey:@"sendUserId"];
    [aCoder encodeObject:self.remark forKey:@"remark"];

}


///將消息內(nèi)容編碼成json
- (NSData *)encode {
    NSMutableDictionary *dataDict = [NSMutableDictionary dictionary];
    [dataDict setObject:self.redPacketId forKey:@"redPacketId"];
    [dataDict setObject:self.packetCount forKey:@"packetCount"];
    [dataDict setObject:self.sendUserId forKey:@"sendUserId"];
    [dataDict setObject:self.remark forKey:@"remark"];

    if (self.senderUserInfo) {
        [dataDict setObject:[self encodeUserInfo:self.senderUserInfo] forKey:@"user"];
    }

    NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict options:kNilOptions error:nil];
    return data;
}

///將json解碼生成消息內(nèi)容
- (void)decodeWithData:(NSData *)data {
    if (data) {
        __autoreleasing NSError *error = nil;

        NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

        NSLog(@"sysDic----%@",dictionary);
        
        if (dictionary) {
            self.redPacketId = dictionary[@"redPacketId"];
            self.sendUserId = dictionary[@"sendUserId"];
            self.packetCount = dictionary[@"packetCount"];
            self.remark = dictionary[@"remark"];
            
            NSDictionary *userinfoDic = dictionary[@"user"];
            [self decodeUserInfo:userinfoDic];
        }
    }
}

/// 會話列表中顯示的摘要
- (NSString *)conversationDigest {
    
    RCUserInfo * info = [RCIM sharedRCIM].currentUserInfo;
    if ([self.sendUserId isEqualToString: info.userId]) {
        return [NSString stringWithFormat:@"[紅包] %@", self.remark];
    } else {
        return [NSString stringWithFormat:@"[紅包] %@", self.remark];
    }
    return @"[紅包]";
}

///消息的類型名
+ (NSString *)getObjectName {
    return RCMRedPacketMeaasgeTypeIdentifier;
}


@end

(2)自定義消息之cell
//紅包(發(fā))
import UIKit


class RedPacketSendCell: RCMessageCell {
    
    override init!(frame: CGRect) {
        super.init(frame: frame)
        
        setupView()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    override class func size(for model: RCMessageModel!, withCollectionViewWidth collectionViewWidth: CGFloat, referenceExtraHeight extraHeight: CGFloat) -> CGSize {
        
        
        var height: CGFloat = 103.0
    
        height += extraHeight
        
        return CGSize(width: collectionViewWidth, height: height)
    }
    
    override func setDataModel(_ model: RCMessageModel!) {
        
        super.setDataModel(model)
        
        let expandDic = model.expansionDic
        
//        var idArr = [String]()
        var isExpire = ""
        
        var receiveIndex = 0
        
        if expandDic?.count ?? 0 > 0 {
            
            receiveIndex = (expandDic?.count ?? 0) - 1
            
            isExpire = expandDic?["isExpire"] ?? ""
            
//            TPLog(message: "receiveIndex ---- \(receiveIndex)")
//            TPLog(message: "count ---- \(expandDic?.count ?? 0)")
            
            /*
            //拆紅包的用戶ID
            let idStr = String("\(expandDic?["receiveIds"] ?? "")")
            isExpire = expandDic?["isExpire"] ?? ""
            if idStr.count > 0 {
                idArr = idStr.components(separatedBy: ",")
            } else {
                
            }
 */
        }
        
        
        let messageModel = model.content as! RCMRedPacketMeaasge
        remarkLabel.text = messageModel.remark
        
        if self.messageDirection == .MessageDirection_RECEIVE {
            
            self.messageContentView.frame = CGRect(x: 0, y: 0, width: RelativeScreen.width*0.66, height: 93)
            
//            self.messageContentView.frame = CGRect(x: 0, y: 0, width: self.messageContentView.frame.size.width, height: 93)
            
            if receiveIndex > 0 {
                
                //判斷紅包是否被領(lǐng)完
                if Int(messageModel.packetCount) == receiveIndex {
                    
                    let receiveUsderId = expandDic?["\(Caches.share.user?.id ?? 0)"] ?? ""
                    
                    if receiveUsderId.isBlank == false {
                        
                        statusLabel.text = "已領(lǐng)取"
                        bgView.backgroundColor = .OxColorFBD6B5
                        typeLabel.textColor = .OxColorFFFFFF
                        
                    } else {
                        
                        statusLabel.text = "已被領(lǐng)完"
                        bgView.backgroundColor = .OxColorFBD6B5
                        typeLabel.textColor = .OxColorFFFFFF
                    }
                    
                    
                    
                } else {
                    //判斷紅包是否已過期
                    if isExpire == "1" {
                        
                        statusLabel.text = "已過期"
                        bgView.backgroundColor = .OxColorFBD6B5
                        typeLabel.textColor = .OxColorFFFFFF
                        
                    } else {
                     
                        //判斷領(lǐng)取人ids是否包含當(dāng)前用戶
                        let receiveUsderId = expandDic?["\(Caches.share.user?.id ?? 0)"] ?? ""
                        
                        if receiveUsderId.isBlank == false {
                            
                            statusLabel.text = "已領(lǐng)取"
                            bgView.backgroundColor = .OxColorFBD6B5
                            typeLabel.textColor = .OxColorFFFFFF
                            
                        } else {
                            
                            statusLabel.text = ""
                            bgView.backgroundColor = .OxColorF99B3E
                        }
                    }
                }
             
            } else {
                
                statusLabel.text = ""
                bgView.backgroundColor = .OxColorF99B3E
                
            }
            
        } else {
            
            self.messageContentView.frame = CGRect(x: 0, y: 0, width: RelativeScreen.width*0.66, height: 103)
            
            if receiveIndex > 0 {
                
                //判斷紅包是否被領(lǐng)完
                if Int(messageModel.packetCount) == receiveIndex {
                    
                    let receiveUsderId = expandDic?["\(Caches.share.user?.id ?? 0)"] ?? ""
                    
                    if receiveUsderId.isBlank == false {
                        
                        statusLabel.text = "已領(lǐng)取"
                        bgView.backgroundColor = .OxColorFBD6B5
                        typeLabel.textColor = .OxColorFFFFFF
                        
                    } else {
                        
                        statusLabel.text = "已被領(lǐng)完"
                        bgView.backgroundColor = .OxColorFBD6B5
                        typeLabel.textColor = .OxColorFFFFFF
                    }
                    
                } else {
                    //判斷紅包是否已過期
                    if isExpire == "1" {
                        
                        statusLabel.text = "已過期"
                        bgView.backgroundColor = .OxColorFBD6B5
                        typeLabel.textColor = .OxColorFFFFFF
                        
                    } else {
                     
                        //判斷領(lǐng)取人ids是否包含當(dāng)前用戶
                        let receiveUsderId = expandDic?["\(Caches.share.user?.id ?? 0)"] ?? ""
                        
                        if receiveUsderId.isBlank == false {
                            
                            statusLabel.text = "已領(lǐng)取"
                            bgView.backgroundColor = .OxColorFBD6B5
                            typeLabel.textColor = .OxColorFFFFFF
                            
                        } else {
                            
                            statusLabel.text = ""
                            bgView.backgroundColor = .OxColorF99B3E
                        }
                    }
                }
             
            } else {
                
                statusLabel.text = ""
                bgView.backgroundColor = .OxColorF99B3E
                
            }
        }
        
    }
    
    // MARK: - setupViews
    func setupView() {
        
        self.messageContentView.addSubview(bgView)
        bgView.addSubview(iconImageView)
        bgView.addSubview(remarkLabel)
        bgView.addSubview(statusLabel)
        bgView.addSubview(lineView)
        bgView.addSubview(typeLabel)
        
        bgView.snp.makeConstraints { (make) in
            make.edges.equalToSuperview()
        }
        
        iconImageView.snp.makeConstraints { (make) in
            make.top.equalTo(16)
            make.left.equalTo(14)
            make.width.height.equalTo(30)
        }
        
        remarkLabel.snp.makeConstraints { (make) in
            make.top.equalTo(iconImageView)
            make.left.equalTo(iconImageView.snp.right).offset(10)
            make.right.equalTo(-14)
        }
        
        statusLabel.snp.makeConstraints { (make) in
            make.left.right.equalTo(remarkLabel)
            make.top.equalTo(remarkLabel.snp.bottom).offset(4)
        }
        
        lineView.snp.makeConstraints { (make) in
            make.top.equalTo(iconImageView.snp.bottom).offset(11)
            make.left.equalTo(11)
            make.right.equalTo(-17)
            make.height.equalTo(1)
        }
        
        typeLabel.snp.makeConstraints { (make) in
            make.left.right.equalTo(lineView)
            make.top.equalTo(lineView.snp.bottom).offset(7)
            make.bottom.equalTo(-12)
        }
        
        self.bubbleBackgroundView.isUserInteractionEnabled = true

        let singleTap = UITapGestureRecognizer.init(target: self, action: #selector(tapMessage(sender:)))
        self.bgView.addGestureRecognizer(singleTap)
        
    }
    
    @objc func tapMessage(sender: UITapGestureRecognizer) {
 
        self.delegate.didTapMessageCell?(self.model)
    }
    
    
    // MARK: - lazy object
    lazy var bgView: UIView = {
        let view = UIView()
        view.backgroundColor = .OxColorF99B3E
        view.clipsToBounds = true
        view.layer.cornerRadius = 8.0
        return view
    }()
    
    lazy var iconImageView: UIImageView = {
        let imageV = UIImageView()
        imageV.image = UIImage(named: "redpacket")
        return imageV
    }()
    
    lazy var remarkLabel: UILabel = {
        let label = UILabel.tpLabel(textColor: .OxColorFFFFFF, font: .BoldFont16, textAlignment: .left)
        label.text = "恭喜發(fā)財,大吉大利"
        return label
    }()
    
    lazy var statusLabel: UILabel = {
        let label = UILabel.tpLabel(textColor: .OxColorFFFFFF, font: .MediumFont12, textAlignment: .left)
        label.text = "已領(lǐng)取"
        return label
    }()
    
    lazy var lineView: UIView = {
        let view = UIView()
        view.backgroundColor = .OxColorFFFFFF
        view.alpha = 0.5
        return view
    }()
    
    lazy var typeLabel: UILabel = {
        let label = UILabel.tpLabel(textColor: .OxColorFBD7B6, font: .MediumFont15, textAlignment: .left)
        label.text = "紅包"
        return label
    }()
    
    
    
}

(3)發(fā)送自定義消息
    // MARK: - 發(fā)送紅包消息
    func sendRedpacketMessage() {
        
        let msg = RCMRedPacketMeaasge.init()
        msg.sendUserId = "\(self.user?.id ?? 0)"
        msg.redPacketId = "\(self.redpacketModel?.redPackageID ?? 0)"
        
        if self.type == .personal {
            msg.packetCount = "1"
        } else {
            msg.packetCount = headView.countTf.text ?? "0"
        }
        msg.remark = (headView.textView.text.isBlank == true) ? "恭喜發(fā)財,大吉大利" : headView.textView.text
        
        
        let rcMsg = RCMessage()
        rcMsg.canIncludeExpansion = true
        rcMsg.content = msg
        
        if self.type == .personal {
            rcMsg.conversationType = .ConversationType_PRIVATE
        } else {
            rcMsg.conversationType = .ConversationType_GROUP
        }

        rcMsg.targetId = receivetargetId
        rcMsg.messageDirection = .MessageDirection_SEND
        rcMsg.messageId = 0
        
        var param = [String: String]()
//        param["receiveIds"] = "" //是否領(lǐng)取過紅包
        param["isExpire"] = "0" //是否已過期

        rcMsg.expansionDic = param
        
        RCIM.shared()?.send(rcMsg, pushContent: "", pushData: "", successBlock: { (successMsg) in
            
            if let model = successMsg {
                
                TPLog(message: "發(fā)送成功:\(model.expansionDic)")

                DispatchQueue.main.async {
                    self.navigationController?.popViewController(animated: true)
                }
            }
            
            
            
        }, errorBlock: { (code, errorMsg) in
            
            TPLog(message: "發(fā)送失?。篭(code) --- \(errorMsg)")
        })
    }
    
}

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.前言2.融云聊天的實現(xiàn)3.自定義消息類型和自定義消息cell4.融云使用過程中出現(xiàn)的問題及解決方法5.結(jié)語 1...
    Bales_chu閱讀 8,523評論 44 26
  • 融云IM簡介 融云的定位是只專注即時通訊的消息發(fā)送功能,融云服務(wù)器不會維護用戶的好友關(guān)系及群組關(guān)系,這就需要集成的...
    默默愛楊楊閱讀 2,637評論 2 4
  • 寫在前面融云是一個比較強大的第三方框架,為我們提供了即時通訊的基本組件,導(dǎo)入SDK,進(jìn)行一些簡單的配置就可以看到會...
    汪小喵閱讀 14,827評論 14 31
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,834評論 28 54
  • 人工智能是什么?什么是人工智能?人工智能是未來發(fā)展的必然趨勢嗎?以后人工智能技術(shù)真的能達(dá)到電影里機器人的智能水平嗎...
    ZLLZ閱讀 4,098評論 0 5

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