融云头像修改问题

上篇文章记录了ios的融云集成过程,如果sdk添加没问题,按步骤复制粘贴应该是没问题的,下面介绍下集成过程中遇到的坑,及解决思路,希望给正在跳坑的人有所帮助。

出现场景 :A-B 正在聊天, A用的是头像1,突然A改成了头像2.此时B用户观察到的用户是头像1
需要场景 : A如果修改头像,正在聊天的B,应该是能及时看到A修改的新头像
融云提供思路

A.

12.png

经测试ios自定义聊天Cell时这个问题通过这种办法无法解决,且会产生新的问题,用户的头像和用户名显示有问题 比如Android发给ios的消息 ,ios显示的是不是UserName,而是<UserID>,
Ps:此刻已通过内容提供者查询了本用户数据)

B. 服务器保存用户的关系列表,当当前用户产生修改头像的动作时,后台通过大量广播通知好友刷新

  此方法没有采用,原因如下
  a. 我开发的app中没有用户好友概念
  b. 推送存在延迟和丢失,需要后台大量改动
  太麻烦了,放弃这种办法

C. 使用自定义消息体,即每条消息中携带自定义的用户信息

  缺点如下
  a. 我开发的app周期太急,Android版本已完成且开始了小范围内的推广测试 ,无法大范围修改
  b.自定义消息体修改太麻烦,每条消息携带,也太消耗资源

解决思路:

  综合开发周期和项目现有的情况,决定借鉴下第三种方法
  不自定义消息体,在A每次产生修改头像的动作时,不修改原有的消息体,通过携带多余信息的方式,通知正在聊天的对象B, B观察到A的通知, 完成缓存,缺点: 如果A修改以后 不再给B发消息,则B无法看到A头像的变化,对于我基本满足项目需求

第一步:

  关闭消息携带用户信息
RCIM.shared().enableMessageAttachUserInfo = false

第二步:

  判断用户会话列表Cell中用户信息为空的情况

   let userModel = RCIM.shared().getUserInfoCache(model.targetId)
        // 没有缓存用户信息 去接口查询
   if userModel == nil {
      delegate?.refreshUserInfo(userId: model.targetId)
   }

会话列表控制器中


// 解决融云头像的一种思路 有好办法 可以去掉
extension HomeRongMessageController: HomeRongMessageCellDelegate {
    func refreshUserInfo(userId: String) {
        //自己服务器查询本用户的信息,再缓存到本地
        UserHandler().requestRongUserInfo(userID: userId, success: { userInfo in  
            RongHelp.shared.refreshUserInfoCache(userInfo: userInfo)
            //  通过此方法只刷新本条会话
            // self?.conversationListTableView.reloadRows
        }) { (_) in
        }
    }

}

以上操作已经解决了自定义消息中出现的用户信息为空的极个别情况,和Android发送到iOS的消息用户名显示为<userID>的问题

第三步:(最重要的一步)

  分析当前需要A-B 正在聊天,A突然去修改了自己的头像,再返回和B继续聊天,此时B看到的A的头像应该修改
  好,首先A产生了修改头像的动作,再继续和B聊天,此时A可以在产生修改头像的动作以后,再给B第一次发送消息时携带自己的信息过去,B接受且缓存下,

  缺点 不发送B就看不到A的新头像(如果需求满足的可以继续往下看)

    var userMap: [String: String]? = nil
   //  我是其他页面产生了修改信息的动作
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        if let bean = UserToken.shared.userBean {
                userMap = [
                    "id" : "\(bean.userBean.id)",
                    "name": bean.profileBean.nickName,
                    "avatar" : TSRouter.fileCheckUrl + bean.profileBean.avatar]
            }
    }

    // 重写这个方法 每次第一次进来的时候 将个人信息带给对方
    // 注意我只在最常用的消息体RCTextMessage中携带了, 且RCTextMessage中有很多的extra 记住他的位置,
    override func sendMessage(_ messageContent: RCMessageContent!, pushContent: String!) {
        if let message = messageContent as? RCTextMessage , let map = userMap {
            let data : NSData! = try? JSONEncoder().encode(map) as NSData
            let string = NSString(data:data as Data,encoding: String.Encoding.utf8.rawValue)
            if let newString = string as String? {
                message.extra = newString
                super.sendMessage(message, pushContent: pushContent)
                userMap = nil
                return
            }
        }
        super.sendMessage(messageContent, pushContent: pushContent)
    }
    

以上的步骤是在会话详情页产生的
最后一步当然是接收这个消息(这步在RongHelp这个类中,可查看下上篇文章)

    /// 消息个数
   func onRCIMReceive(_ message: RCMessage!, left: Int32) {
   
      // 这个是用户用户修改首页底部消息数
       NotificationCenter.default.post(name: UserNotification.rongImMessageCount.notification, object: self)
   
       if message.conversationType == RCConversationType.ConversationType_PRIVATE {
           
           do{
               if let textMessage = message.content as? RCTextMessage, let extra = textMessage.extra {
                   let json = JSON(parseJSON: extra)
                   let userInfo = RCUserInfo(userId: json["id"].stringValue, name: json["name"].stringValue, portrait: json["avatar"].stringValue)
                   refreshUserInfoCache(userInfo: userInfo)
               }
           
           }catch{
               print("-------rong 解析异常")
           }
       
       }
   }

此上已经基本解决了iOS 和Android之间的头像修改显示问题
Android思路同上就不贴具体的实现代码了,回头把集成的代码整理下,再单独写篇文章

PS:上面的坑开发过程中不一定都会遇到,Android实现雷同, 如果遇到,希望有所帮助。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容

  • 点击查看原文 Web SDK 开发手册 SDK 概述 网易云信 SDK 为 Web 应用提供一个完善的 IM 系统...
    layjoy阅读 13,758评论 0 15
  • 发小的姥奶奶老了。老人家活了百岁,算是喜丧。上午,我到他家,他家里来了许多上了年纪的大爷,一个个看着脸熟,但都不认...
    桃叛道阅读 1,173评论 0 97
  • 酒逢知己千杯少,更何况是多年没见的好明友?没有多少时间,20个罐子空空如也。 我去前台要了1瓶白酒,2瓶红酒,结果...
    浮东流阅读 57评论 0 1
  • Fiddler导出Jmeter格式请求的方法 安装fiddler
    苏苏san阅读 410评论 1 1
  • windows安装 VMware 免费版(个人/非商业) https://www.vmware.com/cn/pr...
    小cai包阅读 123评论 0 0