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

背景:最近公司新上的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上维护上传进度


收起阅读 »

融云4.x 版本升级到5.0 版本出现的问题

1. 4.x 版本与5.x 版本的区别  主要是针对 IMKit(带 UI 界面)进行了重构,并且 5.0 版本以上的 IMKit 进行了开源,可以在 &nbs...
继续阅读 »

微信截图_20210224192708.png1. 4.x 版本与5.x 版本的区别

  主要是针对 IMKit(带 UI 界面)进行了重构,并且 5.0 版本以上的 IMKit 进行了开源,可以在  https://github.com/rongcloud/imkit-android 进行下来进行集成;

2. 5.x 版本主要的跳转方式

   在之前4.x 版本的SDK 中,界面之间的跳转主要是使用隐式调用的,在5.x 版本则全部改用为显示跳转,并且引入路由的概念,具体可以参考 RouteUtils 这个工具类。

3. 4.x 以及5.x 主要的api 感知变化

  为了方便平滑升级,以及兼容性,所以对外引用 api 并无太大改变,都是通过 RongIM 进行引用。

4. 5.x 自定义消息的变化

主要是针对展示方式变化,取消之前的注解方式,改为复写 MessageItemProviderConfig 的方式,通过代码动态加载来进行展示,设置方式是在自定义的provider 中进行设置config 即可;


收起阅读 »

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

从 【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中的自定义消息使用心得&指南 (上)

背景:最近公司新上的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 端如何清空某一个会话的聊天记录

融云 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
背景:最近公司新上的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 升级说明

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 版本文档重新进行页面自定义。



收起阅读 »

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

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之后, 也是可以顺利收到消息的. 这样才把这个问题给解决掉.


收起阅读 »

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

IM
在集成融云的过程中,由于项目要求比较紧急,所以使用了融云的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;


收起阅读 »

如何 1 天快速集成自己的“Clubhouse”?

“你有 Clubhouse 邀请码吗?”,这句话在近期似乎盖过了“做核酸检测了吗?”的风头,成为大家之间的问候语。就在月初,一款主打即时交流的音频社交平台——Clubhouse 蓦然走入大众视野,并且快速、广泛地引起关注和讨论。成立不到一年的 Clubhous...
继续阅读 »

“你有 Clubhouse 邀请码吗?”,这句话在近期似乎盖过了“做核酸检测了吗?”的风头,成为大家之间的问候语。

就在月初,一款主打即时交流的音频社交平台——Clubhouse 蓦然走入大众视野,并且快速、广泛地引起关注和讨论。成立不到一年的 Clubhouse 之所以能够出圈,主要得益于埃隆·马斯克的一场线上分享,估计马斯克也没有想到自己竟有如此强大的“带货”能力,直接促成了 2021 年第一个“互联网风口”的到来。

微信图片_20210218094303.pngClubhouse 为什么能够有如此魔力?知乎相关问题“Clubhouse 这款社交软件为什么这么火?”便吸引了 72 万人围观和讨论,大家都很好奇 Clubhouse 究竟是一款什么样的应用?微信图片_20210218094320.jpg

简单来说,Clubhouse 是一款语音社交产品,核心功能主要是:

1.  由主持人创建一个房间,邀请一个或者多个嘉宾一起语音聊天,观众有问题可以举手申请,经过同意后便可发言;

2.  主持人对房间进行管理,包括上麦、下麦、禁麦、封麦、解封等功能。

其实在 Clubhouse 走红前,国内早已出现了各类语音社交应用,且产品已经非常成熟。在此次 Clubhouse 的影响下,语音社交再次爆火,想必有些团队打算“乘热出击”推出自己的“Clubhouse”,那么如何 1 天快速集成自己的“Clubhouse”呢?

02
你的“Clubhouse”该具备哪些功能?

微信图片_20210218094337.jpg

其实要做类似 Clubhouse 的产品技术难度并不大,目前市面上有专业服务商可以提供成熟的解决方案。比如,互联网通信云服务商融云的语音社交解决方案,就能够帮助开发者快速实现类似 Clubhouse 的通信功能。

互动连麦:房主可以发出邀请或观众请求上麦,观众上麦后成为连麦主播,房间内所有用户都可以实时收听房主和连麦主播互动。

麦位管理:房主可以对麦位进行管理,包括上麦、下麦、禁麦、解禁、封麦、解封、拉黑用户等,抢到麦位的用户可以与房主连麦,同时支持直播间所有用户都可以实时看到每个麦位的状态。

用户状态统计:直播间内的房主、连麦主播和观众可以实时看到进入或离开当前直播间的用户情况,让直播间用户状态一目了然。

微信图片_20210218094350.png主播端业务流程微信图片_20210218094409.png

除了这些基本功能,融云还提供更多 Clubhouse 尚不具备的功能。

直播录制:支持平台录制直播间内容,方便监测回溯;

审核功能:对语音消息、文字图片消息、音视频流、平台 UGC 内容可以实时审核,避免违规、打击黑产;

网络状况查询:用户加入直播间可以查看当前网络质量,判断网络状况;

IM消息互动:直播间内,房主、连麦主播和观众可以通过使用文字、图片消息进行实时交流;

扩展功能:支持背景音乐播放,帮助烘托直播间主题气氛,也可以灵活接入第三方插件,实现美颜、变声/美声等功能。

在对 Clubhouse 进行“复刻”的过程中,还需要考虑用户的使用体验。即便是 Clubhouse,在用户规模激增的情况下,也暴露出一些产品技术的不足之处,比如经常出现用户突然退出房间,用户在线状态不准确、语音丢帧/卡顿/延迟等情况,其中除了音频高并发处理能力的问题,还有 IM 信令不够稳定的问题。

03
融云技术优势帮助开发者解决难题

融云通过十余年的技术积累及客户服务实践经验,形成了一套成熟、完善的语音社交解决方案,通过“IM+RTC”双重整合能力,帮助开发者解决各种问题,同时沉淀了自身五大优势:

信令极简高效:基于融云 IM 通讯服务的信令通道,安全、可靠、高效;

海量消息并发:久经考验的海量消息分发模型,从容应对每小时千亿条消息分发场景;

全球互联:基于融云 SD-CAN 全球通信网络,全球用户物理节点就近接入;

实时音视频互动:多人之间的音视频连麦;直播互动流畅,延迟小于 300ms;

在线人数无上限:通过可任意水平扩展的服务架构,实现同时在线人数无上限。

为了更高效便捷地服务开发者,融云免费开放了语音聊天室 Demo ,同时提供丰富的支持文档,让开发者们最快 1 天即可实现语音社交功能,快速上线。


收起阅读 »