网易云信开发相关

  1. 网易云信 UI 组件 · iOS

云信用户信息获取

云信提供的方式有两种 服务器同步信息 和 客户端同步信息,虽然云信推荐使用 服务器同步信息 方式,但是抱歉我们的产品不是这样做的,而是需要我们客户端储存用户信息进行维护资料。

在使用NIMKit中,涉及到会话列表,聊天页面,以及自定义聊天页面的设计,根据云信的设计中,只要有userId(我们项目中定义是叫做chatAccount,以下都称作userId),就能直接获取到用户信息,但是直接获取的话是获取到的云信维护的用户信息([NIMKit sharedKit].provider通过这个对象获取用户信息),但是我们的用户信息不依赖云信而是由我们自己维护,所以在聊天页面和会话列表显示出来的头像和名称有可能与我们自己需要的头像和名字不一致,在刚刚开始使用云信的NIMSDK的时候也确实纠结了一会,后来翻阅云信在guthub上的文档发现了,实际上我们只要有一个类实现了NIMKitDataProvider协议以及NIMKitDataProviderImpl类,并且在Appdelegate中像NIMSDK注册,就能够实现自定义的用户信息的获取了。

  1. 创建一个对象PGDataProviderImpl集成自NIMKitDataProviderImpl

  2. 重写NIMKitDataProvider协议中的方法,

  3. /**
     *  上层提供用户信息的接口
     *
     *  @param userId  用户ID
     *  @param option  获取选项
     *
     *  @return 用户信息
     */
    - (NIMKitInfo *)infoByUser:(NSString *)userId
                        option:(NIMKitInfoFetchOption *)option;
    
    
    /**
     *  上层提供群组信息的接口
     *
     *  @param teamId 群组ID
     *  @param option 获取选项
     *
     *  @return 群组信息
     */
    - (NIMKitInfo *)infoByTeam:(NSString *)teamId
                        option:(NIMKitInfoFetchOption *)option;
    

    我在早期实现这些方法的方式是

    • 先通过userId从我本地的数据库中获取资料
    • 获取本地数据库数据成功则返回对应的数据
    • 但是一旦本地数据库没有,则返回云信默认的数据(毕竟云信默认的数据是创建云信账号时的原始数据,等于是我们用户的初始数据,)同时向服务端获取最新的数据,且刷新界面。
    • 这是我一开始的解决方案,但是体验上感觉不好。

    后来修改了数据获取的策略,

    • 每条发送的消息中都会包含一条ext数据,这里包含了发送者的头像名称的相关需要的数据。ps.群聊消息则还会包含群聊的资料以及当前发送者在当前群聊中的群昵称以及其他相关资料。
    • 接收消息方会将本条消息中的有效数据暂时放在数据库中
    • 实现NIMKitDataProvider协议
    • 先通过userId从我本地的数据库中获取资料
    • 获取本地数据库数据成功则返回对应的数据
    • 但是一旦本地数据库没有,则优先返回接收的消息中缓存的用户资料,并且同时向自己的服务器获取完整的用户资料数据
    • 这样的话,体验上会好很多,不会出现前后显示不一致的情况了

3.在Appdelegate中,云信SDK注册方法之后写上[NIMKit sharedKit].provider = [[PGDataProviderImpl alloc]init];,以后在重写会话列表,聊天列表和群聊资料时获取到的资料就是我们需要的数据了。

自定义消息的实现

  1. 自定义消息模型 以及 发送自定义消息

    • 创建模型 实现 NIMCustomAttachment 协议,主要是实现- (NSString *)encodeAttachment;方法,才能使云信sdk将这条自定义的消息进行序列化,如果附带其它的附件消息,实现对应的协议方法即可。
    • 发送自定义消息和正常的发送消息没有区别,别忘了NIMCustomObject这个对象包含自定义消息模型就好了
  2. 接收自定义消息

    • 创建对象PGAttachmentDecoder并且实现NIMCustomAttachmentCoding协议,帮助云信实现自定义消息模型的反序列化。即实现- (id<NIMCustomAttachment>)decodeAttachment:(NSString *)content,content是上面encodeAttachment序列化出来的json数据。
    ```
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    {
        ...
        [NIMCustomObject registerCustomDecoder:[[AttachmentDecoder alloc]init]];
        ... 
    }
    ```

自定义消息cell

  1. 新建气泡内容
    气泡内容类需要继承 NIMSessionMessageContentView ,并使用 - (instancetype)initSessionMessageContentView 作为初始化方法。内容里根据业务需求自行排版。

    • 至于内部到底怎么写,可以参考云信提供的Demo。
    • 整个cell能自定义的部分也只有这个contentView,但是实际可以将这个气泡完全填充整个cell,也就变相的实现了整个cell的自定义
  2. 新建自定义消息气泡布局配置,配置需要实现 NIMCellLayoutConfig 协议。这里除自定义消息外,其他消息沿用内置配置,所以配置类继承基类 NIMCellLayoutConfig 。以下是云信官方提供的demo

    @interface CellLayoutConfig : NIMCellLayoutConfig<NIMCellLayoutConfig>
    @end
    
    @implementation CellLayoutConfig
    
    - (CGSize)contentSize:(NIMMessageModel *)model cellWidth:(CGFloat)width{
        //填入内容大小
        if ([self isSupportedCustomModel:model]) {
           //先判断是否是需要处理的自定义消息
           return CGSizeMake(200, 50);
        }
        //如果不是自己定义的消息,就走内置处理流程
        return [super contentSize:model
                        cellWidth:width];
    }
    
    - (NSString *)cellContent:(NIMMessageModel *)model{
        //填入contentView类型
        if ([self isSupportedCustomModel:model]) {
           //先判断是否是需要处理的自定义消息
           return @"ContentView";
        }
        //如果不是自己定义的消息,就走内置处理流程
        return [super cellContent:model];
    }
    
    - (UIEdgeInsets)cellInsets:(NIMMessageModel *)model{
        //填入气泡距cell的边距,选填
        if ([self isSupportedCustomModel:model]) {
           //先判断是否是需要处理的自定义消息
           return UIEdgeInsetsMake(5, 5, 5, 5);
        }
        //如果不是自己定义的消息,就走内置处理流程
        return [super cellInsets:model];
    }
    
    
    - (UIEdgeInsets)contentViewInsets:(NIMMessageModel *)model{
        //填入内容距气泡的边距,选填
        if ([self isSupportedCustomModel:model]) {
           //先判断是否是需要处理的自定义消息
           return UIEdgeInsetsMake(5, 5, 5, 5);
        }
        //如果不是自己定义的消息,就走内置处理流程
        return [super contentViewInsets:model];
    }
    @end
    
    
  3. 将创建好的布局配置类注入到组件中,保证在会话页实例化之前注入即可。

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

推荐阅读更多精彩内容