IM常用整理

前言

撤回消息,红包,昵称头像,输入状态提示

昵称和头像

昵称和头像的显示流程:

  • a用户发一条消息给b
  • b从服务器收到消息
  • 本地有a用户的数据,直接显示
  • 本地没有a用户的数据,向服务器请求a的数据,成功后显示

方法一:从服务器获取昵称和头像

获取:昵称和头像的获取:当收到一条消息(群消息),得到发送者的用户id,然后查找手机本地数据库是否有此用户的信息,如果没有就通过用户id查出来,然后进行本地数据缓存,下次用户来信息直接从本地缓存中抓取

更新:点击个人资料的时候更新数据缓存

方法二:从扩展中获取昵称和头像

获取:把用户的昵称和头像放到消息扩展中,通过消息发送给对方,并进行数据缓存,在聊天里面判断扩展字段显示,在会话列表取出最后一条消息判断扩展字段显示,第二次从数据缓存中读取

@property (nonatomic,copy) NSString *userId;            //用户id(自己的用户id)
@property (nonatomic,copy) NSString *nickname;          //昵称(自己的)
@property (nonatomic,copy) NSString *avatarUrl;         //地址(自己的)

@property (nonatomic,copy) NSString *othernickname;     //昵称(别人的或者群的)
@property (nonatomic,copy) NSString *otheravatarUrl;    //头像地址(别人的或者群的)
@property (nonatomic,copy) NSString *otherUserId;       //用户id(对方的用户id)

更新:当消息扩展里面的信息变化的时候更新数据缓存

撤回消息

用户A消息给用户B,用户a当需要撤回的时候,使用透传消息,将要撤回的消息id传给用户b,用户b搜到这条消息,将该id的消息从数据库中删除

  • A用户发送消息
  • A用户需要撤回某条消息,将消息id通过扩展消息发送到用户B
  • B用户收到扩展消息,解析其中的messageid,从数据库删除对应消息
  • 如果需要显示撤回的ui,则删除成功之后发送一条‘撤回消息’cell
  • qq能撤回消息的限制是2分钟

@功能

分析

群组中,@某人的和群组普通消息没有区别,只是针对被@的用户在 UI 上显示会有不同。可以通过环信的扩展消息来实现。

流程

  • 发送方将想要@的人的环信 ID 通过扩展字段放到扩展消息中,并把消息发到群里。
  • 群中成员在收到消息时,先检查扩展字段中是否有对应的字段,如果有,取出其中的环信 ID。
  • 检查取出的环信 ID 与当前登录的环信 ID 是否一致。
  • 如果检测一致,需要在 UI 上做特殊处理,显示出对应的提示信息,如“[有人@我]“,如不一致,不做处理。

发送时

// @某些人
message.ext = @{@"em_at_list":@[@"6001",@"6002"]}; // @6001,6002

接受时

-(void)didReceiveMessages:(NSArray *)messages{
    // 获取当前登录用户环信ID
    NSString *currentUserId = [[[EaseMob sharedInstance].chatManager loginInfo] objectForKey: kSDKUsername];
    // 被@用户环信ID
    for(EMMessage *msg in messages){
        NSArray *atList = [message.ext objectForKey:@"em_at_list"];
        for (NSString *atName in atList) {
            if (atName isEqualToString:currentUserId) {
             // 当前用户被@,需要单独处理UI                    
            }
        }
    }
}

红包流程

分析

主要分为发送红包,消息列表中的展示,检测是否被拆开,红包拆开(详情)界面,红包领取过后的红包领取消息

发送

A3268DCB2124C32899DB11229FCBDEEE.png
  • 网络请求发送红包获取第三方支付的支付参数
  • 调用第三方支付
  • 成功后发送一条消息增加红包扩展字段

红包扩展字段

红包ID,文字内容,是否是红包,

请求红包参数

发送者的id,接受者的id,发送的金额(单位分),第三方平台类型,发送的内容

消息列表展示

BB5963F34C2321A0129FDF14BF586638.png
  • 获取红包的扩展字段使用文本类型展示出来

点击红包

5E09D56439D2667925F19D3126B79E7F.png
  • 通过红包ID和用户ID请求服务器红包详情
  • 判断是不是发红包的用户,如果是发红包的用户直接进入详情
  • 如果是接受红包的用户,根据返回的拆开状态判定
  • 如果未拆开进行拆红包操作,如果已经拆开,直接进入红包详情
  • 拆开红包之后要发送一条红包已经领取消息(自定义cell)

红包领取消息扩展字段

是否是领取红包,领取人的名字

红包详情

红包的状态

  • 红包已过期
  • 红包已抢完
  • 红包不存在
  • 红包已领取
  • 红包已退还
  • 自己不能拆自己的红白
  • 红包未支付成功
  • 红包未领取

显示出领取人的一些信息和自己的信息

输入状态提示

功能:输入状态提示,当A用户正在输入文字的时候,聊天的对方可以收到用户A正在输入的提示。

监听用户a的输入,一旦有文字输入,每隔几秒,将消息输入状态发送给b,b客户端收到消息的时候提示a正在输入消息
顺序:

  • 用户a向用户b发送一条状态消息
  • 用户b在收到消息的时候,判断当前是否在和a的聊天界面,如果在就显示输入状态
  • 当隔了几秒没有收到a的状态消息,状态自动消失

注意:

  • 两边需要约束时间间隔
  • 这种消息不进行数据库的存储

环信的解决方案:
http://docs.easemob.com/im/490integrationcases/input-status

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容