菜鸟搞环信~~~~~~

刚完成了环信的相关工作,刚好有时间来写一下关于环信的东西

马上进入主题吧

1.关于如何集成环信。

  集成环信的话就不多说了

2.如何修改环信的昵称和头像。

  这个我认为是重点。我也是一个新手,都是一步一个脚印,慢慢踩踏过来的。

  我的做法是分两个,一个是利用环信的ext扩展作为突破口。第二个是利用本地缓存作为突破口。

  首先说一下,为什么有两个?

  因为,我们在发消息的时候,可以利用环信的ext扩展,把头像之类的东西,存到消息里面。这样,我们在发消息的时候就可以获得头像之类的东西,然后就可以更新chatview。这个仅仅作用于发消息。在我们接收到一条新消息的时候,就不能这么搞了。因为,如果你之前没有发送过消息给他,那么你的ext扩展就不能穿过去给他。这样就会造成只有你发过消息的人才能正常显示。这里就需要用到本地缓存了。

  大致的思路就这样,那么我们就分散一步一步来~~

A。首先把单聊发消息的这个给先实现。

从这里push到环信的会话列表。push之前安全起见,先本地化头像。。

- (void)pushToChatViewController{

/// 新建一个会话

if ([self.model.user_no isEqualToString:[UserInfo shareUserInfo].user_no]) {

[MBProgressHUD showAndDismissInWindow:@"不能与自己聊天"];

return;

}

NSString *name = self.model.user_niname;

if (name.length == 0 || [name isEqualToString:@""]) {

name = @"xx";

}

//TODO:这里我只是为了测试

NSString *img = self.model.user_headimg;

if (img.length == 0 || [img isEqualToString:@""]) {

img = @"";

}

//保存用户的昵称和头像到数据库

MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",name]];

if (nickNameDB) {

MCNickNameDB *n = [MCNickNameDB new];

n.conversationId = self.userId;

n.niname = name;

n.headimg = img;

BOOL nick = [nickNameDB.niname isEqualToString:n.niname];

BOOL img = [nickNameDB.headimg isEqualToString:n.headimg];

if (!nick || !img) {

[MCNickNameDB deleteObjectsByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",n.conversationId]];

[n save];

MCNickNameDB *nickNameDB2 = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",n.conversationId]];

DLog(@"%@",nickNameDB2);

}

}else{

MCNickNameDB *n = [MCNickNameDB new];

n.conversationId = self.userId;

n.niname = name;

n.headimg = img;

[n save];

}

NSDictionary *ext = @{

EASE_Nicname_Other_Key:name,

EASE_Avatar_Other_Key:img

};

ChatViewController *chatController = [[ChatViewController alloc] initWithConversationChatter:_userId conversationType:EMConversationTypeChat ext:ext];

DLog(@"新建一个会话 ext == %@ ",ext);

chatController.title = _model.user_niname;

[self.navigationController pushViewController:chatController animated:YES];

}

  既然是发消息,那么久肯定跟EaseChatToolbar输入框有关了

  找到EaseChatToolbar

- (void)sendFaceWithEmotion:(EaseEmotion *)emotion{

  if (emotion) {

  if ([self.delegate respondsToSelector:@selector(didSendText:withExt:)]) {

  NSString *name = EASE_Nik_Name_Value;

  NSString *img = EASE_Avatar_Value;

  if ([name isEqualToString:@""] || name.length == 0) {

  name = EASE_Nik_Name_Def;

}

if ([img isEqualToString:@""] || img.length == 0) {

img = EASE_Avatar_Def;

}

///  兔斯基表情文本扩展

NSDictionary *ext = @{

EASEUI_EMOTION_DEFAULT_EXT:emotion,

EASE_Avatar_Key:img,

EASE_Nik_Name_Key:name

};

[self.delegate didSendText:emotion.emotionTitle withExt:ext];

[self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];;

}

}

      }      

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text{

if ([text isEqualToString:@"\n"]) {

if ([self.delegate respondsToSelector:@selector(didSendText:)]) {

NSString *name = EASE_Nik_Name_Value;

NSString *img = EASE_Avatar_Value;

if ([name isEqualToString:@""] || name.length == 0) {

name = EASE_Nik_Name_Def;

}

if ([img isEqualToString:@""] || img.length == 0) {

img = EASE_Avatar_Def;

}

NSDictionary *ext = @{

EASE_Avatar_Key:img,

EASE_Nik_Name_Key:name

};

[self.delegate didSendText:textView.text withExt:ext];

//结束

self.inputTextView.text = @"";

[self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];

}

return NO;

}

else if ([text isEqualToString:@"@"]) {

if ([self.delegate respondsToSelector:@selector(didInputAtInLocation:)]) {

if ([self.delegate didInputAtInLocation:range.location]) {

[self _willShowInputTextViewToHeight:[self _getTextViewContentH:self.inputTextView]];

return NO;

}

}

}

else if ([text length] == 0) {

//delete one character

if (range.length == 1 && [self.delegate respondsToSelector:@selector(didDeleteCharacterFromLocation:)]) {

return ![self.delegate didDeleteCharacterFromLocation:range.location];

}

}

return YES;

}

        

  在这两个方法上面 ,添加ext。。其实细心的人可以发现EaseChatToolbar的delegate是EaseMessageViewController

  所以也可以

  我比较建议在EaseMessageViewController,因为不管什么类型的消息都是走这个类的

  代码如下

 

- (void)didSendText:(NSString *)text withExt:(NSDictionary*)ext

{

//TODO:这里是不包括 add的

DLog(@"消息的携带体是ext == %@",ext);

DLog(@"img == %@, name == %@",ext[EASE_Avatar_Key],ext[EASE_Nik_Name_Def]);

NSMutableDictionary *dic = [NSMutableDictionary dictionary];

dic[EASE_Avatar_Key] = ext[EASE_Avatar_Key];

dic[EASE_Nik_Name_Def] = ext[EASE_Nik_Name_Def];

DLog(@"conversation == %@",_conversation.conversationId);

if (self.conversation.type == 1) {/// 群聊

MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",_conversation.conversationId]];

dic[EASE_GroupID__Key] = nickNameDB.conversationId;

dic[EASE_Nicname_Group_Key] = nickNameDB.niname;

dic[EASE_Avatar_Group_Key] = nickNameDB.headimg;

DLog(@"EASE_GroupID__Key == %@",dic[EASE_Nicname_Group_Key]);

}

if ([ext objectForKey:EASEUI_EMOTION_DEFAULT_EXT]) {

EaseEmotion *emotion = [ext objectForKey:EASEUI_EMOTION_DEFAULT_EXT];

if (self.dataSource && [self.dataSource respondsToSelector:@selector(emotionExtFormessageViewController:easeEmotion:)]) {

/// 这里是纯兔斯基 发送

NSDictionary *emojiDic = [self.dataSource emotionExtFormessageViewController:self easeEmotion:emotion];

if (self.conversation.type == 1) {/// 群聊

dic[@"em_expression_id"] = emojiDic[@"em_expression_id"];

dic[@"em_is_big_expression"] = emojiDic[@"em_is_big_expression"];

}

[self sendTextMessage:emotion.emotionTitle withExt:dic];

} else {

// 这里需要加上消息扩张

if (self.conversation.type == 0) {

[self sendTextMessage:emotion.emotionTitle withExt:

@{

MESSAGE_ATTR_EXPRESSION_ID:emotion.emotionId,MESSAGE_ATTR_IS_BIG_EXPRESSION:@(YES),

EASE_Avatar_Key:dic[EASE_Avatar_Key],

EASE_Nik_Name_Key:dic[EASE_Nik_Name_Key]

}

];

}else{/// 群聊

[self sendTextMessage:emotion.emotionTitle withExt:

@{

MESSAGE_ATTR_EXPRESSION_ID:emotion.emotionId,MESSAGE_ATTR_IS_BIG_EXPRESSION:@(YES),

EASE_Avatar_Key:dic[EASE_Avatar_Key],

EASE_Nik_Name_Key:dic[EASE_Nik_Name_Key],

EASE_Avatar_Group_Key:dic[EASE_Avatar_Group_Key],

EASE_Nicname_Group_Key:dic[EASE_Nicname_Group_Key],

EASE_GroupID__Key:dic[EASE_GroupID__Key]

}

];

}

}

return;

}

if (text && text.length > 0) {

/// 纯文字副本发送

if (self.conversation.type == 0) {

[self sendTextMessage:text withExt:ext];

}else{/// 群聊

[self sendTextMessage:text withExt:dic];

}

}

}

以上标有群聊的可以先忽略不做

在所有发消息的(兔斯基,表情,文字,表情+文字等等)统统加上ext

例如

- (void)sendTextMessage:(NSString *)text

{

// NSDictionary *ext = nil;

/// 在这里添加emoji 头像

NSString *name = EASE_Nik_Name_Value;

NSString *img = EASE_Avatar_Value;

if ([name isEqualToString:@""] || name.length == 0) {

name = EASE_Nik_Name_Def;

}

if ([img isEqualToString:@""] || img.length == 0) {

img = EASE_Avatar_Def;

}

NSMutableDictionary *ext = [NSMutableDictionary dictionary];

ext[EASE_Avatar_Key] = img;

ext[EASE_Nik_Name_Key] = name;

if (self.conversation.type == 1) {//群聊

MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",_conversation.conversationId]];

ext[EASE_GroupID__Key] = nickNameDB.conversationId;

ext[EASE_Nicname_Group_Key] = nickNameDB.niname;

ext[EASE_Avatar_Group_Key] = nickNameDB.headimg;

DLog(@"EASE_GroupID__Key == %@",ext[EASE_Nicname_Group_Key]);

}

if (self.conversation.type == EMConversationTypeGroupChat) {

NSArray *targets = [self _searchAtTargets:text];

if ([targets count]) {

__block BOOL atAll = NO;

[targets enumerateObjectsUsingBlock:^(NSString *target, NSUInteger idx, BOOL *stop) {

if ([target compare:kGroupMessageAtAll options:NSCaseInsensitiveSearch] == NSOrderedSame) {

atAll = YES;

*stop = YES;

}

}];

if (atAll) {

ext = @{kGroupMessageAtList: kGroupMessageAtAll};

}

else {

ext = @{kGroupMessageAtList: targets};

}

}

}

[self sendTextMessage:text withExt:ext];

}

那么,所有的消息都带上了ext,基本上发消息的就完成了。

回到chatViewController里面

- (NSDictionary*)emotionExtFormessageViewController:(EaseMessageViewController *)viewController

easeEmotion:(EaseEmotion*)easeEmotion{

///  兔斯基表情文本扩展

NSString *name = EASE_Nik_Name_Value;

NSString *img = EASE_Avatar_Value;

if ([name isEqualToString:@""] || name.length == 0) {

name = EASE_Nik_Name_Def;

}

if ([img isEqualToString:@""] || img.length == 0) {

img = EASE_Avatar_Def;

}

return @{

MESSAGE_ATTR_EXPRESSION_ID:easeEmotion.emotionId,MESSAGE_ATTR_IS_BIG_EXPRESSION:@(YES),

EASE_Avatar_Key:img,

EASE_Nik_Name_Key:name

};

}

- (id<IMessageModel>)messageViewController:(EaseMessageViewController *)viewController

modelForMessage:(EMMessage *)message{

id<IMessageModel> model = nil;

model = [[EaseMessageModel alloc] initWithMessage:message];

//TODO:这里设置环信的头像

NSDictionary *dic  = message.ext;

NSString *userName = dic[EASE_Nik_Name_Key];

NSString *sendUserImg = dic[EASE_Avatar_Key];

model.avatarURLPath = sendUserImg;

model.nickname = userName;

UserProfileEntity *profileEntity = [[UserProfileManager sharedInstance] getUserProfileByUsername:model.nickname];

if (profileEntity) {

model.avatarURLPath = profileEntity.imageUrl;

model.nickname = profileEntity.nickname;

}

model.failImageName = @"imageDownloadFail";

return model;

}

这样发消息就ok了。。。

下面就说一下接收消息,接收消息我用本地缓存。

接收消息的话,就找chatdemohelper

找到

/// 这里好重要   就是收到消息扩张

- (void)didReceiveMessages:(NSArray *)aMessages

{

//保存用户的昵称和头像到数据库

BOOL isRefreshCons = YES;

for(EMMessage *message in aMessages){

DLog(@"EMChatType == %d  ext == %@",message.chatType,message.ext);

if (message.chatType == 0) { // 单聊

//保存用户的昵称和头像到数据库

MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",message.conversationId]];

if (nickNameDB) {

MCNickNameDB *n = [MCNickNameDB new];

n.conversationId = message.conversationId;

n.niname = message.ext[EASE_Nik_Name_Key];

n.headimg = message.ext[EASE_Avatar_Key];

BOOL nick = [nickNameDB.niname isEqualToString:n.niname];

BOOL img = [nickNameDB.headimg isEqualToString:n.headimg];

if (!nick || !img) {

[MCNickNameDB deleteObjectsByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",message.conversationId]];

[n save];

MCNickNameDB *nickNameDB2 = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",message.conversationId]];

DLog(@"%@",nickNameDB2);

}

}else{

MCNickNameDB *n = [MCNickNameDB new];

n.conversationId = message.conversationId;

n.niname = message.ext[EASE_Nik_Name_Key];

n.headimg = message.ext[EASE_Avatar_Key];

[n save];

}

}else{ //TODO: 聊天时 群聊

//保存群聊的昵称和头像到数据库

NSDictionary *ext = message.ext;

MCNickNameDB *nickNameDB = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",message.conversationId]];

if (nickNameDB) {

MCNickNameDB *n = [MCNickNameDB new];

n.conversationId = ext[EASE_GroupID__Key];

n.niname = ext[EASE_Nicname_Group_Key];

n.headimg = ext[EASE_Avatar_Group_Key];

BOOL nick = [nickNameDB.niname isEqualToString:n.niname];

BOOL img = [nickNameDB.headimg isEqualToString:n.headimg];

if (!nick || !img) {

[MCNickNameDB deleteObjectsByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",n.conversationId]];

[n save];

MCNickNameDB *nickNameDB2 = [MCNickNameDB findFirstByCriteria:[NSString stringWithFormat:@" WHERE conversationId = %@ ",n.conversationId]];

DLog(@"%@",nickNameDB2);

}

}else{

MCNickNameDB *n = [MCNickNameDB new];

n.conversationId = ext[EASE_GroupID__Key];

n.niname = ext[EASE_Nicname_Group_Key];;

n.headimg = ext[EASE_Avatar_Group_Key];

[n save];

}

}

BOOL needShowNotification = (message.chatType != EMChatTypeChat) ? [self _needShowNotification:message.conversationId] : YES;

#ifdef REDPACKET_AVALABLE

/**

*  屏蔽红包被抢消息的提示

*/

NSDictionary *dict = message.ext;

needShowNotification = (dict && [dict valueForKey:RedpacketKeyRedpacketTakenMessageSign]) ? NO : needShowNotification;

#endif

UIApplicationState state = [[UIApplication sharedApplication] applicationState];

if (needShowNotification) {

#if !TARGET_IPHONE_SIMULATOR

switch (state) {

case UIApplicationStateActive:

[self.mainVC playSoundAndVibration];

break;

case UIApplicationStateInactive:

[self.mainVC playSoundAndVibration];

break;

case UIApplicationStateBackground:

[self.mainVC showNotificationWithMessage:message];

break;

default:

break;

}

#endif

}

if (_chatVC == nil) {

_chatVC = [self _getCurrentChatView];

}

BOOL isChatting = NO;

if (_chatVC) {

isChatting = [message.conversationId isEqualToString:_chatVC.conversation.conversationId];

}

if (_chatVC == nil || !isChatting || state == UIApplicationStateBackground) {

[self _handleReceivedAtMessage:message];

if (self.conversationListVC) {

[_conversationListVC refresh];

}

if (self.mainVC) {

[_mainVC setupUnreadMessageCount];

}

return;

}

if (isChatting) {

isRefreshCons = NO;

}

}

if (isRefreshCons) {

if (self.conversationListVC) {

[_conversationListVC refresh];

}

if (self.mainVC) {

[_mainVC setupUnreadMessageCount];

}

}

}

以上,,单聊的基本完成。。。。如果有遗漏,请留言,,

下面是群聊

其实群聊跟单聊是一样,,不过,就是给ext扩展再添加一个群的名称,一个群的头像。

然后在拿属性的时候,划分一下是群聊还是单聊。。。

这里就不一一到来,上面有标注群聊的大家可以看一下~~~

时间: 2024-10-12 23:48:54

菜鸟搞环信~~~~~~的相关文章

菜鸟搞环信

刚完成了环信的相关工作,刚好有时间来写一下关于环信的东西 马上进入主题吧 1.关于如何集成环信. 集成环信的话就不多说了 2.如何修改环信的昵称和头像. 这个我认为是重点.我也是一个新手,都是一步一个脚印,慢慢踩踏过来的. 我的做法是分两个,一个是利用环信的ext扩展作为突破口.第二个是利用本地缓存作为突破口. 首先说一下,为什么有两个? 因为,我们在发消息的时候,可以利用环信的ext扩展,把头像之类的东西,存到消息里面.这样,我们在发消息的时候就可以获得头像之类的东西,然后就可以更新chatv

一言不合你就用环信搞个直播APP

原文地址:http://community.easemob.com/article/825307904 里面还有我的更多开源项目干货,欢迎大家过来点赞 最近互联网直播平台催生了一批批网红大咖,作为程序猿,我们绝不甘于委身幕后做搬砖工,我们一定要闪亮登场!!!做一个属于我们程序猿的IOS版直播平台~~ 来吧!少年,跟着我们做完这个APP,下一个"朱碧石",肯定就是你啦~ 先看看我们即将要做的这个APP的成品截图,内心激动一下啵~ so-是不是很酷啊?But...上面这个APP,需要对各种

环信 集成 笔记

环信的教程: 没有初始化SDK 去AppDelegate里面初始化 密码 User not exist         ?????????? 每一个应用都有自己的注册用户  去你的后台管理   去看你的注册的用户数 为什么demo的可以跑起来???????? 是在它的应用下注册的 怎么去注册用户  -注册用户 用户名字可以相同   不同的应用 那个打印的loginInfo 是这个字典的也就是用户的登录信息 你会发现打印的loginInfo上面还有一坨恶心的东西,那个是环信SDK自己打印的日志信息

环信SDK与Apple Watch的结合(2)

这一篇主要是介绍怎么拖apple watch上的相关页面,附源码EMWatchOCDemo. 需要在工程中的“EMWatchOCDemo WatchKit App”中进行操作,该文件夹的 WatchKit几乎不允许直接coding页面,只能在storyboard上拖来拖去,对于我这种习惯直接coding 页面的人来说,真真是极痛苦的. 一.确定apple watch上的操作流程 首先,我想要一个菜单页面,跟iPhone程序对应,在环信SDK未登录情况下,显示登录选项;在环信 SDK登录情况下,有

[Java]直播方案----[接入环信聊天室]+[腾讯云直播]

辛辛苦苦写的,转载请注明一下,这点信任我想还是有的吧,谢谢了. http://www.cnblogs.com/applerosa/p/7162268.html 之前做了直播,一直没时间写,好不容易闲下来,所以总结记录一下. 需要注意的是,在获取环信聊天室ID和腾讯云三个推/拉流地址的时候,需要先去注册,获取所用开发者账号. 所以这个教程所必须的东西: 1.环信开发者账号; 2.腾讯云开发者账号; 一.做直播,肯定要有一个直播模型,这里我们用直播间来做示例: 这里只是做个基础的演示,所以都是必须的

业务系统需要怎样的全局唯一ID? #Ticktick#(环信首席架构师:一乐)

ID 生成器在微博我们一直叫发号器,微博就是用这样的号来存储,而我微博里讨论的时候也都是以发号器为标签.它的主要目的确如平常大家理解的"为一个分布式系统的数据object产生一个唯一的标识",但其实在一个真实的系统里可能也可以承担更多的作用.概括起来主要有以下几点: 1. 唯一性 2. 时间相关 3. 粗略有序 4. 可反解 5. 可制造 下面我会分别讲每个作用后面的考虑和权衡,也会对比介绍一下业界已知的几种 ID 设计. 1. 要唯一性,是否需要全局唯一? 说起全局唯一,通常大家都会

iOS 环信 集成 详细步骤图文

环信的教程: 没有初始化SDK 去AppDelegate里面初始化 密码 User not exist         ?????????? 每一个应用都有自己的注册用户  去你的后台管理   去看你的注册的用户数 为什么demo的可以跑起来???????? 是在它的应用下注册的 怎么去注册用户  -注册用户 用户名字可以相同   不同的应用 那个打印的loginInfo 是这个字典的也就是用户的登录信息 你会发现打印的loginInfo上面还有一坨恶心的东西,那个是环信SDK自己打印的日志信息

环信Demo 导入错误

今天想导入环信的Demo 去看一看环信学习一下 谁知道导入出现这么个问题 Error:(1, 0) Minimum supported Gradle version is 3.3. Current version is 2.14.1. If using the gradle wrapper, try editing the distributionUrl in H:\Git-Work\PointOfCare\gradle\wrapper\gradle-wrapper.properties to

iOS: 环信的推送

原文:http://m.blog.csdn.net/article/details?id=38824551 1.先创建一个apns证书,链接如下 http://developer.easemob.com/docs/emchat/ios/push/certificate.html 创建完证书后,将证书弄成p12文件,然后上传到环信后台 2.再创建真机调试证书,和描述文件,保证能进行真机调试.并且appid要又推送功能 3.绑定环信证书和appkey //注册 APNS文件的名字, 需要与后台上传证