#import "ViewController.h"
#import <EaseMob.h>
@interface ViewController ()<EMChatManagerDelegate>
@property(nonatomic, strong)EMConversation *conversation;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
/**
1. 使⽤用环信SDK实现注册 2. 使⽤用环信SDK实现登录 3. 使⽤用环信SDK实现好友 4. 使⽤用环信SDK实现聊天
*/
/**
*先用cocoapods导入下第三方类库 pod 'EaseMobSDKFull'
*本内容有异步的全部用异步,带回调的方式
*/
//进入消息页面就要刷新
//刷新是自己写的方法 n
[self refreshChatRecords];
//注册*****
[[EaseMob sharedInstance].chatManager asyncRegisterNewAccount:@"" password:@"" withCompletion:^(NSString *username, NSString *password, EMError *error) {
//回调可以获得注册的名字和密码以及如果出错,返回错误类型
} onQueue:dispatch_get_main_queue()];
//登陆*****
[[EaseMob sharedInstance].chatManager asyncLoginWithUsername:@"" password:@"" completion:^(NSDictionary *loginInfo, EMError *error) {
//回调登陆信息,及错误类型
} onQueue:dispatch_get_main_queue()];
//注销*****
//清空缓存的用户信息
[[NSUserDefaults standardUserDefaults]setObject:nil forKey:@"userInfo"];
//注销用户登陆状态
[[EaseMob sharedInstance].chatManager asyncLogoffWithUnbindDeviceToken:YES];
#warning 环信不是好友也可以聊天,是不推荐使用好友机制的,如果有自己的服务器,需要自己维护好友关系
//获取好友列表*****
[[EaseMob sharedInstance].chatManager asyncFetchBuddyListWithCompletion:^(NSArray *buddyList, EMError *error) {
//获得buddyList好友列表这个数组
} onQueue:dispatch_get_main_queue()];
#warning 添加好友注意,如果已经发送了好友请求但是对方没有做出反应,将不能再次请求
//添加好友*****
EMError *error = nil;
BOOL isSuccess = [[EaseMob sharedInstance].chatManager addBuddy:@"对方账号" message:@"请求信息(如:我是你大哥,赶紧加我好友!)" error:&error];
if (isSuccess && !error) {
NSLog(@"添加成功");
}
//*****当收到了好友请求后,如果没有处理该请求,那么每次登录的时候,服务器都会再次发送该请求, 所以当登录成功之前确保实现1这个代理⽅方法
//*****当好友请求得到了处理时就会调用2和3的代理方法
//删除好友*****
EMError *error2 = nil;
BOOL isSuccess2 = [[EaseMob sharedInstance].chatManager removeBuddy:@"账号" removeFromRemote:YES error:&error];
if (isSuccess2 && !error2) {
NSLog(@"删除成功");
}
//发送消息***** (IM交互实体,在SDK中对应的类型是EMMessage EMMessage可以由多个符合<IEMEMMessage>协议的body组成,推荐使⽤⼀个body)
//**文字消息**
//先生成聊天的文本对象类型
EMChatText *chatText = [[EMChatText alloc]initWithText:@"消息内容"];
//构造body
EMTextMessageBody *body = [[EMTextMessageBody alloc]initWithChatObject:chatText];
//生成message
EMMessage *message = [[EMMessage alloc]initWithReceiver:@"收信者账号" bodies:@[body]];
//设置聊天模式
message.messageType = eMessageTypeChat;//单聊消息
/**
eMessageTypeChat,
eMessageTypeGroupChat,//群聊消息
eMessageTypeChatRoom//聊天室消息
*/
// //**图片消息**(还有别的类型如声音,文件,视频的消息)
// EMChatImage *chartImage = [[EMChatImage alloc]initWithUIImage:[UIImage imageNamed:@"图片名字"] displayName:@"不知道啥,用时在研究把"];
// EMImageMessageBody *imageBody = [[EMImageMessageBody alloc]initWithChatObject:chartImage];
// EMMessage *imMessage = [[EMMessage alloc]initWithReceiver:@"收信者账号" bodies:@[imageBody]];
// //也设置模式 方法同上 就不写了
//发送消息****
/**
*登录成功之后才能进⾏行聊天操作
*待发送的消息对象和发送后的消息对象是同⼀一个对象, 在发送过程中对象属性 可能会被更改. 在发送过程中, willSendMessage:error:和 didSendMessage:error:这两个回调会被触发
*message消息对象(包括from, to, body列表等信息)
*progress发送多媒体信息时的progress回调对象
*/
[[EaseMob sharedInstance].chatManager asyncSendMessage:message progress:nil prepare:^(EMMessage *message, EMError *error) {
NSLog(@"准备发送");
} onQueue:dispatch_get_main_queue() completion:^(EMMessage *message, EMError *error) {
//发送完成. 可以刷新界面显示最新聊天记录了
} onQueue:dispatch_get_main_queue()];
//接收消息****
//**接收普通在线消息**
/**
*在线的普通消息会执行4的代理方法
*当EMConversation对象的enableReceiveMessage为YES时会触发这个回调
*/
//**接收普通的离线消息**
//调用5代理方法
//会话**** 指的是聊天消息EMMessage的容器,在SDK中对应的类型是EMConversation
/**
**添加/创建会话
*ConversationType:会话类型
*conversationForChatter:获取或创建与某账户的会话
*/
EMConversation *conversation2 = [[EaseMob sharedInstance].chatManager conversationForChatter:@"某账户" conversationType:eConversationTypeChat];
//获取所有messages
[conversation2 loadAllMessages];
/**
**删除会话 根据一个conversation删除一个会话 如果已经有过会话则直接获取该会话
*removeConversationByChatter:删除与某个用户的会话
*deleteMessages:删除会话中的消息
*oppend2Chat:是否更新内存中的内容
*/
[[EaseMob sharedInstance].chatManager removeConversationByChatter:@"某用户" deleteMessages:YES append2Chat:YES];
}
#pragma mark - 1 - 收到好友请求的代理方法
/**
*千万别忘了签代理:
[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:dispatch_get_main_queue()];
*/
-(void)didReceiveBuddyRequest:(NSString *)username message:(NSString *)message
{
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"收到来自%@的请求", username] message:message preferredStyle:(UIAlertControllerStyleAlert)];
UIAlertAction * acceptAction = [UIAlertAction actionWithTitle:@"好" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * action) {
EMError * error;
//同意好友请求的方法
if ([[EaseMob sharedInstance].chatManager acceptBuddyRequest:username error:&error] && !error) {
NSLog(@"发送同意成功");
}
}];
UIAlertAction * rejectAction = [UIAlertAction actionWithTitle:@"滚" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction * _Nonnull action) {
EMError * error;
//拒绝好友请求的方法
if ([[EaseMob sharedInstance].chatManager rejectBuddyRequest:username reason:@"滚, 快滚!" error:&error] && !error) {
NSLog(@"发送拒绝成功");
}
}];
[alertController addAction:acceptAction];
[alertController addAction:rejectAction];
[self showDetailViewController:alertController sender:nil];
}
#pragma mark - 2 - 当之前发出的好友请求得到处理时所调⽤用的代理⽅方法
-(void)didAcceptedByBuddy:(NSString *)username
{
NSLog(@"%@接受了你的好友请求!", username);
}
#pragma mark - 3 - 当之前发出的好友请求得到处理时所调⽤用的代理⽅方法
-(void)didRejectedByBuddy:(NSString *)username
{
NSLog(@"%@拒绝了你的好友请求!", username);
}
#pragma mark - 4 - 接收在线消息
-(void)didReceiveMessage:(EMMessage *)message
{
//接收消息去调用 n 方法刷新数据就行了
[self refreshChatRecords];
}
//可以返回是谁发来的消息(可以用来刷新好友列表,提示哪个好友有新消息了)
//-(void)didReceiveMessageId:(NSString *)messageId chatter:(NSString *)conversationChatter error:(EMError *)error
//{
//
//}
#pragma mark - 5 - 接收在线消息
-(void)didReceiveOfflineMessages:(NSArray *)offlineMessages
{
//offlineMessages是个数组哟,离线消息列表就靠它了 ps:如何区分是谁发的呢?(这个代理要写在聊天界面里的,代理写在谁的聊天界面了就是谁发的?待验证!)
}
#pragma mark - n 刷新聊天记录数据
- (void)refreshChatRecords
{
_conversation = [[EaseMob sharedInstance].chatManager conversationForChatter:@"聊天人的名字" conversationType:eConversationTypeChat];
if ([_conversation loadAllMessages].count > 0) {
//有数据再刷新
// [_tableView reloadData];
//将tableView滚动到最后行
// [_tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:[_conversation loadAllMessages].count - 1 inSection:0] atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}
}