三.登录,注册功能

1.注册功能实现:

  EMError *error = [[EMClient sharedClient] registerWithUsername:weakself.usernameTextField.text password:weakself.passwordTextField.text];

注意:
建议开辟新的线程去请求注册,切到主线程中判断是否注册成功;
如果成功 error就为空 失败则error.code 根据code不同情况进行反馈。

2.登录功能实现:

(1).实现代码

 EMError *error = [[EMClient sharedClient] loginWithUsername:username password:password];

注意:也是需要开辟线程去处理,同注册功能。

(2).登录成功的时候 :

//设置是否自动登录
[[EMClient sharedClient].options setIsAutoLogin:NO];

//获取数据库中数据
[MBProgressHUD showHUDAddedTo:weakself.view animated:YES];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // iOS专用,数据迁移到SDK3.0
    [[EMClient sharedClient] migrateDatabaseToLatestSDK];
    dispatch_async(dispatch_get_main_queue(), ^{
        // 异步获取用户加入的群组信息
        [[ChatDemoHelper shareHelper] asyncGroupFromServer];
        // 异步获取所有的会话信息
        [[ChatDemoHelper shareHelper] asyncConversationFromDB];
        // 从服务器获取用户的推送属性
        [[ChatDemoHelper shareHelper] asyncPushOptions];
        [MBProgressHUD hideAllHUDsForView:weakself.view animated:YES];
        //发送自动登陆状态通知
        [[NSNotificationCenter defaultCenter] postNotificationName:KNOTIFICATION_LOGINCHANGE object:@([[EMClient sharedClient] isLoggedIn])];
        
        //保存最近一次登录用户名
        [LZDataBaseTool saveLastLoginUsername];
    });
});
          

(3)上面成功后异步获取群组,会话和推送属性等的方法详情

#pragma mark - async Data

// 从服务器获取用户的推送属性
- (void)asyncPushOptions
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        EMError *error = nil;
        // 从服务器获取推送属性(获取推送的信息)
        [[EMClient sharedClient] getPushOptionsFromServerWithError:&error];
    });
    
}
// 异步获取用户加入的群组信息
- (void)asyncGroupFromServer
{
    __weak typeof(self) weakself = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 获取用户所有群组
        [[EMClient sharedClient].groupManager getJoinedGroups];
        EMError *error = nil;
        // 从服务器获取用户所有的群组,成功后更新DB和内存中的群组列表
        [[EMClient sharedClient].groupManager getMyGroupsFromServerWithError:&error];
        // 成功后刷新群组的界面
        if (!error) {
            if (weakself.contactViewVC) {
                dispatch_async(dispatch_get_main_queue(), ^{
                    [weakself.contactViewVC reloadGroupView];
                });
            }
        }
    });
}
// 异步获取所有的会话信息
- (void)asyncConversationFromDB
{
    __weak typeof(self) weakself = self;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        // 获取所有会话,如果内存中不存在会从DB中加载
        NSArray *array = [[EMClient sharedClient].chatManager getAllConversations];
        [array enumerateObjectsUsingBlock:^(EMConversation *conversation, NSUInteger idx, BOOL *stop){
            //如果会话的最新一条消息为空,就删除该会话
            if(conversation.latestMessage == nil){
                [[EMClient sharedClient].chatManager deleteConversation:conversation.conversationId isDeleteMessages:NO completion:nil];
            }
        }];
        // 成功后刷新群组的界面
        dispatch_async(dispatch_get_main_queue(), ^{
            if (weakself.conversationListVC) {
                [weakself.conversationListVC refreshDataSource];
            }
            
            if (weakself.mainVC) {
                [weakself.mainVC setupUnreadMessageCount];
            }
        });
    });
}

3.EMClientDelegate 的介绍
ChatDemoHelper遵循EMClientDelegate ;
ChatDemoHelper 这个类来处理所有被动收到服务器推送的消息:

EMClientDelegate 的所有回调方法介绍如下:

/*!
 *  SDK连接服务器的状态变化时会接收到该回调
 *
 *  有以下几种情况, 会引起该方法的调用:
 *  1. 登录成功后, 手机无法上网时, 会调用该回调
 *  2. 登录成功后, 网络状态变化时, 会调用该回调
 */
- (void)connectionStateDidChange:(EMConnectionState)aConnectionState;

/*!
 *  自动登录失败时的回调
 */
- (void)autoLoginDidCompleteWithError:(EMError *)aError;

/*!
 *  当前登录账号在其它设备登录时会接收到此回调
 */
- (void)userAccountDidLoginFromOtherDevice;

/*!
 *  当前登录账号已经被从服务器端删除时会收到该回调
 */
- (void)userAccountDidRemoveFromServer;

/*!
 *  服务被禁用
 */
- (void)userDidForbidByServer;

你可能感兴趣的:(三.登录,注册功能)