IM SDK

IM SDK

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

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

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


融云 SDK 如何实现群组操作

IM即时通讯柠檬^ 发表了文章 • 0 个评论 • 202 次浏览 • 2021-01-11 15:14 • 来自相关话题

融云 SDK 如何实现群组操作背景在集成融云 SDK 后,需要实现群组操作的消息通知。包括:群创建、销毁通知群公告通知群人员加入、退出通知群昵称修改通知...融云现有的 SDK 仅提供了 RCGroupNotificationMessage,内部封装... ...查看全部

融云 SDK 如何实现群组操作

背景

在集成融云 SDK 后,需要实现群组操作的消息通知。包括:

  • 群创建、销毁通知

  • 群公告通知

  • 群人员加入、退出通知

  • 群昵称修改通知

  • ...

融云现有的 SDK 仅提供了 RCGroupNotificationMessage,内部封装了几种简单的类型操作,且扩展性不强,无法完成现有的操作。

解决方案:

使用自定义消息重新来构建群组通知消息。

参考 sealtlak 中的 RCDGroupNotificationMessage,也是单独对群组操作内容,重新进行了封装处理

/*!
 群组通知消息
 */
@interface RCDGroupNotificationMessage : RCMessageContent

//操作名
@property (nonatomic, copy) NSString *operation;

//操作人
@property (nonatomic, copy) NSString *operatorUserId;

//操作对象
@property (nonatomic, strong) NSArray<NSString *> *targetUserIds;

//内容
@property (nonatomic, copy) NSString *message;

//获取摘要
- (NSString *)getDigest:(NSString *)groupId;
@end

这个类预定义了下面几种操作类型消息,具体内容可参考名字定义

extern NSString *const RCDGroupCreate;
extern NSString *const RCDGroupMemberAdd;
extern NSString *const RCDGroupMemberQuit;
extern NSString *const RCDGroupMemberKicked;
extern NSString *const RCDGroupRename;
extern NSString *const RCDGroupBulletin;
extern NSString *const RCDGroupOwnerTransfer;
extern NSString *const RCDGroupDismiss;
extern NSString *const RCDGroupMemberJoin;
extern NSString *const RCDGroupMemberManagerSet;
extern NSString *const RCDGroupMemberManagerRemove;
extern NSString *const RCDGroupMemberProtectionOpen;
extern NSString *const RCDGroupMemberProtectionClose;

.m 的实现还是按照自定义消息的实现进行处理。唯一有区别的是在获取摘要的方法,在这个方法中对消息内容进行了处理,根据操作名的不同,来对显示的内容进行各种适配。此处根据根据自己的业务进行修改。

- (NSString *)getDigest:(NSString *)groupId {

    NSString *content;

    //获取用户信息
    NSString *operationName = [self getDisplayNames:@[ self.operatorUserId?self.operatorUserId:@""] groupId:groupId];
    NSString *targetNames = [self getDisplayNames:self.targetUserIds groupId:groupId];

    //是否当前用户操作
    BOOL isMeOperate = NO;
    if ([self.operatorUserId isEqualToString:[RCIMClient sharedRCIMClient].currentUserInfo.userId]) {
        isMeOperate = YES;
    }

    //判断操作类型
    if ([self.operation isEqualToString:RCDGroupCreate]) {
        content =
            [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveCreated" : @"GroupCreated",
                                                                  @"RongCloudKit", nil),
                                       operationName];
    } else if ([self.operation isEqualToString:RCDGroupMemberAdd]) {
        if (self.targetUserIds.count == 1 && [self.targetUserIds containsObject:self.operatorUserId]) {
            content = [NSString
                stringWithFormat:NSLocalizedStringFromTable(@"GroupJoin", @"RongCloudKit", nil), operationName];
        } else {
            content = [NSString
                stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveInvited" : @"GroupInvited",
                                                            @"RongCloudKit", nil),
                                 operationName, targetNames];
        }
    } else if ([self.operation isEqualToString:RCDGroupMemberJoin]) {
        content =
            [NSString stringWithFormat:NSLocalizedStringFromTable(@"GroupJoin", @"RongCloudKit", nil), operationName];
    } else if ([self.operation isEqualToString:RCDGroupMemberQuit]) {
        content = [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveQuit" : @"GroupQuit",
                                                                        @"RongCloudKit", nil),
                                             operationName];
    } else if ([self.operation isEqualToString:RCDGroupMemberKicked]) {
        content =
            [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveRemoved" : @"GroupRemoved",
                                                                  @"RongCloudKit", nil),
                                       operationName, targetNames];
    } else if ([self.operation isEqualToString:RCDGroupRename]) {
        content = [NSString stringWithFormat:NSLocalizedStringFromTable(@"GroupChanged", @"RongCloudKit", nil),
                                             operationName, self.targetGroupName];
    } else if ([self.operation isEqualToString:RCDGroupDismiss]) {
        content =
            [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveDismiss" : @"GroupDismiss",
                                                                  @"RongCloudKit", nil),
                                       operationName];
    } else if ([self.operation isEqualToString:RCDGroupOwnerTransfer]) {
        content = [NSString stringWithFormat:RCDLocalizedString(@"GroupHasNewOwner"), targetNames];
    } else if ([self.operation isEqualToString:RCDGroupMemberManagerSet]) {
        content = [NSString stringWithFormat:RCDLocalizedString(@"GroupSetManagerMessage"), targetNames];
    } else if ([self.operation isEqualToString:RCDGroupMemberProtectionOpen]) {
        content = RCDLocalizedString(@"openMemberProtection");
    } else if ([self.operation isEqualToString:RCDGroupMemberProtectionClose]) {
        content = [NSString stringWithFormat:RCDLocalizedString(@"closeMemberProtection"), operationName];
    } else {
        content = NSLocalizedStringFromTable(@"unknown_message_cell_tip", @"RongCloudKit", nil);
    }
    return content;
}

此外,还有一个获取名称的方法,用来维护用户信息。

- (NSString *)getDisplayNames:(NSArray<NSString *> *)userIds groupId:(NSString *)groupId


克服“水土不服”,融云助攻小象直播杀破“出海重围”

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

2016年是直播行业被资本疯狂追逐的一年,可至今却经历着“浪潮”褪去,洗刷的不止是中小型直播平台,就连熊猫TV等有资本加持的大平台都纷纷遭遇倒闭危机。然而,直播行业作为泛娱乐的模式之一,其实本身“未死”,在行业洗牌和整合的围困下,秀场直播抱团取暖,跨界直播异军... ...查看全部

2016年是直播行业被资本疯狂追逐的一年,可至今却经历着“浪潮”褪去,洗刷的不止是中小型直播平台,就连熊猫TV等有资本加持的大平台都纷纷遭遇倒闭危机。然而,直播行业作为泛娱乐的模式之一,其实本身“未死”,在行业洗牌和整合的围困下,秀场直播抱团取暖,跨界直播异军突起,直播出海也成为各平台生存和扩张的出路之一。

由于东南亚、中东等国家和地区的互联网生态比中国晚 2 到 3 年,直播模式尚处于萌芽阶段,各平台将国内直播模式照搬,以寻求在相对空白的市场加快商业变现。当前国内有近 50 家直播企业出海,覆盖亚洲、欧洲、非洲、美洲和大洋洲等 45 个国家和地区。

直播扎堆出海首先面对的就是技术考验,众多直播公司就遭遇过自研的直播底层 IM 技术无法支持平台流量的困境。“平台没有经历过高并发考验,导致我们刚在东南亚推广上线一天,就彻底崩了。”业内技术人士说道。相对于技术环境较稳定的国内市场,直播出海企业不仅面临 IM 丢包丢消息的风险,其链路能否支撑企业的海外布局也被严格考验着。



克服“水土不服”,小象直播杀破重围

近期,一款主打海外直播的 App 小象直播,吸引了人们关注的目光,这款致力打造“最懂华人”品牌的直播平台于 2018 年 5 月正式上线,并成功入围 2019 年 1 月海外收入 Top 20 视频/直播榜单,并在同年 3 月登上 Google Play 马来西亚应用类 App 总榜第 5 名。

小象直播配图1——海外收入top20
( 2019 年 1 月海外收入 Top 20 视频/直播榜单)

小象直播上线以来,不断更新迭代功能,先后推出直播弹幕、送礼、无限制视频/语音连麦,以及在线抓娃娃等丰富的线上玩法,实现主播与用户连接“无卡顿”、互动“零距离”,为海外用户呈现出超强娱乐性,以及身临其境的直播盛宴。

技术驱动平台发展。在小象直播互动功能持续升级的背后,选择的是全球互联网通信云服务商融云强有力的支持,通过其 SDK 的接入,小象直播快速集成直播互动能力,让海外用户轻松获得极致的互动体验。



融云直播聊天室构建多种类互动场景,亿级并发稳定可靠

融云直播聊天室帮助小象直播构建了稳固的“平台地基”,真正将主播与用户连接起来,稳定、高并发、多种类的直播场景,大大满足了平台用户全面的互动需求。

据了解,融云直播聊天室消息库通用性极高,支持弹幕、礼物、点赞、禁言、踢出聊天室、系统通知等多种消息类型,同时支持 iOS 、 Android 、 Web 、桌面端多平台接入使用;小象直播无需进行繁杂的业务梳理、消息的定义及实现,可灵活使用消息库中的消息类型,满足各类直播场景聊天互动需求、节省研发成本,符合其低成本的运营模式。

融云经过 2218 亿消息峰值和海量用户的锤炼,帮助小象直播平台实现亿级消息并发即时到达,保证实时互动稳定流畅无卡顿。今年 1 月,小象直播在马来西亚举办了一场颁奖典礼,马来西亚当红明星作为嘉宾自带了超高流量,即便如此,融云依然全面保障了小象直播这场年度派对的直播质量。



全球化通信能力支撑小象直播海外用户沟通无障碍

小象直播是一款主打“最懂华人的直播平台”,主要用户群体集中在东南亚,多样的海外业务对通信网络的连通率及稳定性要求极其严格。融云直播聊天室帮助小象直播打消了通信云技术应用的后顾之忧。

小象直播官网截图
(小象直播官宣图)

融云在全球设立了多数据中心,具备 3000 多个加速点,通信网络覆盖全球所有国家及地区,有效保证了海外用户对于链路通畅的超高要求,不仅为小象直播百万用户提供稳定流畅的沟通环境,也对吸引主播加入、提高主播的活跃度及留存率起到很大帮助。

融云作为全球互联网通信云的领导者,致力为全球 27 万 App 提供安全可靠的全球通信云服务,开发者只需简单集成 SDK ,就能获得良好的直播聊天互动体验,完美将互动融入自己的直播业务。

目前,融云与荔枝 FM、羚萌 Show、得到、汽车之家、吱呀、蜜芽等平台进行深度合作,助其直播业务的顺利开展。未来,融云将更专注于技术的研发与服务的升级,为更多开发者及互联网企业带来方便快捷、个性化、多样化的用户体验,领跑“新直播时代”。

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

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

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


融云 SDK 如何实现群组操作

IM即时通讯柠檬^ 发表了文章 • 0 个评论 • 202 次浏览 • 2021-01-11 15:14 • 来自相关话题

融云 SDK 如何实现群组操作背景在集成融云 SDK 后,需要实现群组操作的消息通知。包括:群创建、销毁通知群公告通知群人员加入、退出通知群昵称修改通知...融云现有的 SDK 仅提供了 RCGroupNotificationMessage,内部封装... ...查看全部

融云 SDK 如何实现群组操作

背景

在集成融云 SDK 后,需要实现群组操作的消息通知。包括:

  • 群创建、销毁通知

  • 群公告通知

  • 群人员加入、退出通知

  • 群昵称修改通知

  • ...

融云现有的 SDK 仅提供了 RCGroupNotificationMessage,内部封装了几种简单的类型操作,且扩展性不强,无法完成现有的操作。

解决方案:

使用自定义消息重新来构建群组通知消息。

参考 sealtlak 中的 RCDGroupNotificationMessage,也是单独对群组操作内容,重新进行了封装处理

/*!
 群组通知消息
 */
@interface RCDGroupNotificationMessage : RCMessageContent

//操作名
@property (nonatomic, copy) NSString *operation;

//操作人
@property (nonatomic, copy) NSString *operatorUserId;

//操作对象
@property (nonatomic, strong) NSArray<NSString *> *targetUserIds;

//内容
@property (nonatomic, copy) NSString *message;

//获取摘要
- (NSString *)getDigest:(NSString *)groupId;
@end

这个类预定义了下面几种操作类型消息,具体内容可参考名字定义

extern NSString *const RCDGroupCreate;
extern NSString *const RCDGroupMemberAdd;
extern NSString *const RCDGroupMemberQuit;
extern NSString *const RCDGroupMemberKicked;
extern NSString *const RCDGroupRename;
extern NSString *const RCDGroupBulletin;
extern NSString *const RCDGroupOwnerTransfer;
extern NSString *const RCDGroupDismiss;
extern NSString *const RCDGroupMemberJoin;
extern NSString *const RCDGroupMemberManagerSet;
extern NSString *const RCDGroupMemberManagerRemove;
extern NSString *const RCDGroupMemberProtectionOpen;
extern NSString *const RCDGroupMemberProtectionClose;

.m 的实现还是按照自定义消息的实现进行处理。唯一有区别的是在获取摘要的方法,在这个方法中对消息内容进行了处理,根据操作名的不同,来对显示的内容进行各种适配。此处根据根据自己的业务进行修改。

- (NSString *)getDigest:(NSString *)groupId {

    NSString *content;

    //获取用户信息
    NSString *operationName = [self getDisplayNames:@[ self.operatorUserId?self.operatorUserId:@""] groupId:groupId];
    NSString *targetNames = [self getDisplayNames:self.targetUserIds groupId:groupId];

    //是否当前用户操作
    BOOL isMeOperate = NO;
    if ([self.operatorUserId isEqualToString:[RCIMClient sharedRCIMClient].currentUserInfo.userId]) {
        isMeOperate = YES;
    }

    //判断操作类型
    if ([self.operation isEqualToString:RCDGroupCreate]) {
        content =
            [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveCreated" : @"GroupCreated",
                                                                  @"RongCloudKit", nil),
                                       operationName];
    } else if ([self.operation isEqualToString:RCDGroupMemberAdd]) {
        if (self.targetUserIds.count == 1 && [self.targetUserIds containsObject:self.operatorUserId]) {
            content = [NSString
                stringWithFormat:NSLocalizedStringFromTable(@"GroupJoin", @"RongCloudKit", nil), operationName];
        } else {
            content = [NSString
                stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveInvited" : @"GroupInvited",
                                                            @"RongCloudKit", nil),
                                 operationName, targetNames];
        }
    } else if ([self.operation isEqualToString:RCDGroupMemberJoin]) {
        content =
            [NSString stringWithFormat:NSLocalizedStringFromTable(@"GroupJoin", @"RongCloudKit", nil), operationName];
    } else if ([self.operation isEqualToString:RCDGroupMemberQuit]) {
        content = [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveQuit" : @"GroupQuit",
                                                                        @"RongCloudKit", nil),
                                             operationName];
    } else if ([self.operation isEqualToString:RCDGroupMemberKicked]) {
        content =
            [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveRemoved" : @"GroupRemoved",
                                                                  @"RongCloudKit", nil),
                                       operationName, targetNames];
    } else if ([self.operation isEqualToString:RCDGroupRename]) {
        content = [NSString stringWithFormat:NSLocalizedStringFromTable(@"GroupChanged", @"RongCloudKit", nil),
                                             operationName, self.targetGroupName];
    } else if ([self.operation isEqualToString:RCDGroupDismiss]) {
        content =
            [NSString stringWithFormat:NSLocalizedStringFromTable(isMeOperate ? @"GroupHaveDismiss" : @"GroupDismiss",
                                                                  @"RongCloudKit", nil),
                                       operationName];
    } else if ([self.operation isEqualToString:RCDGroupOwnerTransfer]) {
        content = [NSString stringWithFormat:RCDLocalizedString(@"GroupHasNewOwner"), targetNames];
    } else if ([self.operation isEqualToString:RCDGroupMemberManagerSet]) {
        content = [NSString stringWithFormat:RCDLocalizedString(@"GroupSetManagerMessage"), targetNames];
    } else if ([self.operation isEqualToString:RCDGroupMemberProtectionOpen]) {
        content = RCDLocalizedString(@"openMemberProtection");
    } else if ([self.operation isEqualToString:RCDGroupMemberProtectionClose]) {
        content = [NSString stringWithFormat:RCDLocalizedString(@"closeMemberProtection"), operationName];
    } else {
        content = NSLocalizedStringFromTable(@"unknown_message_cell_tip", @"RongCloudKit", nil);
    }
    return content;
}

此外,还有一个获取名称的方法,用来维护用户信息。

- (NSString *)getDisplayNames:(NSArray<NSString *> *)userIds groupId:(NSString *)groupId


克服“水土不服”,融云助攻小象直播杀破“出海重围”

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

2016年是直播行业被资本疯狂追逐的一年,可至今却经历着“浪潮”褪去,洗刷的不止是中小型直播平台,就连熊猫TV等有资本加持的大平台都纷纷遭遇倒闭危机。然而,直播行业作为泛娱乐的模式之一,其实本身“未死”,在行业洗牌和整合的围困下,秀场直播抱团取暖,跨界直播异军... ...查看全部

2016年是直播行业被资本疯狂追逐的一年,可至今却经历着“浪潮”褪去,洗刷的不止是中小型直播平台,就连熊猫TV等有资本加持的大平台都纷纷遭遇倒闭危机。然而,直播行业作为泛娱乐的模式之一,其实本身“未死”,在行业洗牌和整合的围困下,秀场直播抱团取暖,跨界直播异军突起,直播出海也成为各平台生存和扩张的出路之一。

由于东南亚、中东等国家和地区的互联网生态比中国晚 2 到 3 年,直播模式尚处于萌芽阶段,各平台将国内直播模式照搬,以寻求在相对空白的市场加快商业变现。当前国内有近 50 家直播企业出海,覆盖亚洲、欧洲、非洲、美洲和大洋洲等 45 个国家和地区。

直播扎堆出海首先面对的就是技术考验,众多直播公司就遭遇过自研的直播底层 IM 技术无法支持平台流量的困境。“平台没有经历过高并发考验,导致我们刚在东南亚推广上线一天,就彻底崩了。”业内技术人士说道。相对于技术环境较稳定的国内市场,直播出海企业不仅面临 IM 丢包丢消息的风险,其链路能否支撑企业的海外布局也被严格考验着。



克服“水土不服”,小象直播杀破重围

近期,一款主打海外直播的 App 小象直播,吸引了人们关注的目光,这款致力打造“最懂华人”品牌的直播平台于 2018 年 5 月正式上线,并成功入围 2019 年 1 月海外收入 Top 20 视频/直播榜单,并在同年 3 月登上 Google Play 马来西亚应用类 App 总榜第 5 名。

小象直播配图1——海外收入top20
( 2019 年 1 月海外收入 Top 20 视频/直播榜单)

小象直播上线以来,不断更新迭代功能,先后推出直播弹幕、送礼、无限制视频/语音连麦,以及在线抓娃娃等丰富的线上玩法,实现主播与用户连接“无卡顿”、互动“零距离”,为海外用户呈现出超强娱乐性,以及身临其境的直播盛宴。

技术驱动平台发展。在小象直播互动功能持续升级的背后,选择的是全球互联网通信云服务商融云强有力的支持,通过其 SDK 的接入,小象直播快速集成直播互动能力,让海外用户轻松获得极致的互动体验。



融云直播聊天室构建多种类互动场景,亿级并发稳定可靠

融云直播聊天室帮助小象直播构建了稳固的“平台地基”,真正将主播与用户连接起来,稳定、高并发、多种类的直播场景,大大满足了平台用户全面的互动需求。

据了解,融云直播聊天室消息库通用性极高,支持弹幕、礼物、点赞、禁言、踢出聊天室、系统通知等多种消息类型,同时支持 iOS 、 Android 、 Web 、桌面端多平台接入使用;小象直播无需进行繁杂的业务梳理、消息的定义及实现,可灵活使用消息库中的消息类型,满足各类直播场景聊天互动需求、节省研发成本,符合其低成本的运营模式。

融云经过 2218 亿消息峰值和海量用户的锤炼,帮助小象直播平台实现亿级消息并发即时到达,保证实时互动稳定流畅无卡顿。今年 1 月,小象直播在马来西亚举办了一场颁奖典礼,马来西亚当红明星作为嘉宾自带了超高流量,即便如此,融云依然全面保障了小象直播这场年度派对的直播质量。



全球化通信能力支撑小象直播海外用户沟通无障碍

小象直播是一款主打“最懂华人的直播平台”,主要用户群体集中在东南亚,多样的海外业务对通信网络的连通率及稳定性要求极其严格。融云直播聊天室帮助小象直播打消了通信云技术应用的后顾之忧。

小象直播官网截图
(小象直播官宣图)

融云在全球设立了多数据中心,具备 3000 多个加速点,通信网络覆盖全球所有国家及地区,有效保证了海外用户对于链路通畅的超高要求,不仅为小象直播百万用户提供稳定流畅的沟通环境,也对吸引主播加入、提高主播的活跃度及留存率起到很大帮助。

融云作为全球互联网通信云的领导者,致力为全球 27 万 App 提供安全可靠的全球通信云服务,开发者只需简单集成 SDK ,就能获得良好的直播聊天互动体验,完美将互动融入自己的直播业务。

目前,融云与荔枝 FM、羚萌 Show、得到、汽车之家、吱呀、蜜芽等平台进行深度合作,助其直播业务的顺利开展。未来,融云将更专注于技术的研发与服务的升级,为更多开发者及互联网企业带来方便快捷、个性化、多样化的用户体验,领跑“新直播时代”。