环信 即时消息

#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];
    }
}

你可能感兴趣的:(环信 即时消息)