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)")
})
}
}