IM

IM

【社区精华|持续更新】收录本社区精华内容,手把手教学IM/RTC开发!

IM即时通讯admin 发表了文章 • 8 个评论 • 492 次浏览 • 2020-12-07 14:41 • 来自相关话题

本文收录了GeekOnline社区精华内容,希望帮助社区开发者学习IM+RTC知识,解答疑惑。赠人玫瑰,手有余香,如您有不错的内容需要收录,欢迎在在评论区投稿回复。Android篇融云即时通讯SDK集成 — 通知检查融云 IM SDK 集成 —- 刷新会话界面... ...查看全部

本文收录了GeekOnline社区精华内容,希望帮助社区开发者学习IM+RTC知识,解答疑惑。赠人玫瑰,手有余香,如您有不错的内容需要收录,欢迎在在评论区投稿回复。

微信截图_20201207144054.png

Android篇

融云即时通讯SDK集成 — 通知检查

融云 IM SDK 集成 —- 刷新会话界面和会话列表界面

Android 端如何添加自定义表情

解决融云 SDK 4.0 版本配置 https 导航报 SSLHandshakeException

融云清空历史消息 Android 端

唠一唠融云的消息扩展功能

融云 IMkit 拦截或监听所有发送消息

融云如何把图片消息的图片上传到自己的文件服务器

唠一唠融云 VIVO push 无法跳转的解决方案

融云即时通讯SDK集成 — 定制UI(一) ——会话界面小改动

融云即时通讯SDK集成 — 定制UI(二) ——添加自定义表情库

融云即时通讯SDK集成 — 定制UI(三) ——兼容Android Q

融云如何把图片消息的图片上传到自己的文件服务器

融云即时通讯SDK集成 — 华为推送的点击跳转处理

带你实现女朋友欲罢不能的 App

Flutter 集成融云 sdk

配置融云SDK的自签证书

自定义消息 包含 list 数组

关于融云聊天室KV 值的正确使用

融云 IM SDK 转 AndroidX

融云即时通讯SDK集成 — 国内厂商推送集成踩坑篇(Android平台)

在融云 IMkit 会话界面基础上添加消息已读未读

融云聊天室属性 kv

融云 ConversationListFragment 会话列表添加头部布局

融云即时通讯SDK集成 — FCM推送集成指南(Android平台)

融云集成之避坑指南-Android推送篇

融云IMKit 动态删除或添加plugin 的实现


iOS篇

iOS 基于实时音视频 SDK 实现屏幕共享功能——1

iOS 基于实时音视频 SDK 实现屏幕共享功能——2

iOS 基于实时音视频 SDK 实现屏幕共享功能——3

iOS 基于实时音视频 SDK 实现屏幕共享功能——4

如何隐藏融云输入框语音按钮

给融云的输入框上方加个功能按钮,怎么整?

融云 IM SDK 如何插入消息

集成融云 IMLib 时,如何实现一套类似于 IMKit 的用户信息管理机制

为融云聊天页面的输入框添加 Placeholder

30 分钟集成融云 IM 即时通讯

简单介绍融云 imkit 包含功能

融云的聊天页面在 iOS14 出现崩溃的解决办法

融云聊天页面长按消息后“翻译”功能的实现方法

使用融云 IM 点击最近聊天记录时跳转到 @ 自己的消息

如何设置融云用户信息

自定义融云会话列表 cell 选中背景

融云 IMKit 音频录制参数

融云会话页面刷新不及时问题

融云 Flutter IM SDK 解析

关于融云 SDK 在使用 p8 证书的坎坷~

融云 SDK 如何实现群组操作

如何利用融云 IMLib 来实现一个阅后即焚功能

干货分享——使用融云通讯能力库 IMLib 实现单群聊的阅读回执


Web篇

作为小白接融云 IM SDK 新路体验~

微信小程序集成融云 SDK (即时通讯) 集成必备条件

Web 端使用融云 SDK 集成实现滑动加载历史消息

融云IM SDK web 端集成 — 表情采坑篇

融云 Web SDK 如何实现表情的收发 ?

集成融云小程序 SDK 遇到的问题

使用融云 Web SDK 撤回消息

融云 RTC SDK 集成实现直播,趟坑之旅~~~

融云 Web SDK 删除历史消息

集成融云小程序 SDK 遇到的问题

Web 端集成融云 SDK 如何发送正确图片消息给移动端展示?

使用融云 IM SDK 实现 H5 直播聊天

WebRTC 实现实时音视频技术研究

融云发送语音消息

融云 CallLib 集成遇到的问题

结合融云 WebSDK 了解 WebSocket 基本原理

集成融云 Web 音视频通话踩坑之旅

SDK 兼容 JSON

融云 IM SDK 发送语音消息

集成融云 IM 问题总结

融云 Web SDK 如何实现只有一个设备登入

融云 Web 播放声音 — Flash 篇 (播放 AMR、WAV)

融云 IM 那些事儿

融云 AMR(Aduio) 播放 AMR 格式 Base64 码音频


社区福利

【领取见面礼】限量 100份 GeekOnline加油包!等你来拿

【有奖调研】Geek Online 2020 编程挑战赛参赛调研

【征稿活动】Geek Online 社区第一期投稿激励计划已启动!


GeekOnline编程挑战赛

Geek Online 2020 编程挑战赛官网

重磅!Geek Online 2020 编程挑战赛来了!

Geek Online 2020 编程挑战赛 GitHub 仓库

2 个月激烈角逐,15 支队伍突围决赛路演!Geek Online 2020 编程挑战赛完美收官!

一张图回顾 Geek Online 2020 编程挑战赛精彩瞬间!

“这些项目不是什么赚大钱的项目,但是它们足够有趣。”丨关于 Geek Online 2020 编程挑战赛,选手们如是说

融云 CTO 杨攀: Geek Online 2020 编程挑战赛 让开发者站上 C 位

【参赛攻略】你想了解的Geek Online 2020 编程挑战赛常见问题这里都有!

【融云集成常见问题整理】Geek Online 2020 编程挑战赛选手提问整理


求职招聘

【招聘】寻一枚熟悉融云IM的开发工程师,坐标合肥,待遇从优

和50万优质程序员一起成长——程序员客栈招聘

持续更新....

一把双刃剑 -- 融云即时通讯sdk中的自定义消息使用心得&指南 (上)

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 15 次浏览 • 3 天前 • 来自相关话题

背景:最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).他家的官网和文档地址:... ...查看全部

微信截图_20210224192427.png

背景:

最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).

他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4

这个任务当然还是落在我的头上. 我是使用的他们家的带UI的sdk,(他们家有带UI和不带UI的两种sdk, 不带UI的sdk就是只有即时通讯能力, 所有的UI都需要开发者自定实现, 带UI的sdk封装了一些基本的界面,例如会话列表, 和别人聊天的会话界面).

需求:

融云的体系中默认的消息类型只有9种.


功能     |     描述


文字消息       |     用来发送文字类消息,其中可以包括表情、超链接(会自动识别),客户端收到消息后计入未读消息数、进行存储。

语音消息     |     发送高质量的短语音消息,录制的语音文件存储到融云服务端,语音文件格式为 AAC,时长上限为 60 秒,客户端收到消息后计入未读消息数、进行存储。

图片消息     |     用来发送图片类消息,客户端收到消息后计入未读消息数、进行存储。图片缩略图格式为 JPG,大小建议不超过 100k。

GIF 图片消息     |     用来发送 GIF 动态图片消息,客户端收到消息后计入未读消息数、进行存储。

图文消息     |     用来发送图文消息,包含一个标题,一段文字内容和一张图片,客户端收到消息后计入未读消息数、进行存储。

文件消息     |     用来发送文件类消息,客户端收到消息后计入未读消息数、进行存储。

位置消息     |     用来发送地理位置消息,客户端收到消息后计入未读消息数、进行存储。

小视频消息     |     用来发送小视频消息,支持录制发送及选择本地视频文件发送两种方式,录制时长不超过 10 秒,本地选择视频文件方式时长不超过 2 分钟,小视频消息小视频文件格式为 .mp4,客户端收到消息后计入未读消息数、进行存储。

合并转发消息     |     IMKit SDK 中支持将多条消息合并为一条消息进行发送,合并后的消息以 HTML 文件的方式存储到融云服务端,客户端收到消息后计入未读消息数、进行存储。

这9种消息其实已经满足大部分的即时聊天场景了, 无论是打字聊天最普通的文本消息, 还是长按录制发送的语音消息, 以及图片消息, 分享位置的消息. 基本上微信有的场景, 都覆盖到了.

但是因为各家的产品各不相同, 有人需要一个比微信功能更简洁的聊天工具, 有人则需要一个像QQ那般功能强大的聊天工具. 总是有千奇百怪不同的需求的. 像我们的app就是这样, 总有场景是这里无法满足的. 好比QQ是可以把图片和文本消息放入同一个消息气泡中的(类似于富文本消息), 那么这样的情况下, 默认的几类消息就不够用了.

不过融云还是把这块做的很到位的, 暴露了类和接口让用户去对消息做自定义, 基本上可以做到, 想把消息定义成什么样就定义成什么样子.

心得(上)

这里就举一些我在开发我们公司app时, 用到的自定义消息, 以及使用心得和指南.

只发给当前在线用户的限时奖励通知

只给当前在线用户发送消息, 我们有一种游戏奖励是只发放给特殊时段在线的用户的, 只有当前在线的用户才能接收到这种消息来领取奖励, 其他在该时段未在线的用户, 不能接收到, 且再次登录后也不能接收到保留的离线消息. 这个需求就是做了一个自定义消息来实现的. 把自定义消息类的 MessageTag 中 flag 值设置为 MessageTag.STATUS。此消息类型即为状态消息,状态消息不存储不计数,并且当接收方不在线时,此消息会直接丢弃,用户再上线也不会收到该消息。

有需要的同学可以看他们家关于自定义消息的文档:https://docs.rongcloud.cn/im/imkit/android/conversation/custom_message/

发送自定义消息后撤回消息,撤回消息会失败

这里积累了一个经验, 也算是帮大家踩踩他们家的坑了, 那就是: 使用以下废弃方法发送自定义时会出现此错误:

在发送自定义消息后,撤回消息时没有反应,退出会话界面再次进入后可以正常撤回消息。 在 log 中显示 recallMessage errorCode = 25101。

public Message sendMessage(ConversationType type, String targetId, MessageContent content, String pushContent, String pushData, final SendMessageCallback callback) {

必须要换成这个方法发送才行:

public void sendMessage(Message message, String pushContent, String pushData, final ISendMessageCallback callback)

这个问题也是蛮坑的, 害. 找他们家技术支持费了点劲才排查出来, 希望大家遇到这种问题能快快找到我这篇经验哈.


【Android开发】如何使用融云的消息扩展

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 14 次浏览 • 3 天前 • 来自相关话题

从 【4.0.3 】版本开始,融云新增了消息扩展功能,文档如下: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/expansion/android.html总结文... ...查看全部

微信截图_20210224192550.png

从 【4.0.3 】版本开始,融云新增了消息扩展功能,文档如下: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/expansion/android.html

总结文档中的几个重点:

  • 4.0.3之前的版本无法使用。

  • 消息扩展是 Message类的属性,也就是说自定义消息也可以使用。

  • 单条消息只能设置300个kv,(某些场景不可用,比如在群里发400个人可领的红包)。

  • 仅支持单聊、群聊。

  • key和value都是字符串类型,并且key不能是中文,否则会报错INVALID_PARAMETER。

  • 用IMKit的UI发送消息时需要拦截一下,设置消息扩展开关。

使用步骤:

  1. 消息的发送端必须给需要消息扩展的消息开开关,没有全局设置,只能单条消息设置。分以下两种情况:

  2. 如果使用的是 IMKit 提供的UI发送消息,在 ConversationFragment中的 onSendToggleClick 方法发送消息,在 sendMessage 前调用下面的方法

    /**
     * 设置消息扩展信息列表
     * 

扩展信息只支持单聊和群组,其它会话类型不能设置扩展信息。


     *
     * @param expansion 消息扩展信息列表
     */
    public void setExpansion(HashMap<String, String> expansion) {
        this.expansion = expansion;
    }

还需要设置 canIncludeExpansion 和 expansionDic 。

  • 如果是自己调用 RongIM 和 RongIMClient 接口发的消息,用 MessageContent 类的对象构造一个 Message 对象,然后设置 canIncludeExpansion 和 expansionDic 再调用RCIM中对应的 send 方法将消息发送出去即可。

  • 更新和删除扩展的操作可以参考官方文档。

  • 想要实时捕获消息扩展的更改和删除,就需要设置回调,在回调中更新UI。设置回调可参考官方文档。

融云官网:https://www.rongcloud.cn/

文档频道:https://docs.rongcloud.cn/v4


一把双刃剑 -- 融云即时通讯sdk中的自定义消息使用心得&指南 (下)

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 15 次浏览 • 3 天前 • 来自相关话题

背景:最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).他家的官网和文档地址:... ...查看全部

微信截图_20210224192919.png

背景:

最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).

他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4

这个任务当然还是落在我的头上. 我是使用的他们家的带UI的sdk,(他们家有带UI和不带UI的两种sdk, 不带UI的sdk就是只有即时通讯能力, 所有的UI都需要开发者自定实现, 带UI的sdk封装了一些基本的界面,例如会话列表, 和别人聊天的会话界面).

心得 (下)

自定义小视频消息

接上篇对自定义消息的开发心得哈.

因为融云家自带的小视频消息是需要收费的, 需要在服务端开通小视频服务后, 同时在端上做一下配置, 才可以使用小视频消息. 我一看这还得了, 想方设法收我钱呢不是. 不过他家只是对小视频类型的消息在服务端做了限制, 而不是完全不让在消息中携带视频链接. 自定义消息是随便自定义的, 那么我自定义一个小视频消息不就好啦.

大概实现思路如下:

自定义小视频消息继承MediaMessageContent,其中mLocalPath是小视频文件本地的存放路径,mMediaUrl是小视频文件上传到文件服务器后的http/https地址。

小视频的拍摄,播放我们RongCloud SDK没有接口,开发者自己实现。

当拍摄完成,发送小视频消息时使用方法

sendMediaMessage(final Message message, final String pushContent, final String pushData, final IRongCallback.ISendMediaMessageCallback callback)或者

sendMediaMessage(final Message message, final String pushContent, final String pushData, final IRongCallback.ISendMediaMessageCallbackWithUploader callback)

这两个方法的不同是后者开发者负责小视频文件的上传到指定的服务器,前者使用我们RongCloud默认的文件服务器

以上是大致步骤,小视频开发过程中可能遇到的问题,说明如下:

1.关于缩略图的处理,我们SDK没有直接上传一张图片返回一个url地址的接口,开发者可以把缩略图上传到自己的服务器,这样缩略图跟mMediaUrl类似,小视频消息展示显示缩略图时加载一张网络图片即可。

另一种缩略图处理方式类似我们SDK发送图片消息时的缩略图处理,把缩略图做base64编码,放到自定义消息体中直接传输,这种方式涉及到消息发送时把缩略图转化为base64数据和接收到消息时还原为缩略图,在我们SDK内部使用的是MessageHandler。

关于MessageHandler,我们RongCloud的每个消息都有一个MessageHandler,此前我们文档从没有介绍过这个

MessageHandler,对用户透明的,用户的自定义消息没有指定它是因为有个默认的DefaultMessageHandler。

自定义消息时可以指定自己的MessageHandler,例如图片消息的定义如下

ImageMessage.png

MessageHandler在消息发送和接收时在IPC进程中会被自动调用,它有两个方法,encodeMessage

和decodeMessage,在消息接收后调用decodeMessage时开发者可以把base64对应的数据转化为缩略图url,这样在展示缩略图时直接使用url即可。

/**
 * 解码 {@link MessageContent} 到 {@link Message} 中。
 *
 * @param message 用于存放 MessageContent 的消息实体。
 * @param content 将要被解码的 MessageContent。
 */
public abstract void decodeMessage(Message message, T content);

/**
 * 对 {@link Message} 编码。
 *
 * @param message 将要被编码的 Message 实体。
 */
public abstract void encodeMessage(Message message);

此文档包含了两个附件分别为自定义小视频消息和对应的小视频消息MessageHandler,供开发者参考

2.开发中可能还会遇到小视频文件上传时进度更新的问题,如果开发者自定义的小视频消息不继承自MediaMessageContent而是MessageContent,需要自己在UI上维护上传进度


融云 Android 端如何清空某一个会话的聊天记录

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 13 次浏览 • 3 天前 • 来自相关话题

融云 Android 端如何清空某一个会话的聊天记录实现须知没有开通 “历史消息云存储”,只能删除本地的数据。在融云控制台开通 “历史消息云存储功能” 后,才可以删除远端消息。实现步骤1.调用 cleanHistoryMessages 方法,cleanRemo... ...查看全部

融云 Android 端如何清空某一个会话的聊天记录

微信截图_20210224192137.png

实现须知

没有开通 “历史消息云存储”,只能删除本地的数据。在融云控制台开通 “历史消息云存储功能” 后,才可以删除远端消息。

实现步骤

1.调用 cleanHistoryMessages 方法,cleanRemote 传 true ,recordTime 传 当前的时间戳。

/**
     * 删除指定时间戳之前的消息,可选择是否同时删除服务器端消息
     * 

此方法从服务器端清除历史消息,但是必须先开通历史消息云存储功能。


     * 

根据会话类型和 TargetId 清除某一会话指定时间戳之前的本地数据库消息(服务端历史消息),
     * 清除成功后只能从本地数据库(服务端)获取到该时间戳之后的历史消息。


     *
     * @param conversationType 会话类型。
     * @param targetId         会话目标ID。
     * @param recordTime       清除消息截止时间戳,【0 ~ 当前时间的 Unix 时间戳】。
     * @param cleanRemote      是否删除服务器端消息
     * @param callback         清除消息的回调。
     */
    public void cleanHistoryMessages(final Conversation.ConversationType conversationType,
                                     final String targetId,
                                     final long recordTime,
                                     final boolean cleanRemote,
                                     final OperationCallback callback)

2.您使用的是 imlib ,还需要自行刷新您的界面。 3.您使用的是 imkit 调用 ConversationFragment 的 getMessageAdapter 方法,获取到会话界面消息展示适配器,移除数据并且刷新数据源。

mListAdapter.removeAll();
mListAdapter.notifyDataSetChanged();

4.卸载重装或者更换设备登陆后,历史消息还可以拉取到,来保证用户更换设备或者卸载重装后还可以有上下文。如果您不希望换端后再收到这些消息,您可以 提供一下 appkey 提交工单,我们帮您把这部分数据的缓存功能关闭。

融云即时通讯sdk, 把头像设置为圆角图片在4.x和5.x的区别 -- 融云即时聊天sdk使用小技巧

IM即时通讯fanta2 发表了文章 • 0 个评论 • 24 次浏览 • 5 天前 • 来自相关话题

背景:最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).他家的官网和文档地址:... ...查看全部

微信截图_20210222180703.png

背景:

最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).

他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4

这个任务当然还是落在我的头上. 我是使用的他们家的带UI的sdk,(他们家有带UI和不带UI的两种sdk, 不带UI的sdk就是只有即时通讯能力, 所有的UI都需要开发者自定实现, 带UI的sdk封装了一些基本的界面,例如会话列表, 和别人聊天的会话界面). 最近正好他们家也对IMKit大版本进行了迭代 (4.x --> 5.0). 我这边也就跟随他们做了一下迭代, 把项目中使用的4.0.1.1版本sdk, 直接升级到了5.0的版本.

知识点:

融云sdk中自带的UI都是矩形的头像, 无论是会话列表还是会话界面里, 都是矩形的. 但是我们项目中需求是圆形头像, 所以需要我再自定义一下.

4.x版本

在4.x版本中, 我是直接改的xml布局文件. 这个是会话界面的头像, 会话列表头像也是同理.

在 rc_item_message.xml 配置文件中 修改 RCCornerRadius="3dp" 配置的值。设置头像圆角大小。

5.0版本

在5.0版本中, 因为融云在这个迭代过程中把图片库从ImageLoader换成了Glide, 所以这块修改就更加方便, 也更便于阅读了 直接在代码中设置即可:

RongConfigCenter.featureConfig().setKitImageEngine(new GlideKitImageEngine() {
            @Override
            public void loadConversationListPortrait(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
                Glide.with(imageView).load(url)
                        .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                        .into(imageView);
            }

            @Override
            public void loadConversationPortrait(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
                Glide.with(imageView).load(url)
                        .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                        .into(imageView);
            }
        });


融云 IMKit SDK 5.X 升级说明

IM即时通讯fanta2 发表了文章 • 0 个评论 • 24 次浏览 • 5 天前 • 来自相关话题

Tips如果您应用依赖于 suport 包,可参考 AndroidX 迁移文档将依赖转换为 AndroidX 后,再集成 IMKit SDK 5.X版本。1. 类路径调整IMKit SDK 5.X 版本重构了 SDK 的架构,通过 MVVM 框架实现... ...查看全部

Tips

如果您应用依赖于 suport 包,可参考 AndroidX 迁移文档将依赖转换为 AndroidX 后,再集成 IMKit SDK 5.X版本。

微信截图_20210222180400.png

1. 类路径调整

IMKit SDK 5.X 版本重构了 SDK 的架构,通过 MVVM 框架实现,导致很多类路径发生了更改,下表列出了 5.X 之前版本对外公开类的路径变更:

2.x 、4.x 版本路径
io.rong.imkit.fragment.ConversationListFragment
io.rong.imkit.fragment.ConversationFragment
io.rong.imkit.RongExtension
io.rong.imkit.userInfoCache.RongUserInfoManager
io.rong.imkit.mention.RongMentionManager
io.rong.imkit.manager.IUnReadMessageObserver

5.x 版本路径
io.rong.imkit.conversationlist.ConversationListFragment
io.rong.imkit.conversation.ConversationFragment
io.rong.imkit.conversation.extension
io.rong.imkit.userinfo.RongUserInfoManager
io.rong.imkit.feature.mention.RongMentionManager
io.rong.imkit.manager.UnReadMessageManager.IUnReadM

路径调整 Tips

参照上表,在 AndroidStudio 中 command+shift+R 全局搜索旧的类路径,替换为新路径。 如果深度定制化了 IMKit SDK,部分类路径的调整可能不在上述列表中,升级以后 AndroidStudio 会有红色报错。删除报错类里红色未识别的导入路径,鼠标停留到报错的地方,根据 AndroidStudio 的提示导入新路径即可。如果有多个地方使用了该路径,可以参考第一步里的方法,全局搜索并替换。

2. 集成方式变更

页面跳转时由原先的隐式调用方式更改为显示调用, 因此集成步骤有所简化和更改。您需要先移除旧版本 AndroidManifest.xml 文件中关于 IMKit SDK 的配置,参考官网文档重新集成。

3. 消息展示模板变更

列表页由 ListView 更改为效率更高的 RecycleView,因此自定义消息的展示模板需要对应调整。

将自定义消息的展示模板更改为继承 BaseMessageItemProvider<>, 并实现基类方法。 移除展示模板里原先的注解,原注解属性可在新模板构建类里通过调用基类成员 mConfig 的各个方法进行配置

4. 内部实现变更

资源名称变更。IMKit SDK 5.x 版本重新统一了资源名称的命名,如果您自定义了部分资源文件,可参考官网自定义文档,重新替换对应名称的资源。

移除了 EventBus 。IMKit 5.x 版本不再依赖于 EventBus 进行事件分发,更改为通过观察者模式实现。如果您应用里使用了旧版本 SDK 里的 EventBus, 升级后需要您从应用层自己引入依赖。

移除 RongContext 类。如果您应用里有调用 RongContext 作为上下文使用的地方,请更改为调用您自己的应用上下文。

由于更改为 MVVM 框架,原 fragment 里很多业务相关接口被移除,您可参考官网 5.x 版本文档重新进行页面自定义。



融云IMKit 动态删除或添加plugin 的实现

IM即时通讯fanta2 发表了文章 • 0 个评论 • 21 次浏览 • 5 天前 • 来自相关话题

在集成融云的过程中,由于项目要求比较紧急,所以使用了融云的IMKit (带有UI界面的),但是由于使用融云方面的自带的UI ,所以就会不可避免的就会有些自定义化的需求;接下来,我就项目中使用到的 动态删除或添加plugin 的方案给大家介绍一下。ps:满满的私... ...查看全部

在集成融云的过程中,由于项目要求比较紧急,所以使用了融云的IMKit (带有UI界面的),但是由于使用融云方面的自带的UI ,所以就会不可避免的就会有些自定义化的需求;

微信截图_20210222160507.png

接下来,我就项目中使用到的 动态删除或添加plugin 的方案给大家介绍一下。ps:满满的私货,官网文档并没有动态的方式。

第一步:需要先复写 ConversationFragment ,在onCreateView 方法中找到 RongExtension 控件 。

public class ConversationFragmentEx extends ConversationFragment {

    private RongExtension rongExtension;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = super.onCreateView(inflater, container, savedInstanceState);
        rongExtension = (RongExtension) v.findViewById(io.rong.imkit.R.id.rc_extension);

        return v;
    }
}

第二步:再复写 initFragment 方法获取 targetId。(按需进行获取,若是不需要则无需获取)

 @Override
    protected void initFragment(Uri uri) {
        super.initFragment(uri);
        if (uri != null) {
            String TargetId = uri.getQueryParameter("targetId");
        }
    }

第三步:然后再onResume方法中根据 targetId进行删除或增加(项目需求)

@Override
    public void onResume() {
        super.onResume();
        List<IPluginModule>  PluginModules = rongExtension.getPluginModules();
        for(int i=0;i<PluginModules.size();i++){
            if(PluginModules.get(i) instanceof DefaultLocationPlugin){
                rongExtension.removePlugin(PluginModules.get(i));
            }
        }
    }

若是想要增加,则可以调用 mRongExtension.addPlugin 进行添加。

通过以上步骤就可以完成动态添加或者删除 plugin;


融云 FCM 推送与打包方式有关

IM即时通讯fanta2 发表了文章 • 0 个评论 • 35 次浏览 • 5 天前 • 来自相关话题

1.一切都配置完成之后, 开始测试. 第一次启动App, 杀死. 发送测试消息. 收不到推送.2.再次启动App, 杀死, 发送测试消息. 这次能收到推送了.第一次杀死App之后, 发送测试消息, 可以看到log中会即时打出:09-17 11:50:... ...查看全部

1.一切都配置完成之后, 开始测试. 第一次启动App, 杀死. 发送测试消息. 收不到推送.
2.再次启动App, 杀死, 发送测试消息. 这次能收到推送了.

第一次杀死App之后, 发送测试消息, 可以看到log中会即时打出:

09-17 11:50:34.298 W/GCM ( 2025): broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.rongcloud.fcm_demo (has extras) }

GCM打出的log, result=CANCELLED. 广播的intent发送回调是: cancelled. 也就是这个广播还没发送到app层/sdk层, 就已经被系统拦截到了. 失败了.

最开始以为是App关于GCM, 或者FCM的权限问题. 在manifest里遗漏了某个配置, 或者App的通知权限没有打开. 但是做了一番检查以及配置之后, 这个问题还是存在.
之后求助于Google和StackOverflow, 发现有些人是遇到过类似问题的, 但是都没有一个很好的解决方案, 把网上的解决方法一一尝试之后, 这个顽固的问题还是存在.

后来也是一个偶然的发现, 如果我在IDE中直接点击“Run”把App安装运行到手机上, 会出现这个问题, 但是我把项目打包成apk后, 再安装到手机上. 这个问题就消失了, 第一次杀死App之后, 也是可以顺利收到消息的. 这样才把这个问题给解决掉.


IM 消息数据存储结构设计

IM即时通讯admin 发表了文章 • 0 个评论 • 128 次浏览 • 2021-01-28 14:25 • 来自相关话题

1背景在移动互联网高速发展的时代,生活中 IM 类产品已经是我们离不开的应用了,像微信、钉钉等都是以 IM 为核心功能的社交产品。另外也有一些应用不是以 IM 为核心,但是也是其重要功能,比如在线游戏、电商直播等应用。在 IM 庞大的体系中,消息系统无疑是最核... ...查看全部

1背景

在移动互联网高速发展的时代,生活中 IM 类产品已经是我们离不开的应用了,像微信、钉钉等都是以 IM 为核心功能的社交产品。另外也有一些应用不是以 IM 为核心,但是也是其重要功能,比如在线游戏、电商直播等应用。

IM 庞大的体系中,消息系统无疑是最核心的,而消息系统中,最关键的部分是消息的分发和存储。

在以往传统消息系统中,对于在线的用户,消息会直接实时发送到在线的接收方,消息发送完成后,服务器端并不会对消息进行落地存储。对于离线的用户,服务器端会将消息存入到离线库,当用户登录后,从离线库中将离线消息拉走,然后服务器端将离线消息删除,这样的缺点是消息不持久化,导致消息无法支持消息漫游,降低了消息的可靠性。而在我们的消息系统中,服务器只要接收到了发送方发上来的消息,在转发给接收方的同时也会在离线数据库以及历史消息库中进行消息的落地存储,消息的落地也就支持了整体的消息漫游等相关功能。

 

2离线消息和历史消息的区别

离线消息,就是用户在离线过程中收到的消息,这些消息大多是用户比较关心的消息,具有一定的时效性。我们的系统设计,离线消息默认只保存最近七天的消息。离线消息在用户登录后会全量的获取,然后客户端根据会话进行整体离线消息的展示。

历史消息,存储了用户所有的消息,包括发的消息以及接收的消息。在客户端获取历史消息时,是按照会话进行分页获取的。历史消息的存储时间我们系统设计默认为半年,当然这个是可配置的。

3消息的发送以及存储的流程

融云整体的消息发送以及存储的流程如下图所示:

1.png

用户发送消息到服务器端后,首先会进入到消息系统中,消息系统会对消息进行分发以及存储。对于在线的接收方,会选择直接推送消息,但是遇到接收方不在线或者是消息推送失败的情况下,也会有另外的消息获取方式,接收方会主动向服务器拉取未收到的消息,但是接收方何时来服务器拉取消息以及从哪里拉取是未知的,所以消息存入到离线库的意义也就在这里。

   消息系统存储离线的过程中,为了不影响整个系统的更为平稳,融云使用了消息队列,消息是异步存入到离线库中的。

   在分发完消息后,消息服务会同步一份消息数据到历史消息服务中,历史消息服务会对消息进行落地存储。对于新的同步设备,会有消息漫游的需求,这也是历史消息的主要作用。在历史消息库中,客户端可以拉取任意会话的全量历史消息。

4 离线消息以及历史消息存储区别

   上述的图中我们能清晰的看到,离线消息我们存储介质选用的是 Redis,历史消息我们选用的是 HBase。为何选用不同的存储介质针对的是不同的业务场景和读写模式。下面我们重点介绍一下离线消息和历史消息存储的区别。

离线消息的存储模式是放大写,如下图所示,每个用户都有自己单独的收件箱和发件箱,收件箱存放需要向这个接收端同步的所有消息,发件箱里存的是发送端发送的所有消息。二人会话中的消息会产生两次写,发送者的发件箱以及接收端的收件箱。而在群的场景下,写入会被更加的放大,如果群里有 N 个人,那一条群消息就会被放大写 N 次。

放大写的优点是,接收端的逻辑会非常清晰简单,只需要从收件箱里读取一次即可,大大降低了同步消息所需的读的压力,但是缺点就是写入会被放大,特别是针对群这种场景。

2.png

历史消息的存储模式是放大读,因为历史消息中,每个会话都保存了整个会话的全量消息。在放大读这种模式下,每个会话的消息只保存一次。相比放大写的那种模式,写入次数大大降低,特别是针对群消息,只需要存一次即可。但是缺点是接收端接收消息非常的复杂和低效,因为这种模式客户端想拉取到所有消息就只能每个会话同步一次,读就会被放大,而且可能会产生很多次无效的读,因为有些会话可能根本没有新消息。

3.png

  IM 这种应用场景下,通常会用到写扩散这种消息同步模型,一条消息产生一条,但是可能会被读多次,是典型的读多写少的场景。一个优化好的系统,必须从设计上平衡读写压力,避免读或者写任意一个维度达到天花板。当然写扩展这种模式也有其弊端,比如万人群,会导致一条消息,写入了一万次。综合来讲,我们需要根据自己的业务场景做相应设计选择,我们的系统是根据了离线和历史消息的不同场景选择了写扩散和读扩散的组合模式。

5 客户端拉取消息

    离线消息的获取针对的是自己的整个离线消息,包括所有的会话。离线消息的获取是自上而下的方式,一次获取 200 条。在客户端拉取离线消息的信令中,需要带上当前客户端缓存的消息的最大时间戳,上面的图我们应该知道,离线消息我们存储的是一个线性结构,Server 会根据这个时间戳向下查找离线消息,重装或者新安装 App 时,客户端可以传 0 上来,Server 也会缓存客户端拉取到的最后一条消息的时间戳,然后根据业务场景,客户端类型等因素来决定从哪里开始拉取,如果没有拉取完 Server 会在拉取消息的应答中带相应的标记位,告诉客户端继续拉取,客户端循环拉取,直到所有离线消息拉完。

历史消息的获取针对的是单一会话,在拉取过程中需要带上来对方的 ID(如果是单聊的话就是对方的 UserID,如果是群,则是群组 ID 以及当前会话的最前面消息的时间戳,Server 会定位到这个人的这个会话然后一次获取 20 条,采用的是自下而上的方式,即从最后面往前翻。只要有消息,客户端可以一直向前翻,手动触发获取会话的历史消息。

 

6总结

   本篇文章主要讲了 IM 中消息系统的消息分发、存储等,重点介绍了离线消息和历史消息的区别以及两者存储中所选用的不同存储方式以及其优缺点。关于文中内容,也欢迎大家随时留言与我讨论。


【社区精华|持续更新】收录本社区精华内容,手把手教学IM/RTC开发!

IM即时通讯admin 发表了文章 • 8 个评论 • 492 次浏览 • 2020-12-07 14:41 • 来自相关话题

本文收录了GeekOnline社区精华内容,希望帮助社区开发者学习IM+RTC知识,解答疑惑。赠人玫瑰,手有余香,如您有不错的内容需要收录,欢迎在在评论区投稿回复。Android篇融云即时通讯SDK集成 — 通知检查融云 IM SDK 集成 —- 刷新会话界面... ...查看全部

本文收录了GeekOnline社区精华内容,希望帮助社区开发者学习IM+RTC知识,解答疑惑。赠人玫瑰,手有余香,如您有不错的内容需要收录,欢迎在在评论区投稿回复。

微信截图_20201207144054.png

Android篇

融云即时通讯SDK集成 — 通知检查

融云 IM SDK 集成 —- 刷新会话界面和会话列表界面

Android 端如何添加自定义表情

解决融云 SDK 4.0 版本配置 https 导航报 SSLHandshakeException

融云清空历史消息 Android 端

唠一唠融云的消息扩展功能

融云 IMkit 拦截或监听所有发送消息

融云如何把图片消息的图片上传到自己的文件服务器

唠一唠融云 VIVO push 无法跳转的解决方案

融云即时通讯SDK集成 — 定制UI(一) ——会话界面小改动

融云即时通讯SDK集成 — 定制UI(二) ——添加自定义表情库

融云即时通讯SDK集成 — 定制UI(三) ——兼容Android Q

融云如何把图片消息的图片上传到自己的文件服务器

融云即时通讯SDK集成 — 华为推送的点击跳转处理

带你实现女朋友欲罢不能的 App

Flutter 集成融云 sdk

配置融云SDK的自签证书

自定义消息 包含 list 数组

关于融云聊天室KV 值的正确使用

融云 IM SDK 转 AndroidX

融云即时通讯SDK集成 — 国内厂商推送集成踩坑篇(Android平台)

在融云 IMkit 会话界面基础上添加消息已读未读

融云聊天室属性 kv

融云 ConversationListFragment 会话列表添加头部布局

融云即时通讯SDK集成 — FCM推送集成指南(Android平台)

融云集成之避坑指南-Android推送篇

融云IMKit 动态删除或添加plugin 的实现


iOS篇

iOS 基于实时音视频 SDK 实现屏幕共享功能——1

iOS 基于实时音视频 SDK 实现屏幕共享功能——2

iOS 基于实时音视频 SDK 实现屏幕共享功能——3

iOS 基于实时音视频 SDK 实现屏幕共享功能——4

如何隐藏融云输入框语音按钮

给融云的输入框上方加个功能按钮,怎么整?

融云 IM SDK 如何插入消息

集成融云 IMLib 时,如何实现一套类似于 IMKit 的用户信息管理机制

为融云聊天页面的输入框添加 Placeholder

30 分钟集成融云 IM 即时通讯

简单介绍融云 imkit 包含功能

融云的聊天页面在 iOS14 出现崩溃的解决办法

融云聊天页面长按消息后“翻译”功能的实现方法

使用融云 IM 点击最近聊天记录时跳转到 @ 自己的消息

如何设置融云用户信息

自定义融云会话列表 cell 选中背景

融云 IMKit 音频录制参数

融云会话页面刷新不及时问题

融云 Flutter IM SDK 解析

关于融云 SDK 在使用 p8 证书的坎坷~

融云 SDK 如何实现群组操作

如何利用融云 IMLib 来实现一个阅后即焚功能

干货分享——使用融云通讯能力库 IMLib 实现单群聊的阅读回执


Web篇

作为小白接融云 IM SDK 新路体验~

微信小程序集成融云 SDK (即时通讯) 集成必备条件

Web 端使用融云 SDK 集成实现滑动加载历史消息

融云IM SDK web 端集成 — 表情采坑篇

融云 Web SDK 如何实现表情的收发 ?

集成融云小程序 SDK 遇到的问题

使用融云 Web SDK 撤回消息

融云 RTC SDK 集成实现直播,趟坑之旅~~~

融云 Web SDK 删除历史消息

集成融云小程序 SDK 遇到的问题

Web 端集成融云 SDK 如何发送正确图片消息给移动端展示?

使用融云 IM SDK 实现 H5 直播聊天

WebRTC 实现实时音视频技术研究

融云发送语音消息

融云 CallLib 集成遇到的问题

结合融云 WebSDK 了解 WebSocket 基本原理

集成融云 Web 音视频通话踩坑之旅

SDK 兼容 JSON

融云 IM SDK 发送语音消息

集成融云 IM 问题总结

融云 Web SDK 如何实现只有一个设备登入

融云 Web 播放声音 — Flash 篇 (播放 AMR、WAV)

融云 IM 那些事儿

融云 AMR(Aduio) 播放 AMR 格式 Base64 码音频


社区福利

【领取见面礼】限量 100份 GeekOnline加油包!等你来拿

【有奖调研】Geek Online 2020 编程挑战赛参赛调研

【征稿活动】Geek Online 社区第一期投稿激励计划已启动!


GeekOnline编程挑战赛

Geek Online 2020 编程挑战赛官网

重磅!Geek Online 2020 编程挑战赛来了!

Geek Online 2020 编程挑战赛 GitHub 仓库

2 个月激烈角逐,15 支队伍突围决赛路演!Geek Online 2020 编程挑战赛完美收官!

一张图回顾 Geek Online 2020 编程挑战赛精彩瞬间!

“这些项目不是什么赚大钱的项目,但是它们足够有趣。”丨关于 Geek Online 2020 编程挑战赛,选手们如是说

融云 CTO 杨攀: Geek Online 2020 编程挑战赛 让开发者站上 C 位

【参赛攻略】你想了解的Geek Online 2020 编程挑战赛常见问题这里都有!

【融云集成常见问题整理】Geek Online 2020 编程挑战赛选手提问整理


求职招聘

【招聘】寻一枚熟悉融云IM的开发工程师,坐标合肥,待遇从优

和50万优质程序员一起成长——程序员客栈招聘

持续更新....

WICC 2019:融云首次解密全球通信网底层基础架构

科技创新融云那些事 发表了文章 • 0 个评论 • 254 次浏览 • 2020-06-16 18:34 • 来自相关话题

日前,2019 全球互联网通信云大会(WICC)在上海圆满落幕。作为大会主办方的融云,面对场内外数万开发者,首次对其自建的全球通信网(SD-CAN)的架构进行解密,分享了架构设计背后的故事和演进历程。在连续多年稳居国内即时通讯领域市场占有率第一之时,融云已然将... ...查看全部

日前,2019 全球互联网通信云大会(WICC)在上海圆满落幕。作为大会主办方的融云,面对场内外数万开发者,首次对其自建的全球通信网(SD-CAN)的架构进行解密,分享了架构设计背后的故事和演进历程。

在连续多年稳居国内即时通讯领域市场占有率第一之时,融云已然将目光放在了更广阔的全球市场之上。自 2016 年起,融云跟随中国出海企业进行海外布局,为他们提供安全、可靠的全球通信云服务能力。时至今日,在全球化布局上,融云拥有 3 个数据中心,3000 多个动态加速节点,并自研最优链路调度算法,可以有效解决跨国、跨运营商、大规模用户访问导致的响应慢、丢包高、服务不稳定等诸多痛点。


融云首席架构师李淼演讲
突破代码所无法解决的难题,跨过技术调研与选型瓶颈

融云首席架构师李淼认为:“代码可以解决的问题都不是问题,代码解决不了的问题才是最难的问题”。在李淼眼中,什么是代码解决不了的难题?那就是搭建全球互联的通信云底层基础架构。

早期,融云通过提供 SDK,让开发者更易集成融云的通信云能力到自己的 App 应用中,这是融云将通信云技术普惠给广大开发者的初衷。融云凭借安全、可靠的互联网通信云技术能力,服务的中国企业越来越多,并且随着中国出海企业逐渐布局到了海外市场,为了进一步助力中国企业出海,融云自建全球通信网络的想法应运而生。

融云讲了一个真实案例,曾经有落地韩国的旅游 App 客户向融云反映,自己的用户在韩国、泰国等地常常因连接不畅,导致体验不佳。后来融云在韩国、泰国部署了加速节点,对当地的链路进行加速,解决了这个问题,但由于终端客户分布的随机性很大,当用户漫游到除韩国、泰国以外的海外地区,甚至到北欧等地时,仍然面临连接问题。

解决客户的问题就是融云研发团队的使命,融云全球通信网的构建已经变得刻不容缓。可以说,是客户的海外布局需求让融云打开了建设全球通信网络的大门。

融云全球通信加速网络演变历程

融云对全球通信网络的平台能力定义是:用户能够就近接入、覆盖区域广泛、通信质量稳定、支持动态路径切换。2016 年,融云全球通信加速网络 v1 版本正式上线运行,基本满足了出海客户对于全球通信的需求,并显示出性能优越、资源消耗低、结构简单、运维方便等优势。同时,融云持续在寻找对应区域的服务商上,加大技术和人力的成本投入,进行资源配置的优化和整合。通过对两年的运营数据比对:在没有加速网络的情况下,融云对海外用户整体的连通率大概只有 78% 左右,通过加速网络,融云在全球的用户整体连通率可以达到 99.5% 以上,全球互联互通的成效初显。

但是,v1 版本的全球通信网络同时也面临着多中心重复建设、链路选择不智能、功能相对单一等问题。因此,2018 年融云决定放弃 v1 版本中的架构设计,重新搭建通信云全球互联的底层基础架构,进行 v2 版本迭代。

由于融云全球通信加速网络 v2 版本采用自研的边缘节点,承载了更多的业务数据的处理能力,显示出四大优势:第一,支持多中心接入。在设计时增加了新的路由节点,在整个网络里,可通过边缘节点向路由节点汇聚数据流量,数据可向任意一个数据中心导入;第二,多协议支持。自研的边缘节点,使 v2 版本不仅能支持 HTTP、HTTPS,还能支持 WebSocket、WebSocketS 以及实时音视频 RTC 的信令等更多协议;第三,管控方便。v2 版本可以精确地控制每个客户的流量转向和流量调度;第四,灵活调度。相比于 v1 版本只能通过下发配置的方式进行调度,在 v2 版本可通过管控节点的方式对流量周转进行控制。

优化之路境无止境

5G 正式商用后,融云 SD-CAN 全球通信网络除了承载人与人之间的通信,还将更多地承载人与物、物与物的通信。针对互联网通信请求高并发、小数据包的传输特点,为全球客户提供优质的网络加速服务,这是融云未来所要面临的挑战。

面对挑战,融云希望全球通信网络在边缘计算和去中心化的实时数据交换方面有所突破。首先,在边缘计算方面,由于融云目前很多协议、逻辑、控制都是通过类似模块的方式写成,如果要更新这些,需要重新部署服务来解决。尽管现在可以做到使用户无感、无损地更新迭代,但要降低运营成本,融云要在边缘节点上增加类似 FaaS(Function as a Service)的能力,并通过一些动态语言在边缘结点上实现脚本化的运维操作,通过管控节点下发这些计算能力。

其次,在去中心化的实时数据交换方面。虽然 RTC 本身就是去中心化的实时交换,但是现在的交换数据一般都是音视频,融云后续会建立双端 TCP 连接,通过去中心化的网络,实现两个用户之间的文件传递和数据交互。

结语

融云历经三年的潜心研发,最终构建起安全、可靠的全球互联网通信云网络。在全球通信网络的架构演进之路上,融云始终如一,抱定为客户带来至佳体验的宗旨,在专业化的道路上不懈探索。随着 5G 通信和物联网技术的全面覆盖,融云势必将通过 SD-CAN 全球通信网络为出海开发者和企业提供更为强劲的服务能力。

【社区精华|持续更新】收录本社区精华内容,手把手教学IM/RTC开发!

IM即时通讯admin 发表了文章 • 8 个评论 • 492 次浏览 • 2020-12-07 14:41 • 来自相关话题

本文收录了GeekOnline社区精华内容,希望帮助社区开发者学习IM+RTC知识,解答疑惑。赠人玫瑰,手有余香,如您有不错的内容需要收录,欢迎在在评论区投稿回复。Android篇融云即时通讯SDK集成 — 通知检查融云 IM SDK 集成 —- 刷新会话界面... ...查看全部

本文收录了GeekOnline社区精华内容,希望帮助社区开发者学习IM+RTC知识,解答疑惑。赠人玫瑰,手有余香,如您有不错的内容需要收录,欢迎在在评论区投稿回复。

微信截图_20201207144054.png

Android篇

融云即时通讯SDK集成 — 通知检查

融云 IM SDK 集成 —- 刷新会话界面和会话列表界面

Android 端如何添加自定义表情

解决融云 SDK 4.0 版本配置 https 导航报 SSLHandshakeException

融云清空历史消息 Android 端

唠一唠融云的消息扩展功能

融云 IMkit 拦截或监听所有发送消息

融云如何把图片消息的图片上传到自己的文件服务器

唠一唠融云 VIVO push 无法跳转的解决方案

融云即时通讯SDK集成 — 定制UI(一) ——会话界面小改动

融云即时通讯SDK集成 — 定制UI(二) ——添加自定义表情库

融云即时通讯SDK集成 — 定制UI(三) ——兼容Android Q

融云如何把图片消息的图片上传到自己的文件服务器

融云即时通讯SDK集成 — 华为推送的点击跳转处理

带你实现女朋友欲罢不能的 App

Flutter 集成融云 sdk

配置融云SDK的自签证书

自定义消息 包含 list 数组

关于融云聊天室KV 值的正确使用

融云 IM SDK 转 AndroidX

融云即时通讯SDK集成 — 国内厂商推送集成踩坑篇(Android平台)

在融云 IMkit 会话界面基础上添加消息已读未读

融云聊天室属性 kv

融云 ConversationListFragment 会话列表添加头部布局

融云即时通讯SDK集成 — FCM推送集成指南(Android平台)

融云集成之避坑指南-Android推送篇

融云IMKit 动态删除或添加plugin 的实现


iOS篇

iOS 基于实时音视频 SDK 实现屏幕共享功能——1

iOS 基于实时音视频 SDK 实现屏幕共享功能——2

iOS 基于实时音视频 SDK 实现屏幕共享功能——3

iOS 基于实时音视频 SDK 实现屏幕共享功能——4

如何隐藏融云输入框语音按钮

给融云的输入框上方加个功能按钮,怎么整?

融云 IM SDK 如何插入消息

集成融云 IMLib 时,如何实现一套类似于 IMKit 的用户信息管理机制

为融云聊天页面的输入框添加 Placeholder

30 分钟集成融云 IM 即时通讯

简单介绍融云 imkit 包含功能

融云的聊天页面在 iOS14 出现崩溃的解决办法

融云聊天页面长按消息后“翻译”功能的实现方法

使用融云 IM 点击最近聊天记录时跳转到 @ 自己的消息

如何设置融云用户信息

自定义融云会话列表 cell 选中背景

融云 IMKit 音频录制参数

融云会话页面刷新不及时问题

融云 Flutter IM SDK 解析

关于融云 SDK 在使用 p8 证书的坎坷~

融云 SDK 如何实现群组操作

如何利用融云 IMLib 来实现一个阅后即焚功能

干货分享——使用融云通讯能力库 IMLib 实现单群聊的阅读回执


Web篇

作为小白接融云 IM SDK 新路体验~

微信小程序集成融云 SDK (即时通讯) 集成必备条件

Web 端使用融云 SDK 集成实现滑动加载历史消息

融云IM SDK web 端集成 — 表情采坑篇

融云 Web SDK 如何实现表情的收发 ?

集成融云小程序 SDK 遇到的问题

使用融云 Web SDK 撤回消息

融云 RTC SDK 集成实现直播,趟坑之旅~~~

融云 Web SDK 删除历史消息

集成融云小程序 SDK 遇到的问题

Web 端集成融云 SDK 如何发送正确图片消息给移动端展示?

使用融云 IM SDK 实现 H5 直播聊天

WebRTC 实现实时音视频技术研究

融云发送语音消息

融云 CallLib 集成遇到的问题

结合融云 WebSDK 了解 WebSocket 基本原理

集成融云 Web 音视频通话踩坑之旅

SDK 兼容 JSON

融云 IM SDK 发送语音消息

集成融云 IM 问题总结

融云 Web SDK 如何实现只有一个设备登入

融云 Web 播放声音 — Flash 篇 (播放 AMR、WAV)

融云 IM 那些事儿

融云 AMR(Aduio) 播放 AMR 格式 Base64 码音频


社区福利

【领取见面礼】限量 100份 GeekOnline加油包!等你来拿

【有奖调研】Geek Online 2020 编程挑战赛参赛调研

【征稿活动】Geek Online 社区第一期投稿激励计划已启动!


GeekOnline编程挑战赛

Geek Online 2020 编程挑战赛官网

重磅!Geek Online 2020 编程挑战赛来了!

Geek Online 2020 编程挑战赛 GitHub 仓库

2 个月激烈角逐,15 支队伍突围决赛路演!Geek Online 2020 编程挑战赛完美收官!

一张图回顾 Geek Online 2020 编程挑战赛精彩瞬间!

“这些项目不是什么赚大钱的项目,但是它们足够有趣。”丨关于 Geek Online 2020 编程挑战赛,选手们如是说

融云 CTO 杨攀: Geek Online 2020 编程挑战赛 让开发者站上 C 位

【参赛攻略】你想了解的Geek Online 2020 编程挑战赛常见问题这里都有!

【融云集成常见问题整理】Geek Online 2020 编程挑战赛选手提问整理


求职招聘

【招聘】寻一枚熟悉融云IM的开发工程师,坐标合肥,待遇从优

和50万优质程序员一起成长——程序员客栈招聘

持续更新....

一把双刃剑 -- 融云即时通讯sdk中的自定义消息使用心得&指南 (上)

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 15 次浏览 • 3 天前 • 来自相关话题

背景:最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).他家的官网和文档地址:... ...查看全部

微信截图_20210224192427.png

背景:

最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).

他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4

这个任务当然还是落在我的头上. 我是使用的他们家的带UI的sdk,(他们家有带UI和不带UI的两种sdk, 不带UI的sdk就是只有即时通讯能力, 所有的UI都需要开发者自定实现, 带UI的sdk封装了一些基本的界面,例如会话列表, 和别人聊天的会话界面).

需求:

融云的体系中默认的消息类型只有9种.


功能     |     描述


文字消息       |     用来发送文字类消息,其中可以包括表情、超链接(会自动识别),客户端收到消息后计入未读消息数、进行存储。

语音消息     |     发送高质量的短语音消息,录制的语音文件存储到融云服务端,语音文件格式为 AAC,时长上限为 60 秒,客户端收到消息后计入未读消息数、进行存储。

图片消息     |     用来发送图片类消息,客户端收到消息后计入未读消息数、进行存储。图片缩略图格式为 JPG,大小建议不超过 100k。

GIF 图片消息     |     用来发送 GIF 动态图片消息,客户端收到消息后计入未读消息数、进行存储。

图文消息     |     用来发送图文消息,包含一个标题,一段文字内容和一张图片,客户端收到消息后计入未读消息数、进行存储。

文件消息     |     用来发送文件类消息,客户端收到消息后计入未读消息数、进行存储。

位置消息     |     用来发送地理位置消息,客户端收到消息后计入未读消息数、进行存储。

小视频消息     |     用来发送小视频消息,支持录制发送及选择本地视频文件发送两种方式,录制时长不超过 10 秒,本地选择视频文件方式时长不超过 2 分钟,小视频消息小视频文件格式为 .mp4,客户端收到消息后计入未读消息数、进行存储。

合并转发消息     |     IMKit SDK 中支持将多条消息合并为一条消息进行发送,合并后的消息以 HTML 文件的方式存储到融云服务端,客户端收到消息后计入未读消息数、进行存储。

这9种消息其实已经满足大部分的即时聊天场景了, 无论是打字聊天最普通的文本消息, 还是长按录制发送的语音消息, 以及图片消息, 分享位置的消息. 基本上微信有的场景, 都覆盖到了.

但是因为各家的产品各不相同, 有人需要一个比微信功能更简洁的聊天工具, 有人则需要一个像QQ那般功能强大的聊天工具. 总是有千奇百怪不同的需求的. 像我们的app就是这样, 总有场景是这里无法满足的. 好比QQ是可以把图片和文本消息放入同一个消息气泡中的(类似于富文本消息), 那么这样的情况下, 默认的几类消息就不够用了.

不过融云还是把这块做的很到位的, 暴露了类和接口让用户去对消息做自定义, 基本上可以做到, 想把消息定义成什么样就定义成什么样子.

心得(上)

这里就举一些我在开发我们公司app时, 用到的自定义消息, 以及使用心得和指南.

只发给当前在线用户的限时奖励通知

只给当前在线用户发送消息, 我们有一种游戏奖励是只发放给特殊时段在线的用户的, 只有当前在线的用户才能接收到这种消息来领取奖励, 其他在该时段未在线的用户, 不能接收到, 且再次登录后也不能接收到保留的离线消息. 这个需求就是做了一个自定义消息来实现的. 把自定义消息类的 MessageTag 中 flag 值设置为 MessageTag.STATUS。此消息类型即为状态消息,状态消息不存储不计数,并且当接收方不在线时,此消息会直接丢弃,用户再上线也不会收到该消息。

有需要的同学可以看他们家关于自定义消息的文档:https://docs.rongcloud.cn/im/imkit/android/conversation/custom_message/

发送自定义消息后撤回消息,撤回消息会失败

这里积累了一个经验, 也算是帮大家踩踩他们家的坑了, 那就是: 使用以下废弃方法发送自定义时会出现此错误:

在发送自定义消息后,撤回消息时没有反应,退出会话界面再次进入后可以正常撤回消息。 在 log 中显示 recallMessage errorCode = 25101。

public Message sendMessage(ConversationType type, String targetId, MessageContent content, String pushContent, String pushData, final SendMessageCallback callback) {

必须要换成这个方法发送才行:

public void sendMessage(Message message, String pushContent, String pushData, final ISendMessageCallback callback)

这个问题也是蛮坑的, 害. 找他们家技术支持费了点劲才排查出来, 希望大家遇到这种问题能快快找到我这篇经验哈.


【Android开发】如何使用融云的消息扩展

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 14 次浏览 • 3 天前 • 来自相关话题

从 【4.0.3 】版本开始,融云新增了消息扩展功能,文档如下: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/expansion/android.html总结文... ...查看全部

微信截图_20210224192550.png

从 【4.0.3 】版本开始,融云新增了消息扩展功能,文档如下: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/expansion/android.html

总结文档中的几个重点:

  • 4.0.3之前的版本无法使用。

  • 消息扩展是 Message类的属性,也就是说自定义消息也可以使用。

  • 单条消息只能设置300个kv,(某些场景不可用,比如在群里发400个人可领的红包)。

  • 仅支持单聊、群聊。

  • key和value都是字符串类型,并且key不能是中文,否则会报错INVALID_PARAMETER。

  • 用IMKit的UI发送消息时需要拦截一下,设置消息扩展开关。

使用步骤:

  1. 消息的发送端必须给需要消息扩展的消息开开关,没有全局设置,只能单条消息设置。分以下两种情况:

  2. 如果使用的是 IMKit 提供的UI发送消息,在 ConversationFragment中的 onSendToggleClick 方法发送消息,在 sendMessage 前调用下面的方法

    /**
     * 设置消息扩展信息列表
     * 

扩展信息只支持单聊和群组,其它会话类型不能设置扩展信息。


     *
     * @param expansion 消息扩展信息列表
     */
    public void setExpansion(HashMap<String, String> expansion) {
        this.expansion = expansion;
    }

还需要设置 canIncludeExpansion 和 expansionDic 。

  • 如果是自己调用 RongIM 和 RongIMClient 接口发的消息,用 MessageContent 类的对象构造一个 Message 对象,然后设置 canIncludeExpansion 和 expansionDic 再调用RCIM中对应的 send 方法将消息发送出去即可。

  • 更新和删除扩展的操作可以参考官方文档。

  • 想要实时捕获消息扩展的更改和删除,就需要设置回调,在回调中更新UI。设置回调可参考官方文档。

融云官网:https://www.rongcloud.cn/

文档频道:https://docs.rongcloud.cn/v4


一把双刃剑 -- 融云即时通讯sdk中的自定义消息使用心得&指南 (下)

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 15 次浏览 • 3 天前 • 来自相关话题

背景:最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).他家的官网和文档地址:... ...查看全部

微信截图_20210224192919.png

背景:

最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).

他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4

这个任务当然还是落在我的头上. 我是使用的他们家的带UI的sdk,(他们家有带UI和不带UI的两种sdk, 不带UI的sdk就是只有即时通讯能力, 所有的UI都需要开发者自定实现, 带UI的sdk封装了一些基本的界面,例如会话列表, 和别人聊天的会话界面).

心得 (下)

自定义小视频消息

接上篇对自定义消息的开发心得哈.

因为融云家自带的小视频消息是需要收费的, 需要在服务端开通小视频服务后, 同时在端上做一下配置, 才可以使用小视频消息. 我一看这还得了, 想方设法收我钱呢不是. 不过他家只是对小视频类型的消息在服务端做了限制, 而不是完全不让在消息中携带视频链接. 自定义消息是随便自定义的, 那么我自定义一个小视频消息不就好啦.

大概实现思路如下:

自定义小视频消息继承MediaMessageContent,其中mLocalPath是小视频文件本地的存放路径,mMediaUrl是小视频文件上传到文件服务器后的http/https地址。

小视频的拍摄,播放我们RongCloud SDK没有接口,开发者自己实现。

当拍摄完成,发送小视频消息时使用方法

sendMediaMessage(final Message message, final String pushContent, final String pushData, final IRongCallback.ISendMediaMessageCallback callback)或者

sendMediaMessage(final Message message, final String pushContent, final String pushData, final IRongCallback.ISendMediaMessageCallbackWithUploader callback)

这两个方法的不同是后者开发者负责小视频文件的上传到指定的服务器,前者使用我们RongCloud默认的文件服务器

以上是大致步骤,小视频开发过程中可能遇到的问题,说明如下:

1.关于缩略图的处理,我们SDK没有直接上传一张图片返回一个url地址的接口,开发者可以把缩略图上传到自己的服务器,这样缩略图跟mMediaUrl类似,小视频消息展示显示缩略图时加载一张网络图片即可。

另一种缩略图处理方式类似我们SDK发送图片消息时的缩略图处理,把缩略图做base64编码,放到自定义消息体中直接传输,这种方式涉及到消息发送时把缩略图转化为base64数据和接收到消息时还原为缩略图,在我们SDK内部使用的是MessageHandler。

关于MessageHandler,我们RongCloud的每个消息都有一个MessageHandler,此前我们文档从没有介绍过这个

MessageHandler,对用户透明的,用户的自定义消息没有指定它是因为有个默认的DefaultMessageHandler。

自定义消息时可以指定自己的MessageHandler,例如图片消息的定义如下

ImageMessage.png

MessageHandler在消息发送和接收时在IPC进程中会被自动调用,它有两个方法,encodeMessage

和decodeMessage,在消息接收后调用decodeMessage时开发者可以把base64对应的数据转化为缩略图url,这样在展示缩略图时直接使用url即可。

/**
 * 解码 {@link MessageContent} 到 {@link Message} 中。
 *
 * @param message 用于存放 MessageContent 的消息实体。
 * @param content 将要被解码的 MessageContent。
 */
public abstract void decodeMessage(Message message, T content);

/**
 * 对 {@link Message} 编码。
 *
 * @param message 将要被编码的 Message 实体。
 */
public abstract void encodeMessage(Message message);

此文档包含了两个附件分别为自定义小视频消息和对应的小视频消息MessageHandler,供开发者参考

2.开发中可能还会遇到小视频文件上传时进度更新的问题,如果开发者自定义的小视频消息不继承自MediaMessageContent而是MessageContent,需要自己在UI上维护上传进度


融云 Android 端如何清空某一个会话的聊天记录

IM即时通讯王叫兽 发表了文章 • 0 个评论 • 13 次浏览 • 3 天前 • 来自相关话题

融云 Android 端如何清空某一个会话的聊天记录实现须知没有开通 “历史消息云存储”,只能删除本地的数据。在融云控制台开通 “历史消息云存储功能” 后,才可以删除远端消息。实现步骤1.调用 cleanHistoryMessages 方法,cleanRemo... ...查看全部

融云 Android 端如何清空某一个会话的聊天记录

微信截图_20210224192137.png

实现须知

没有开通 “历史消息云存储”,只能删除本地的数据。在融云控制台开通 “历史消息云存储功能” 后,才可以删除远端消息。

实现步骤

1.调用 cleanHistoryMessages 方法,cleanRemote 传 true ,recordTime 传 当前的时间戳。

/**
     * 删除指定时间戳之前的消息,可选择是否同时删除服务器端消息
     * 

此方法从服务器端清除历史消息,但是必须先开通历史消息云存储功能。


     * 

根据会话类型和 TargetId 清除某一会话指定时间戳之前的本地数据库消息(服务端历史消息),
     * 清除成功后只能从本地数据库(服务端)获取到该时间戳之后的历史消息。


     *
     * @param conversationType 会话类型。
     * @param targetId         会话目标ID。
     * @param recordTime       清除消息截止时间戳,【0 ~ 当前时间的 Unix 时间戳】。
     * @param cleanRemote      是否删除服务器端消息
     * @param callback         清除消息的回调。
     */
    public void cleanHistoryMessages(final Conversation.ConversationType conversationType,
                                     final String targetId,
                                     final long recordTime,
                                     final boolean cleanRemote,
                                     final OperationCallback callback)

2.您使用的是 imlib ,还需要自行刷新您的界面。 3.您使用的是 imkit 调用 ConversationFragment 的 getMessageAdapter 方法,获取到会话界面消息展示适配器,移除数据并且刷新数据源。

mListAdapter.removeAll();
mListAdapter.notifyDataSetChanged();

4.卸载重装或者更换设备登陆后,历史消息还可以拉取到,来保证用户更换设备或者卸载重装后还可以有上下文。如果您不希望换端后再收到这些消息,您可以 提供一下 appkey 提交工单,我们帮您把这部分数据的缓存功能关闭。

融云即时通讯sdk, 把头像设置为圆角图片在4.x和5.x的区别 -- 融云即时聊天sdk使用小技巧

IM即时通讯fanta2 发表了文章 • 0 个评论 • 24 次浏览 • 5 天前 • 来自相关话题

背景:最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).他家的官网和文档地址:... ...查看全部

微信截图_20210222180703.png

背景:

最近公司新上的app要加上即时通讯的功能, 自己快速实现一个当然是不可能的了(项目deadline也顶不住哇).就从各家成熟的SDK厂商选来选去的, 各有各的好也各有各的不足.最后点兵点将,选了融云家的SDK(老板说了算hhhh).

他家的官网和文档地址: 官网:https://www.rongcloud.cn/ 文档:https://docs.rongcloud.cn/v4

这个任务当然还是落在我的头上. 我是使用的他们家的带UI的sdk,(他们家有带UI和不带UI的两种sdk, 不带UI的sdk就是只有即时通讯能力, 所有的UI都需要开发者自定实现, 带UI的sdk封装了一些基本的界面,例如会话列表, 和别人聊天的会话界面). 最近正好他们家也对IMKit大版本进行了迭代 (4.x --> 5.0). 我这边也就跟随他们做了一下迭代, 把项目中使用的4.0.1.1版本sdk, 直接升级到了5.0的版本.

知识点:

融云sdk中自带的UI都是矩形的头像, 无论是会话列表还是会话界面里, 都是矩形的. 但是我们项目中需求是圆形头像, 所以需要我再自定义一下.

4.x版本

在4.x版本中, 我是直接改的xml布局文件. 这个是会话界面的头像, 会话列表头像也是同理.

在 rc_item_message.xml 配置文件中 修改 RCCornerRadius="3dp" 配置的值。设置头像圆角大小。

5.0版本

在5.0版本中, 因为融云在这个迭代过程中把图片库从ImageLoader换成了Glide, 所以这块修改就更加方便, 也更便于阅读了 直接在代码中设置即可:

RongConfigCenter.featureConfig().setKitImageEngine(new GlideKitImageEngine() {
            @Override
            public void loadConversationListPortrait(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
                Glide.with(imageView).load(url)
                        .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                        .into(imageView);
            }

            @Override
            public void loadConversationPortrait(@NonNull Context context, @NonNull String url, @NonNull ImageView imageView) {
                Glide.with(imageView).load(url)
                        .apply(RequestOptions.bitmapTransform(new CircleCrop()))
                        .into(imageView);
            }
        });


融云 IMKit SDK 5.X 升级说明

IM即时通讯fanta2 发表了文章 • 0 个评论 • 24 次浏览 • 5 天前 • 来自相关话题

Tips如果您应用依赖于 suport 包,可参考 AndroidX 迁移文档将依赖转换为 AndroidX 后,再集成 IMKit SDK 5.X版本。1. 类路径调整IMKit SDK 5.X 版本重构了 SDK 的架构,通过 MVVM 框架实现... ...查看全部

Tips

如果您应用依赖于 suport 包,可参考 AndroidX 迁移文档将依赖转换为 AndroidX 后,再集成 IMKit SDK 5.X版本。

微信截图_20210222180400.png

1. 类路径调整

IMKit SDK 5.X 版本重构了 SDK 的架构,通过 MVVM 框架实现,导致很多类路径发生了更改,下表列出了 5.X 之前版本对外公开类的路径变更:

2.x 、4.x 版本路径
io.rong.imkit.fragment.ConversationListFragment
io.rong.imkit.fragment.ConversationFragment
io.rong.imkit.RongExtension
io.rong.imkit.userInfoCache.RongUserInfoManager
io.rong.imkit.mention.RongMentionManager
io.rong.imkit.manager.IUnReadMessageObserver

5.x 版本路径
io.rong.imkit.conversationlist.ConversationListFragment
io.rong.imkit.conversation.ConversationFragment
io.rong.imkit.conversation.extension
io.rong.imkit.userinfo.RongUserInfoManager
io.rong.imkit.feature.mention.RongMentionManager
io.rong.imkit.manager.UnReadMessageManager.IUnReadM

路径调整 Tips

参照上表,在 AndroidStudio 中 command+shift+R 全局搜索旧的类路径,替换为新路径。 如果深度定制化了 IMKit SDK,部分类路径的调整可能不在上述列表中,升级以后 AndroidStudio 会有红色报错。删除报错类里红色未识别的导入路径,鼠标停留到报错的地方,根据 AndroidStudio 的提示导入新路径即可。如果有多个地方使用了该路径,可以参考第一步里的方法,全局搜索并替换。

2. 集成方式变更

页面跳转时由原先的隐式调用方式更改为显示调用, 因此集成步骤有所简化和更改。您需要先移除旧版本 AndroidManifest.xml 文件中关于 IMKit SDK 的配置,参考官网文档重新集成。

3. 消息展示模板变更

列表页由 ListView 更改为效率更高的 RecycleView,因此自定义消息的展示模板需要对应调整。

将自定义消息的展示模板更改为继承 BaseMessageItemProvider<>, 并实现基类方法。 移除展示模板里原先的注解,原注解属性可在新模板构建类里通过调用基类成员 mConfig 的各个方法进行配置

4. 内部实现变更

资源名称变更。IMKit SDK 5.x 版本重新统一了资源名称的命名,如果您自定义了部分资源文件,可参考官网自定义文档,重新替换对应名称的资源。

移除了 EventBus 。IMKit 5.x 版本不再依赖于 EventBus 进行事件分发,更改为通过观察者模式实现。如果您应用里使用了旧版本 SDK 里的 EventBus, 升级后需要您从应用层自己引入依赖。

移除 RongContext 类。如果您应用里有调用 RongContext 作为上下文使用的地方,请更改为调用您自己的应用上下文。

由于更改为 MVVM 框架,原 fragment 里很多业务相关接口被移除,您可参考官网 5.x 版本文档重新进行页面自定义。



融云IMKit 动态删除或添加plugin 的实现

IM即时通讯fanta2 发表了文章 • 0 个评论 • 21 次浏览 • 5 天前 • 来自相关话题

在集成融云的过程中,由于项目要求比较紧急,所以使用了融云的IMKit (带有UI界面的),但是由于使用融云方面的自带的UI ,所以就会不可避免的就会有些自定义化的需求;接下来,我就项目中使用到的 动态删除或添加plugin 的方案给大家介绍一下。ps:满满的私... ...查看全部

在集成融云的过程中,由于项目要求比较紧急,所以使用了融云的IMKit (带有UI界面的),但是由于使用融云方面的自带的UI ,所以就会不可避免的就会有些自定义化的需求;

微信截图_20210222160507.png

接下来,我就项目中使用到的 动态删除或添加plugin 的方案给大家介绍一下。ps:满满的私货,官网文档并没有动态的方式。

第一步:需要先复写 ConversationFragment ,在onCreateView 方法中找到 RongExtension 控件 。

public class ConversationFragmentEx extends ConversationFragment {

    private RongExtension rongExtension;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = super.onCreateView(inflater, container, savedInstanceState);
        rongExtension = (RongExtension) v.findViewById(io.rong.imkit.R.id.rc_extension);

        return v;
    }
}

第二步:再复写 initFragment 方法获取 targetId。(按需进行获取,若是不需要则无需获取)

 @Override
    protected void initFragment(Uri uri) {
        super.initFragment(uri);
        if (uri != null) {
            String TargetId = uri.getQueryParameter("targetId");
        }
    }

第三步:然后再onResume方法中根据 targetId进行删除或增加(项目需求)

@Override
    public void onResume() {
        super.onResume();
        List<IPluginModule>  PluginModules = rongExtension.getPluginModules();
        for(int i=0;i<PluginModules.size();i++){
            if(PluginModules.get(i) instanceof DefaultLocationPlugin){
                rongExtension.removePlugin(PluginModules.get(i));
            }
        }
    }

若是想要增加,则可以调用 mRongExtension.addPlugin 进行添加。

通过以上步骤就可以完成动态添加或者删除 plugin;


融云 FCM 推送与打包方式有关

IM即时通讯fanta2 发表了文章 • 0 个评论 • 35 次浏览 • 5 天前 • 来自相关话题

1.一切都配置完成之后, 开始测试. 第一次启动App, 杀死. 发送测试消息. 收不到推送.2.再次启动App, 杀死, 发送测试消息. 这次能收到推送了.第一次杀死App之后, 发送测试消息, 可以看到log中会即时打出:09-17 11:50:... ...查看全部

1.一切都配置完成之后, 开始测试. 第一次启动App, 杀死. 发送测试消息. 收不到推送.
2.再次启动App, 杀死, 发送测试消息. 这次能收到推送了.

第一次杀死App之后, 发送测试消息, 可以看到log中会即时打出:

09-17 11:50:34.298 W/GCM ( 2025): broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE pkg=com.rongcloud.fcm_demo (has extras) }

GCM打出的log, result=CANCELLED. 广播的intent发送回调是: cancelled. 也就是这个广播还没发送到app层/sdk层, 就已经被系统拦截到了. 失败了.

最开始以为是App关于GCM, 或者FCM的权限问题. 在manifest里遗漏了某个配置, 或者App的通知权限没有打开. 但是做了一番检查以及配置之后, 这个问题还是存在.
之后求助于Google和StackOverflow, 发现有些人是遇到过类似问题的, 但是都没有一个很好的解决方案, 把网上的解决方法一一尝试之后, 这个顽固的问题还是存在.

后来也是一个偶然的发现, 如果我在IDE中直接点击“Run”把App安装运行到手机上, 会出现这个问题, 但是我把项目打包成apk后, 再安装到手机上. 这个问题就消失了, 第一次杀死App之后, 也是可以顺利收到消息的. 这样才把这个问题给解决掉.


IM 消息数据存储结构设计

IM即时通讯admin 发表了文章 • 0 个评论 • 128 次浏览 • 2021-01-28 14:25 • 来自相关话题

1背景在移动互联网高速发展的时代,生活中 IM 类产品已经是我们离不开的应用了,像微信、钉钉等都是以 IM 为核心功能的社交产品。另外也有一些应用不是以 IM 为核心,但是也是其重要功能,比如在线游戏、电商直播等应用。在 IM 庞大的体系中,消息系统无疑是最核... ...查看全部

1背景

在移动互联网高速发展的时代,生活中 IM 类产品已经是我们离不开的应用了,像微信、钉钉等都是以 IM 为核心功能的社交产品。另外也有一些应用不是以 IM 为核心,但是也是其重要功能,比如在线游戏、电商直播等应用。

IM 庞大的体系中,消息系统无疑是最核心的,而消息系统中,最关键的部分是消息的分发和存储。

在以往传统消息系统中,对于在线的用户,消息会直接实时发送到在线的接收方,消息发送完成后,服务器端并不会对消息进行落地存储。对于离线的用户,服务器端会将消息存入到离线库,当用户登录后,从离线库中将离线消息拉走,然后服务器端将离线消息删除,这样的缺点是消息不持久化,导致消息无法支持消息漫游,降低了消息的可靠性。而在我们的消息系统中,服务器只要接收到了发送方发上来的消息,在转发给接收方的同时也会在离线数据库以及历史消息库中进行消息的落地存储,消息的落地也就支持了整体的消息漫游等相关功能。

 

2离线消息和历史消息的区别

离线消息,就是用户在离线过程中收到的消息,这些消息大多是用户比较关心的消息,具有一定的时效性。我们的系统设计,离线消息默认只保存最近七天的消息。离线消息在用户登录后会全量的获取,然后客户端根据会话进行整体离线消息的展示。

历史消息,存储了用户所有的消息,包括发的消息以及接收的消息。在客户端获取历史消息时,是按照会话进行分页获取的。历史消息的存储时间我们系统设计默认为半年,当然这个是可配置的。

3消息的发送以及存储的流程

融云整体的消息发送以及存储的流程如下图所示:

1.png

用户发送消息到服务器端后,首先会进入到消息系统中,消息系统会对消息进行分发以及存储。对于在线的接收方,会选择直接推送消息,但是遇到接收方不在线或者是消息推送失败的情况下,也会有另外的消息获取方式,接收方会主动向服务器拉取未收到的消息,但是接收方何时来服务器拉取消息以及从哪里拉取是未知的,所以消息存入到离线库的意义也就在这里。

   消息系统存储离线的过程中,为了不影响整个系统的更为平稳,融云使用了消息队列,消息是异步存入到离线库中的。

   在分发完消息后,消息服务会同步一份消息数据到历史消息服务中,历史消息服务会对消息进行落地存储。对于新的同步设备,会有消息漫游的需求,这也是历史消息的主要作用。在历史消息库中,客户端可以拉取任意会话的全量历史消息。

4 离线消息以及历史消息存储区别

   上述的图中我们能清晰的看到,离线消息我们存储介质选用的是 Redis,历史消息我们选用的是 HBase。为何选用不同的存储介质针对的是不同的业务场景和读写模式。下面我们重点介绍一下离线消息和历史消息存储的区别。

离线消息的存储模式是放大写,如下图所示,每个用户都有自己单独的收件箱和发件箱,收件箱存放需要向这个接收端同步的所有消息,发件箱里存的是发送端发送的所有消息。二人会话中的消息会产生两次写,发送者的发件箱以及接收端的收件箱。而在群的场景下,写入会被更加的放大,如果群里有 N 个人,那一条群消息就会被放大写 N 次。

放大写的优点是,接收端的逻辑会非常清晰简单,只需要从收件箱里读取一次即可,大大降低了同步消息所需的读的压力,但是缺点就是写入会被放大,特别是针对群这种场景。

2.png

历史消息的存储模式是放大读,因为历史消息中,每个会话都保存了整个会话的全量消息。在放大读这种模式下,每个会话的消息只保存一次。相比放大写的那种模式,写入次数大大降低,特别是针对群消息,只需要存一次即可。但是缺点是接收端接收消息非常的复杂和低效,因为这种模式客户端想拉取到所有消息就只能每个会话同步一次,读就会被放大,而且可能会产生很多次无效的读,因为有些会话可能根本没有新消息。

3.png

  IM 这种应用场景下,通常会用到写扩散这种消息同步模型,一条消息产生一条,但是可能会被读多次,是典型的读多写少的场景。一个优化好的系统,必须从设计上平衡读写压力,避免读或者写任意一个维度达到天花板。当然写扩展这种模式也有其弊端,比如万人群,会导致一条消息,写入了一万次。综合来讲,我们需要根据自己的业务场景做相应设计选择,我们的系统是根据了离线和历史消息的不同场景选择了写扩散和读扩散的组合模式。

5 客户端拉取消息

    离线消息的获取针对的是自己的整个离线消息,包括所有的会话。离线消息的获取是自上而下的方式,一次获取 200 条。在客户端拉取离线消息的信令中,需要带上当前客户端缓存的消息的最大时间戳,上面的图我们应该知道,离线消息我们存储的是一个线性结构,Server 会根据这个时间戳向下查找离线消息,重装或者新安装 App 时,客户端可以传 0 上来,Server 也会缓存客户端拉取到的最后一条消息的时间戳,然后根据业务场景,客户端类型等因素来决定从哪里开始拉取,如果没有拉取完 Server 会在拉取消息的应答中带相应的标记位,告诉客户端继续拉取,客户端循环拉取,直到所有离线消息拉完。

历史消息的获取针对的是单一会话,在拉取过程中需要带上来对方的 ID(如果是单聊的话就是对方的 UserID,如果是群,则是群组 ID 以及当前会话的最前面消息的时间戳,Server 会定位到这个人的这个会话然后一次获取 20 条,采用的是自下而上的方式,即从最后面往前翻。只要有消息,客户端可以一直向前翻,手动触发获取会话的历史消息。

 

6总结

   本篇文章主要讲了 IM 中消息系统的消息分发、存储等,重点介绍了离线消息和历史消息的区别以及两者存储中所选用的不同存储方式以及其优缺点。关于文中内容,也欢迎大家随时留言与我讨论。


即时通讯(Instant Messaging)交流