
目錄:
1.會(huì)話列表頁沒有回話聊天的時(shí)候顯示內(nèi)容自定義
2.實(shí)現(xiàn)收到消息時(shí)候,位于tabbar自定義小紅點(diǎn)的出現(xiàn)(并及時(shí)出現(xiàn))
3.#import "IQKeyboardManager.h"與會(huì)話聊天鍵盤彈出的沖突
4.介紹一個(gè)做的時(shí)候比較麻煩的功能,關(guān)于消息的處理與查看的消息小紅點(diǎn)
5.當(dāng)首次進(jìn)入聊天時(shí)候,默認(rèn)發(fā)送一條信息
1.會(huì)話列表頁沒有回話聊天的時(shí)候顯示內(nèi)容自定義

只需要在繼承了
RCConversationListViewController這個(gè)類中,賦值這個(gè)emptyConversationView屬性即可
- (void)setupEmptyConversationView {
UIImageView *emptyImageView = [[UIImageView alloc] init];
emptyImageView.image = [UIImage imageNamed:@"facai"];
emptyImageView.size = CGSizeMake(kScreenWidth, kScreenHeight);
emptyImageView.center = self.view.center;
UIView * emptyView = [[UIView alloc] initWithFrame:self.view.bounds];
UILabel * emptyLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 350, 200, 50)];
emptyLabel.text = @"都沒有人跟我聊天";
UILabel * emptyLabel1 = [[UILabel alloc] initWithFrame:CGRectMake(55, 200, 200, 50)];
emptyLabel1.text = @"藍(lán)瘦~";
UILabel * emptyLabel2 = [[UILabel alloc] initWithFrame:CGRectMake(20, 250, 200, 50)];
emptyLabel2.text = @"香菇~~";
[emptyView addSubview:emptyImageView];
[emptyView addSubview:emptyLabel];
[emptyView addSubview:emptyLabel1];
[emptyView addSubview:emptyLabel2];
self.emptyConversationView = emptyView;
}
當(dāng)然這是非常簡單的功能甚至在融云開發(fā)文檔中com + f 搜索關(guān)鍵字就能找到
2.實(shí)現(xiàn)收到消息時(shí)候,位于tabbar自定義小紅點(diǎn)的出現(xiàn)(并及時(shí)出現(xiàn))

本人這里的實(shí)現(xiàn)是直接在tabbar上添加的原點(diǎn)圖片只要調(diào)整好frame完全沒有問題,而且采用[tabbar addSubView]的方法不用擔(dān)心每次收到消息都會(huì)覆蓋添加的問題,所以移除的時(shí)候也是只需要移除一次就可以
// 創(chuàng)建imageView
_imageViewMessage = [[UIImageView alloc] init];
_imageViewMessage.frame = CGRectMake(kScreenWidth * 0.5, 8, 10, 10);
[_imageViewMessage setImage:[UIImage imageNamed:@"jindudian"]];
/// 接收到融云消息時(shí)調(diào)用
- (void)addRcMessage {
if (self.selectedIndex == 2) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
[self.tabBar addSubview:_imageViewMessage];
});
}
/// 其他地方處理融云消息,移除tabbar上的小紅點(diǎn)
[[NSNotificationCenter defaultCenter] addObserverForName:KRCMessageOver object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
[_imageViewMessage removeFromSuperview];
}];
這里的重點(diǎn)就是一定要利用線程才能達(dá)到及時(shí)添加的效果, 否則大概每次出現(xiàn)UI上的更新要有30s的延遲,個(gè)人猜測(cè)這個(gè)可能和運(yùn)行循環(huán)有關(guān),所以這里加線程來做就可以了.關(guān)于接收消息會(huì)調(diào)用的方法,大家看融云的開發(fā)文檔就可以了,而且如果你想加上數(shù)字角標(biāo)也是可以的.
self.tabBarItem.badgeValue = @"3";
ps:這里貼一個(gè)自己查資料時(shí)候的小烏龍 .. 算是絕處逢生吧


3.記錄一個(gè)自己遇到的犯二的小點(diǎn),關(guān)于
#import "IQKeyboardManager.h"這個(gè)是很好用的框架具體使用方法的帖子介紹
導(dǎo)入IQKeyboardManager后,默認(rèn)所有的頁面都有了這個(gè)功能,如果你在哪一個(gè)界面不想有這個(gè)效果可以在當(dāng)前界面控制器的生命周期方法中進(jìn)行設(shè)置:
#import <IQKeyboardManager.h>
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[IQKeyboardManager sharedManager].enable = NO;
}
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
[IQKeyboardManager sharedManager].enable = YES;
}
這里需要自定義一個(gè)繼承
RCConversationViewController的類MKConversationViewController進(jìn)行跳轉(zhuǎn)并在自定義的類的視圖生命周期里寫上面的方法
//重寫RCConversationListViewController的onSelectedTableRow事件
- (void)onSelectedTableRow:(RCConversationModelType)conversationModelType
conversationModel:(RCConversationModel *)model
atIndexPath:(NSIndexPath *)indexPath {
NSLog(@"%@%@",model.conversationTitle,model.targetId);
RCConversationViewController *conversationVC = [[MKConversationViewController alloc]init];
conversationVC.conversationType = model.conversationType;
conversationVC.targetId = model.targetId;
conversationVC.title = model.conversationTitle;
[self.navigationController pushViewController:conversationVC animated:YES];
}
4.這里介紹一個(gè)做的時(shí)候比較麻煩的功能,就是關(guān)于消息的處理與查看

這是一個(gè)個(gè)人感覺比較麻煩的處理地方,因?yàn)橐獙?shí)現(xiàn)一旦接受到消息所有界面右上角的聊天入口都要顯示小紅點(diǎn),而且任意一個(gè)界面進(jìn)入消息列表頁面查看過消息,其他頁面的小紅點(diǎn)都要消失,就像gif圖里這種效果,當(dāng)然這是一個(gè)不是很完美的效果,按照QQ微信這種做法應(yīng)該是進(jìn)入到具體的消息會(huì)話中消息提醒才會(huì)消息,這里做的是只要進(jìn)入到消息列表頁就視為消息查看過的狀態(tài)取消小紅點(diǎn).
a,發(fā)送消息的時(shí)機(jī),當(dāng)我們的聊天列表頁面出現(xiàn)在與我們的主Window重合的時(shí)候就可以視為跳轉(zhuǎn)到了此頁面,即相當(dāng)于此消息已處理,發(fā)送一個(gè)通知消息供其他頁面接收做UI上的處理
/// 判斷聊天頁面是不是跟主窗口重疊 ,如果是就發(fā)送已經(jīng)處理了信息的消息
- (void)setupMessageRead {
CGRect windowRect = [UIApplication sharedApplication].keyWindow.bounds;
CGRect myViewRect = [self.view convertRect:self.view.bounds toView:nil];
BOOL overlap = CGRectIntersectsRect(windowRect, myViewRect);
if (overlap) {
// NSLog(@"======chongdie ====重疊 ====");
[[NSNotificationCenter defaultCenter] postNotificationName:KRCMessageOver object:nil];
}
}
這里涉及到坐標(biāo)系轉(zhuǎn)換的方法來判斷是否跳轉(zhuǎn)相關(guān)頁面,很方便
b.給要跳轉(zhuǎn)的頁面增加一個(gè)BOOL屬性來判斷消息處理的情況,達(dá)到第一次進(jìn)入界面的時(shí)候做是否有紅點(diǎn)的處理
// 判斷是否有為添加的新消息 調(diào)整rightItembar
@property(assign,nonatomic ) BOOL messageNew;
-----------------------
/// 融云監(jiān)聽是否改變聊天入口的狀態(tài)
[[NSNotificationCenter defaultCenter] addObserverForName:KRCMessage object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
self.messageNew = YES;
}];
/// 融云監(jiān)聽是否改變聊天入口的狀態(tài)
[[NSNotificationCenter defaultCenter] addObserverForName:KRCMessageOver object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
self.messageNew = NO;
}];
/// 融云信息查看傳到下一個(gè)界面
details.messageNew = self.messageNew;
[self.navigationController pushViewController:details animated:YES];
c.然后在即將顯示的見面里通過_messageNew這個(gè)BOOL值做處理
/// 導(dǎo)航欄根據(jù)融云消息按鈕
if (self.messageNew) {
_message = [UIBarButtonItem BarButtonItemWithBackgroudImageName:@"xiaoxitixing" highBackgroudImageName:nil target:self action:@selector(messageCenter)];
}else {
_message = [UIBarButtonItem BarButtonItemWithBackgroudImageName:@"xiaoxi" highBackgroudImageName:nil target:self action:@selector(messageCenter)];
}
self.navigationItem.rightBarButtonItem = _message;
這里做的是切換
rightBarButtonItem的圖片,不再是加小圓點(diǎn)了.效果是一樣的.
d.實(shí)時(shí)監(jiān)聽頁面消息的變化
/// 融云消息實(shí)時(shí)改變UIBarButtonItem的顯示
[[NSNotificationCenter defaultCenter] addObserverForName:KRCMessage object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
[self setupRCMessageImageDetail];
}];
[[NSNotificationCenter defaultCenter] addObserverForName:KRCMessageOver object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
[self readRCMessageImageDetail];
}];
/// 未查看消息要做的事.| 同樣在改變`rightBarButtonItem`時(shí)候也要注意線程
- (void)setupRCMessageImageDetail {
dispatch_sync(dispatch_get_main_queue(), ^{
_message = [UIBarButtonItem BarButtonItemWithBackgroudImageName:@"xiaoxitixing" highBackgroudImageName:nil target:self action:@selector(messageCenter)];
});
}
/// 已查看消息要做的事.
- (void)readRCMessageImageDetail {
_message = [UIBarButtonItem BarButtonItemWithBackgroudImageName:@"xiaoxi" highBackgroudImageName:nil target:self action:@selector(messageCenter)];
}
e.移除通知
#pragma mark - 移除通知
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:KRCMessageOver object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:KRCMessage object:nil];
NSLog(@"===詳情頁死了====");
}
5.當(dāng)首次進(jìn)入聊天時(shí)候,默認(rèn)發(fā)送一條信息,比如我們需要知道買家查看的哪個(gè)商品并從哪個(gè)商品的詳情進(jìn)入到與賣家的聊天的,這樣方便知道買家對(duì)哪個(gè)商品感興趣
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
//判斷是否與剛剛查看的商品是同一個(gè),避免每次進(jìn)入都發(fā)送同樣的內(nèi)容
if (self.isSame) {
return;
}
RCTextMessage * text = [RCTextMessage new];
text.content = [NSString stringWithFormat:@"正在查看: %@ 價(jià)格: %@元/米",_modell.group_title,_modell.group_price];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self sendMessage:text pushContent:@"遠(yuǎn)程推送消息"];
});
}
上面這個(gè)是我在百度查到的因?yàn)楣俜轿臋n里這里有個(gè)坑,如下:

這里提示消息要和發(fā)送的消息區(qū)分開,因?yàn)樘崾鞠H僅買家能夠看得到,僅僅相當(dāng)于給買家一個(gè)提示,而并非也會(huì)發(fā)給賣家
到此基本完成了.整體思路僅供參考交流,暫無demo.大神勿噴.如有不足或者錯(cuò)誤望斧正.原創(chuàng),轉(zhuǎn)載請(qǐng)注明.