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;
网友评论