融云

融云

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

GeekOnline编程挑战赛梅川酷子 发表了文章 • 0 个评论 • 464 次浏览 • 2020-12-02 18:40 • 来自相关话题

内容整理自Geek Online 2020 编程挑战赛群答疑内容,关于大赛请点击Geek Online 2020 编程挑战赛了解详情。如果您有IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论。问题 1: 下载SDK如何选择?各大版本有什么区别?问题 1... ...查看全部

内容整理自Geek Online 2020 编程挑战赛群答疑内容,关于大赛请点击Geek Online 2020 编程挑战赛了解详情。如果您有IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论。

问题 1: 下载SDK如何选择?各大版本有什么区别?

问题 1 答案:使用最新版本 4.0 SDK ,新版 SDK 包含很多新功能并且会将历史版本遗留 Bug 进行修复,所以极力推荐使用新版 SDK 4.0+ 集成开发,下载地址:https://www.rongcloud.cn/downloads

问题 2 :开发环境和生产环境有什么区别?

问题 2 答案:  开发环境功能免费使用,但用户数有 100 个限制,生产环境无用户数限制,但需要付费,咱们的参赛同学使用开发环境集成就好

问题 3 :参赛过程中开发产生的费用怎么办?(注:本条仅限于参赛期间选手的参赛作品)

问题 3 答案:开发环境功能均可免费体验,遇到特殊情况可在战队群里向融云同学处理

问题 4 :小程序开发有什么注意事项?

问题 4 答案:

 (1)需要在开发者后台小程序中开通,开通 30 分钟后生效

 (2)小程序发布上线需要优先设置合法域名:https://docs.rongcloud.cn/v4/views/rtc/call/noui/quick/mini.html

 (3)小程序特殊分类需要证书,例如社交小程序需要 ICP 证书,所以大家选择小程序分类时要提前注意是否需要证书

问题 5: 融云支持哪些平台?

问题 5 答案:支持 iOS、Android、Web、Flutter、uniapp、Electron,如果有 IoT 需求可以私信融云同学

问题 6:  如果遇到集成文档问题,怎么办?(也可以在本篇文章留言回复)

问题 6 答案:可直接在战队群里反馈至融云同学,欢迎大家对文档的改进提出宝贵建议,感谢

问题7:ios没上线 push怎么做?

问题7答案:在融云开发者后台 -> 应用 -> 开发环境可以设置

微信图片_20201202183130.png


问题8:融云的RTC集成必须要集成IM?

问题8答案:RTC SDK 依赖于 IM SDK,一定要连接 IM 后再进行 RTC 相关的集成

问题9:融云新版SDK4.0版本和2.0版本对比有哪些升级?具体有哪些优化和提升?

问题9答案:4.0 SDK 是融云基于近几年的经验积累和沉淀进行的重构版,包含对架构、连接、重连、弱网等使用场景做了特殊优化,除核心能力优化外 4.0 SDK 还在持续发布新功能,例如:聊天室 KV 存储、会话置顶免打扰等

问题10:我想问一下,rongrtc的storage改动如何监听似乎rongclient设置接受到消息的onreceived回调不会触发。而改动storage 时是有设置第三个消息参数的,Sdk的debug会打印storage_set的,可以拦截不?

问题10答案:如果设置了第三个参数,会触发接收方的 RongRTC 实例的 Message received 监听

问题11:融云有没有小程序版的IM集成SDK?

问题11答案:有的,开发者后台开通小程序后可以直接下载小程序 IM SDK,开通位置:https://developer.rongcloud.cn/miniprogram/index/

问题12:弱弱的问一句,融云可否实现微信群机器人?现在微商盛行,想用融云做个自动问答的机器人客服 」

问题12答案:可以的,融云支持将消息路由的能力,消息路由到自己服务器后可以对接三方图文识别厂商

问题13:融云有内嵌到app的H5版本客服机器人吗?

问题14:不单独提供客服的,但 IM SDK 支持 H5 的

感谢各位选手的参与,Geek Online 2020 编程挑战赛 完美收官,关于大赛:

 Geek Online 2020 编程挑战赛官网

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

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

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


关于IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论

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

IM即时通讯柠檬^ 发表了文章 • 0 个评论 • 47 次浏览 • 2021-02-24 19:30 • 来自相关话题

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 即可;


融云 SDK 5.0.0 功能迭代

IM即时通讯融云技术团队 发表了文章 • 0 个评论 • 116 次浏览 • 2021-01-29 16:07 • 来自相关话题

融云 SDK 发布了 5.0 Dev 版本,在持续迭代新功能的同时,此版本对 IMKit SDK 进⾏了重构优化并且对外开源,SDK 初始化速度更快,同时减少了不必要的内存占⽤,针对 Android 库⽂件引⼊了加固技术,提升 App 安全性,详细如下:新增功... ...查看全部

融云 SDK 发布了 5.0 Dev 版本,在持续迭代新功能的同时,此版本对 IMKit SDK 进⾏了重构优化并且对外开源,SDK 初始化速度更快,同时减少了不必要的内存占⽤,针对 Android 库⽂件引⼊了加固技术,提升 App 安全性,详细如下:

新增功能

1.⾃定义多语⾔推送⽂案

功能描述:
根据⽬标⽤户设置的语⾔环境,从推送模板中选择对应语⾔的内容进⾏远程推送。

应用场景:
应⽤中存在多个国家的终端⽤户,在发送系统升级、运营活动类的通知时,需要给不同语⾔环境的⽤户推送不同的运营内容,可使⽤此功能设置多语⾔推送⽂案,增强运营效果,提升⽤户使⽤体验。

使用方式:
通过融云开发者后台,设置⾃定义推送模板,创建模板 ID。
终端⽤户通过 SDK 中 setPushLanguageCode 接⼝上报⽤户的语⾔环境。
SDK 或 Server API 发送消息时,携带后台创建的模板 ID(templateId),如⽬标⽤户未在线时,融云服务端会⾃动根据⽬标⽤户的语⾔环境选择对应的语⾔内容进⾏推送。


1.png

2.静默撤回消息功能

需要撤回⼀条消息,⼜不希望通知对⽅时,可以在撤回消息时设置 isDisableNotification 属性,设置后⽬标⽤户不会收到撤回消息时的通知栏提醒,⽀持通过 SDK 或 Server API 撤回消息时进⾏设置。

功能优化


  • 对 IMKit SDK 进⾏了代码重构并且开源,提升了 UI 品质及⽤户体验,解决了开发者在⽼版 IMKit 中某些 UI ⾃定义需求不能满⾜的问题。
  • 从 5.0 版本开始 Android IMKit SDK 使⽤ AndroidX 库实现,Google ⾃ support v7:28 开始,⼤部分 support 包都迁移到 AndroidX 下,建议开发者们尽早将项⽬转移到 AndroidX 下。
  • iOS IMLib 通讯能⼒库使⽤动态库技术,减少了不必要的内存占⽤,使 SDK 内存占⽤更⼩。
  • 对 SDK 整体性能进⾏优化,SDK 初始化速度更快,耗电更少。
  • Android SDK 引⼊了 Android 库⽂件加固技术,提升 App 安全性。
  • Android SDK 对 Android 11 系统进⾏了兼容适配。
  • 修复了 RTC SDK 的部分 BUG。

详细内容请查看官⽹版本更新描述:
IM 版本更新描述
音视频版本更新描述

融云自定义消息不显示

IM即时通讯徐凤年 发表了文章 • 0 个评论 • 127 次浏览 • 2021-01-11 15:14 • 来自相关话题

项目用的融云,IMKit SDK(自带 UI),但是出现一个问题,就是自定义消息在会话页面刚收到的时候能显示,但是退出会话页面再进入就不显示了。非常的纳闷啊。查询了存储策略,编解码方法,都没有问题。后来提交工单,技术人员给了反馈才发现自己把消息的注册放到了初始... ...查看全部

项目用的融云,IMKit SDK(自带 UI),但是出现一个问题,就是自定义消息在会话页面刚收到的时候能显示,但是退出会话页面再进入就不显示了。非常的纳闷啊。查询了存储策略,编解码方法,都没有问题。后来提交工单,技术人员给了反馈才发现自己把消息的注册放到了初始化 appkey 前边,然后人家融云写的很明确:使用融云SDK所有功能(包括显示SDK中或者继承于SDK的View)之前,您必须先调用此方法初始化 SDK。可见认真查看文档接口注释的重要性!!

/*!
 初始化融云SDK

 @param appKey  从融云开发者平台创建应用后获取到的App Key

 @discussion 您在使用融云SDK所有功能(包括显示SDK中或者继承于SDK的View)之前,您必须先调用此方法初始化SDK。
 在App整个生命周期中,您只需要执行一次初始化。

 @warning 如果您使用IMKit,请使用此方法初始化SDK;
 如果您使用IMLib,请使用RCIMClient中的同名方法初始化,而不要使用此方法。
 */
- (void)initWithAppKey:(NSString *)appKey;

融云(www.rongcloud.cn)

融云 SDK 如何实现群组操作

IM即时通讯柠檬^ 发表了文章 • 0 个评论 • 233 次浏览 • 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


融云 IM SDK 发送语音消息

IM即时通讯苏道 发表了文章 • 0 个评论 • 271 次浏览 • 2021-01-05 16:04 • 来自相关话题

由于公司既有移动端又有 web 端,所以在语音消息这遇到了些小问题。解决的过程最近整理了下也分享给大家作为参考。遇到问题web 端发送语音的问题。移动端发送来的 VoiceMessage 在 web 端不知道如何处理。解决办法问题一 融云只负责发消息,不提供录... ...查看全部

由于公司既有移动端又有 web 端,所以在语音消息这遇到了些小问题。解决的过程最近整理了下也分享给大家作为参考。

遇到问题

  1. web 端发送语音的问题。

  2. 移动端发送来的 VoiceMessage 在 web 端不知道如何处理。

解决办法

  1. 问题一 融云只负责发消息,不提供录制。

所以这边自己找了些录制的插件,这里参考了一个小示例https://blog.csdn.net/qq_37310318/article/details/88312013
拿到后改了改实现了音频录制,修改了上传的逻辑,上传逻辑使用的融云的上传插件,参考的文档 https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#FileMsg

  1. 移动端同事说他们用的是融云的 IMKit,于是提工单问了下,融云的同事给解决办法。

Android 枚举类型

/**
* 语音消息类型
*/
public enum VoiceMessageType {
  /**
    * 普通音质语音消息
    */
  Ordinary,
  /**
    * 高音质语音消息
    */
  HighQuality
}

Android

RongIM.getInstance().setVoiceMessageType(RongIM.VoiceMessageType.HighQuality);

iOS

[RCIMClient sharedRCIMClient].voiceMsgType = RCVoiceMessageTypeHighQuality;

把上上述方法在初始化 init 时设置下即可发送高清语音消息。完美解决。

实现中参考的文献:
web 实现语音录制:https://blog.csdn.net/qq_37310318/article/details/88312013

融云文档:https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#FileMsg

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


集成融云 IM 问题总结

IM即时通讯苏道 发表了文章 • 0 个评论 • 270 次浏览 • 2021-01-05 14:37 • 来自相关话题

最近项目里用到了 IM 相关能力,并且之前也有了解融云,所以直接就用了,下面自己总结一些注意事项,在这些点上花了一丢丢时间,在此记录下1、融云是通过他们自己的 AppKey 来隔离不同应用之间的消息的,只有在一个 AppKey 的用户可互发消息2、连接融云的时... ...查看全部

最近项目里用到了 IM 相关能力,并且之前也有了解融云,所以直接就用了,下面自己总结一些注意事项,在这些点上花了一丢丢时间,在此记录下

1、融云是通过他们自己的 AppKey 来隔离不同应用之间的消息的,只有在一个 AppKey 的用户可互发消息

2、连接融云的时候,需要一个 Token,这个 Token 是通过融云的 Server 获取的,并且只能通过自己的 Server 调用,否则有安全问题,调试时可以用他们开发者后台提供的调试工具来获取 Token,写死在页面调试,这点很重要,就不用等后端接口了

3、历史消息默认不存,需要单独开通,这个也是看到了错误码才理解,之前一直在琢磨,咋没有最近聊过天的人列表

4、如果需要浏览器多个 Tab 同时连接,需要单独开通,打开多个浏览器,之前的 Tab 连接就断了,也许要单独开通,不过开发环境免费,可以随便造,哈哈

5、A 给 B 发消息,只需要知道 B 的 Id 就可以发了,B 再上线就可以收到,模拟两个发消息,可以打开两个浏览器分别模拟 A 和 B 发送和接收消息

6、A 给 B 发送消息,A 的 targetId 是 B,B 的 targetId 是 A,消息的发送人是 A,这个逻辑有点绕,简单理解为 A 的 targetId 是 B,B 的 targetId 是 A,消息的发送人 Id 不变,我滴妈呀,有点像饶舌,来哼起来 哈哈哈~

完毕,虽然没啥逻辑,记录下,好记性不如烂笔头,以免后续再用~

有需要可以去官方查看更多内容:

官网主页:https://www.rongcloud.cn

文档主页:https://docs.rongcloud.cn/v4


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

IM即时通讯苏道 发表了文章 • 0 个评论 • 266 次浏览 • 2021-01-05 14:37 • 来自相关话题

背景在集成融云的即时通讯时,产品脑门一拍说:咋们要实现一个功能,不管是 Web 端还是移动端登入,必须只能一个端登入成功并且后登入成功的账号需要踢掉前面登入的账号。咋的一听感觉还蛮简单的,融云不是有一个服务嘛:叫做多设备消息同步,我把该服务关掉不就行了~~ O... ...查看全部

背景

在集成融云的即时通讯时,产品脑门一拍说:咋们要实现一个功能,不管是 Web 端还是移动端登入,必须只能一个端登入成功并且后登入成功的账号需要踢掉前面登入的账号

咋的一听感觉还蛮简单的,融云不是有一个服务嘛:叫做多设备消息同步,我把该服务关掉不就行了~~ O(∩_∩)O哈哈~

但是……. ┭┮﹏┭┮
是我想的太简单了,服务关掉之后 Web 端的确可以进行互踢了,但是移动端和 Web 端还是可以在线呀,原来默认的情况下,融云仅支持 1 个 Web 端、1 个 桌面端、1 个移动端同时在线

这个是融云多端同时在线详情:https://docs.rongcloud.cn/v4/views/im/noui/guide/group/connection/multiclient/

话不多说,开始揭开谜底

1、首先将多设备消息同步 - 关闭,关闭连接:https://developer.rongcloud.cn/advance/index/YTrydqMSdEsmBtX2zX0Amg

2、这时如果多端登入状态监听会监听到状态码 6 时,执行断开链接

代码示例

im.watch({
  conversation: function(event){
    var updatedConversationList = event.updatedConversationList; // 更新的会话列表
    console.log('更新会话汇总:', updatedConversationList);
    console.log('最新会话列表:', im.Conversation.merge({
        conversationList,
        updatedConversationList
      }));
  },
  message: function(event){
    var message = event.message;
    console.log('收到新消息:', message);
  },
  status: function(event){
     console.log('连接状态码:', status);
     var status = event.status;
     if(status == 6){
       im.disconnect().then(function() {
        console.log('断开链接成功');
       });
     }
  }
});

3、通过发送自定义消息,来执行断开连接方法

比如您有两个设备 A,B,用户开始在 A 设备登入,然后再 B 设备登入成功后给自己或者给别人发一条自定义消息,A 设备在监听中根据该自定义消息判断,调用断开连接方法,即可做到只有一个设备登入

//发送自定义消息
var conversation = im.Conversation.get({
  targetId: '接收方的 userId',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.send({
  messageType: 's:person', // 填写开发者定义的 messageType
  content: { // 填写开发者定义的消息内容
    name: 'RongCloud',
    age: 12
  },
  isPersited: true,// 是否存储在服务端,默认为 true
  isCounted: true  // 是否计数. 计数消息接收端接收后未读数加 1,默认为 true
}).then(function(message){
  console.log('发送 s:person 消息成功', message);
});

通过上面的步骤,就可以实现只能单设备登入了,但是需要注意您使用的 SDK 版本,一开始我用 3.0.5 SDK 来做,但是有一个问题:执行断开连接还是会进行重连,所以要使用 SDK 3.0.6 版本以上的 SDK 哦

融云 Web 播放声音(AMR 、WAVE)

IM即时通讯赵炳东 发表了文章 • 0 个评论 • 29 次浏览 • 2021-01-05 11:50 • 来自相关话题

最近甚是苦闷,做语音播放降级,跳进了很多坑,别提有多惨了,不过结果还是不错滴,纵观前后,一句话足以概括 “痛并快乐着” ~~~ok,我少说废话,下面来总结下 Web 播放声音一些注意事项。说到 Web 我第一件事想起的就是浏览器兼容性,播放声音当然也难逃苦海,... ...查看全部

最近甚是苦闷,做语音播放降级,跳进了很多坑,别提有多惨了,不过结果还是不错滴,纵观前后,一句话足以概括 “痛并快乐着” ~~~

ok,我少说废话,下面来总结下 Web 播放声音一些注意事项。

说到 Web 我第一件事想起的就是浏览器兼容性,播放声音当然也难逃苦海,需要注意以 Trident 为内核 (IE为主) 的浏览器,和 FF、Chrome等浏览器的区别。

1、技术准备

① FF、Chrome等支持


② IE 浏览器下不支持(IE9以下


2、详细说明

为避免文章过于冗长,针对以上两种情况分别总结:

① 使用 AMR (Audio) 播放 : http://www.cnblogs.com/yuhongda0315/p/5224188.html

② 使用 Flash 播放 :http://www.cnblogs.com/yuhongda0315/p/5224450.html

3、资料下载

ActionScript : player-as3源码.rar

完整的demo : amrPlayer-jsdemo.rar

ActionScript 播放 Wave 文件 :wavePlayer-as3源码.rar

所需要的JS(amr.js 在 libamr-min.js 最下方):所需JS.rar

原始文章连接:https://www.cnblogs.com/yuhongda0315/p/5224064.html

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

融云文档:https://docs.rongcloud.cn/v4


融云 IM 那些事儿

IM即时通讯苏道 发表了文章 • 0 个评论 • 267 次浏览 • 2021-01-05 10:55 • 来自相关话题

最近闲来无事在网上冲浪,看到关注公众号推送了一篇 《Zoom大火之后,这家国内公司也很值得关注啊》 的文章,看样子八成是融云的运营稿(融云的朋友看到别打我…),不过不重要,重要的因为这篇文章确实让我对 IM 和 RTC 提起了浓厚的兴趣,因为疫情期间还没有离职... ...查看全部

最近闲来无事在网上冲浪,看到关注公众号推送了一篇 《Zoom大火之后,这家国内公司也很值得关注啊》 的文章,看样子八成是融云的

运营稿(融云的朋友看到别打我…),不过不重要,重要的因为这篇文章确实让我对 IM 和 RTC 提起了浓厚的兴趣,因为疫情期间还没有离职

公司每天都用 Zoom,后来 Zoom 这家伙宣布停止对中国提供服务后,鬼知道老板是为了彰显爱国主义情节还是怕服务不稳定,老板果断切换为腾讯会议

离职后虽然用的少了,但偶尔开个会啥的,也会用腾讯会议或者微信的音视频进行和伙伴进行线上沟通,这么说来接触音视频 Saas 也有一段时间了

但对底层如何实现的通话一无所知,你知道的,作为一个有追求的码农,知其然必知其所以然,正赶上看了前面提到的文章,于是马上动手开始研究融云的

IM 和 RTC,先从 IM 开始说起~

我是从以下几步分别了解:官网开发者后台开发文档

官网

从官网得到了以下个信息:

产品分类

1、IM + RTC: 之前在公司听同事说过融云做 IM,不知道啥时候也做了 RTC ,还挺有意思,不知道具体原因,个人理解也许 IM 的天花板比较低或者变现难,并且音视频在未来网络基础设置越来越好、流量越来越廉价、5G 的到来等种种因素,音视频还是很有前景的,才杀入 RTC 战场,分一杯羹

2、支持平台: Android、iOS、Web、小程序、Electron、Flutter 主流平台都支持

支持四种部署方式

1、公有云: 大家公用一个盘子,有点过去大通铺的赶脚,我要是胖我睡的面积就大,当然了我要是胖可能还挤到你,可能会有资源抢占的情况,不过这要看融云的预留冗余资源了

2、专有云: 相比大通铺,这个就高级多了,类似单间,空间、卫浴均为独立,并且私密性比较好

3、海外云: 海外大通铺,在线咨询了下,海外用户也能直接用国内数据中心,估计他们自己的网络链路,具体原因没有再细问,毕竟暂时也不用,不太好意思,我是一个腼腆的人儿

4、私有云: 相比单间,这就是自己盖房子了,融云提供设计图,并且找施工队给你单独盖一个琉璃大瓦房,但后续怎么维护没看到说明,有可能和通用外包的维护费用类似,比如:每年维护费是合同款的 10%,费用是我自己 YY 的,不会用也没好意思去找他们人了解

目前正在搞的活动

1、黑客马拉松:印象最深的银子,第一名给五万,我是看到晚要不一定参加,这样可以弥补一点离职期间经济损失,毕竟离职前薪资也一个月 xxx 呢(一不小心差点把工资说出来,万一媳妇看见小金库可就没有了…..慌的一批,哈哈哈)

2、WICC:全名好长,全球互联网通信云大会,不和全球占点关系,都不好意说自己是互联网公司,哈哈,不过看他们也有海外节点,这么说也合理,地址不在北京,可惜去不了,要不真的可以去 see see

3、聆听:这是一个收集建议的系统包括吐槽啥的,看样子还是比较注重客户服务,在这样一个技术可快速复制的时代,也许客户服务等软技能还是挺重要的,尤其是 ToB 企业

其他

1、其他的都是一些案例介绍,这些东各家公司如出一辙,秀秀肌肉、吹吹牛啥的,就没多看,目前我不关注这块

开发者后台

功能丰富

进入后台第一眼真的是功能丰富,看出来确实是积累了很多功能,不过产品逻辑不是很好,有点无从下手,研究了一会理解了

调试工具

调试工具点个赞,把所有服务端的接口都做了可在线调试的 API,如果集成初期没有自己 Server 接口,完全可以用这个来集成,非常方便,很惊喜

小槽点

开发者后台的界面略丑,看起来有点像智能手机和老人机的排版布局差异,虽说不影响使用吧,但作为一个有追求的青年咋能对美不挑剔呢,不对,应该少年,不对不对,是青少年,文章暂停下,我先倒腾下措辞….(两个小时后,是少年,我还是从前那个少年,没有一丝丝改变…..)

开发文档

文档分类倒是简单,IM、RTC、运营服务, 下面逐个介绍下感受

1、IM: 不愧是做 IM 起家的 Paas 厂商,支持的能力确实很出色,尤其聊天室的功能格外丰富,在线和客服妹子聊说人数无上限,支持弹性扩所容

2、RTC: 看完文档就能知道在音视频沉淀还有不够,为啥这么说,在文档投入精力一定不够,或者资源在忙于其他更重要的事情未开始规划,后台看了看发布的第一版音视频 SDK,是在去年三月份,和感觉还比较像,瞬间觉得自己像老司机一样,哈哈

3、粗略过了一遍文档,体验了下官方 Demo SealRTC,音视频质量相当不错,晚上纽约的老铁视频用的就是这个东东,非常流畅,好感度暴涨

————华丽的人肉分割线————-

整体感觉就这些,这里没有涉及技术集成,后面再集成试试,写完感觉像给融云写了一篇产品介绍的稿子,不知道融云的朋友看到会不会给我发稿费 哈哈

就写到这里了吧,太阳快出来了,睡觉~~~

另外赠从下融云相关链接

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

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


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

GeekOnline编程挑战赛梅川酷子 发表了文章 • 0 个评论 • 464 次浏览 • 2020-12-02 18:40 • 来自相关话题

内容整理自Geek Online 2020 编程挑战赛群答疑内容,关于大赛请点击Geek Online 2020 编程挑战赛了解详情。如果您有IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论。问题 1: 下载SDK如何选择?各大版本有什么区别?问题 1... ...查看全部

内容整理自Geek Online 2020 编程挑战赛群答疑内容,关于大赛请点击Geek Online 2020 编程挑战赛了解详情。如果您有IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论。

问题 1: 下载SDK如何选择?各大版本有什么区别?

问题 1 答案:使用最新版本 4.0 SDK ,新版 SDK 包含很多新功能并且会将历史版本遗留 Bug 进行修复,所以极力推荐使用新版 SDK 4.0+ 集成开发,下载地址:https://www.rongcloud.cn/downloads

问题 2 :开发环境和生产环境有什么区别?

问题 2 答案:  开发环境功能免费使用,但用户数有 100 个限制,生产环境无用户数限制,但需要付费,咱们的参赛同学使用开发环境集成就好

问题 3 :参赛过程中开发产生的费用怎么办?(注:本条仅限于参赛期间选手的参赛作品)

问题 3 答案:开发环境功能均可免费体验,遇到特殊情况可在战队群里向融云同学处理

问题 4 :小程序开发有什么注意事项?

问题 4 答案:

 (1)需要在开发者后台小程序中开通,开通 30 分钟后生效

 (2)小程序发布上线需要优先设置合法域名:https://docs.rongcloud.cn/v4/views/rtc/call/noui/quick/mini.html

 (3)小程序特殊分类需要证书,例如社交小程序需要 ICP 证书,所以大家选择小程序分类时要提前注意是否需要证书

问题 5: 融云支持哪些平台?

问题 5 答案:支持 iOS、Android、Web、Flutter、uniapp、Electron,如果有 IoT 需求可以私信融云同学

问题 6:  如果遇到集成文档问题,怎么办?(也可以在本篇文章留言回复)

问题 6 答案:可直接在战队群里反馈至融云同学,欢迎大家对文档的改进提出宝贵建议,感谢

问题7:ios没上线 push怎么做?

问题7答案:在融云开发者后台 -> 应用 -> 开发环境可以设置

微信图片_20201202183130.png


问题8:融云的RTC集成必须要集成IM?

问题8答案:RTC SDK 依赖于 IM SDK,一定要连接 IM 后再进行 RTC 相关的集成

问题9:融云新版SDK4.0版本和2.0版本对比有哪些升级?具体有哪些优化和提升?

问题9答案:4.0 SDK 是融云基于近几年的经验积累和沉淀进行的重构版,包含对架构、连接、重连、弱网等使用场景做了特殊优化,除核心能力优化外 4.0 SDK 还在持续发布新功能,例如:聊天室 KV 存储、会话置顶免打扰等

问题10:我想问一下,rongrtc的storage改动如何监听似乎rongclient设置接受到消息的onreceived回调不会触发。而改动storage 时是有设置第三个消息参数的,Sdk的debug会打印storage_set的,可以拦截不?

问题10答案:如果设置了第三个参数,会触发接收方的 RongRTC 实例的 Message received 监听

问题11:融云有没有小程序版的IM集成SDK?

问题11答案:有的,开发者后台开通小程序后可以直接下载小程序 IM SDK,开通位置:https://developer.rongcloud.cn/miniprogram/index/

问题12:弱弱的问一句,融云可否实现微信群机器人?现在微商盛行,想用融云做个自动问答的机器人客服 」

问题12答案:可以的,融云支持将消息路由的能力,消息路由到自己服务器后可以对接三方图文识别厂商

问题13:融云有内嵌到app的H5版本客服机器人吗?

问题14:不单独提供客服的,但 IM SDK 支持 H5 的

感谢各位选手的参与,Geek Online 2020 编程挑战赛 完美收官,关于大赛:

 Geek Online 2020 编程挑战赛官网

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

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

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


关于IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论

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

IM即时通讯徐凤年 发表了文章 • 0 个评论 • 404 次浏览 • 2020-12-02 15:58 • 来自相关话题

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

背景:

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

微信截图_20201202155726.png

如何兼容Android Q

Android 10 适配
前言
为了让用户更好地控制自己的文件,并限制文件混乱的情况,Android 10(Q) 修改了 APP 访问外部存储中文件的方法。外部存储的新特性被称为 Scoped Storage。

Android 10(Q) 仍然使用 READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 作为面向用户的存储相关运行时权限,但现在即使获取了这些权限,访问外部存储也受到了限制。APP 需要这些运行时权限的情景发生了变化,且各种情况下外部存储对 APP 的可见性也发生了变化 在 Scoped Storage 新特性中,外部存储空间被分为两部分:

● 公共目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones 等

公共目录下的文件在 APP 卸载后,不会删除。

APP 可以通过 SAF(System Access Framework)、MediaStore 接口访问其中的文件。

● App-specific 目录

APP 卸载后,数据会清除。

APP 的私密目录,APP 访问自己的 App-specific 目录时无需任何权限。

融云关于 Android 10(Q)适配
之前 SDK 将媒体文件存储于 /sdcard/RongCloud/Media 中,所以在 android 10(Q) 系统上会有聊天无法使用的情况,新版本更新后,会将媒体消息存储于 :sdcard/Android/data/包名/files/ 中,以保证 sdk 功能的正常使用

用户需要做的适配工作
1.如果您是 kit 的用户,我们对融云基本消息类型进行了全面兼容,如果您自定义了媒体消息,建议您在点击自定义媒体消息时,对本地文件进行检查,如果本地文件流无法读取,调用 RongIM 的 downloadMediaMessage() 方法重新下载更新本地路径

示例代码

//1.判断小视频本地文件是否存在
if (sightMessage.getLocalPath() != null && !TextUtils.isEmpty(sightMessage.getLocalPath().toString())) {
            return FileUtils.isFileExistsWithUri(this, sightMessage.getLocalPath());
        } else {
            return false;
        }
//2.调用 downloadMediaMessage 下载文件刷新 ui
  RongIM.getInstance().downloadMediaMessage(mMessage, downloadMediaMessageCallback);

2.如果您是 lib 的用户,建议您在用户使用到媒体类型消息时,对消息体中的 localPath 进行判断检查,如果本地文件流无法正常访问,请调用 RongIMClient 的 downloadMediaMessage() 方法对媒体文件进行重新下载并更新本地路径,具体代买可参考以上代码进行具体调整

备注
文件存储路径变化

不开启 rc_q_storage_mode_enable 的各种文件保存路径
//使用sight模块录制小视频时
录制视频:sdcard/sdcard/RongCloud/Image/应用名/image/
下载音频 /sdcard/RongCloud/Media
下载视频 /sdcard/RongCloud/Media
下载文件 /sdcard/RongCloud/Media
下载 gif /sdcard/RongCloud/Media
自定义媒体文件 /sdcard/RongCloud/Media
开启 rc_q_storage_mode_enable 的各种文件保存路径
//使用sight模块录制小视频时
录制视频:sdcard/Android/data/包名/files/RongCloud/video/
下载音频:sdcard/Android/data/包名/files/RongCloud/audio/
下载视频:sdcard/Android/data/包名/files/RongCloud/video/
下载文件:sdcard/Android/data/包名/files/RongCloud/file/
下载 gif:sdcard/Android/data/包名/files/RongCloud/image/
自定义媒体文件 会根据媒体类型存储到以上目录中


app使用客服组件 需要我们自己部署后端程序吗

回复

IM即时通讯admin 回复了问题 • 1 人关注 • 1 个回复 • 134 次浏览 • 2020-12-15 11:45 • 来自相关话题

server-api请求 /push 全量推送接口,报500:内部逻辑错误

回复

WebRTCadmin 回复了问题 • 2 人关注 • 1 个回复 • 199 次浏览 • 2020-10-19 10:19 • 来自相关话题

你收到GeekOnline加油包了吗

回复

好玩创意江南孤鹜 回复了问题 • 7 人关注 • 7 个回复 • 319 次浏览 • 2020-09-08 17:35 • 来自相关话题

用三个字来形容下融云的技术社区

回复

好玩创意我是传奇 回复了问题 • 3 人关注 • 1 个回复 • 327 次浏览 • 2020-07-28 12:10 • 来自相关话题

融云的主要业务是什么

回复

IM即时通讯 回复了问题 • 3 人关注 • 1 个回复 • 203 次浏览 • 2020-06-17 18:53 • 来自相关话题

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

GeekOnline编程挑战赛梅川酷子 发表了文章 • 0 个评论 • 464 次浏览 • 2020-12-02 18:40 • 来自相关话题

内容整理自Geek Online 2020 编程挑战赛群答疑内容,关于大赛请点击Geek Online 2020 编程挑战赛了解详情。如果您有IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论。问题 1: 下载SDK如何选择?各大版本有什么区别?问题 1... ...查看全部

内容整理自Geek Online 2020 编程挑战赛群答疑内容,关于大赛请点击Geek Online 2020 编程挑战赛了解详情。如果您有IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论。

问题 1: 下载SDK如何选择?各大版本有什么区别?

问题 1 答案:使用最新版本 4.0 SDK ,新版 SDK 包含很多新功能并且会将历史版本遗留 Bug 进行修复,所以极力推荐使用新版 SDK 4.0+ 集成开发,下载地址:https://www.rongcloud.cn/downloads

问题 2 :开发环境和生产环境有什么区别?

问题 2 答案:  开发环境功能免费使用,但用户数有 100 个限制,生产环境无用户数限制,但需要付费,咱们的参赛同学使用开发环境集成就好

问题 3 :参赛过程中开发产生的费用怎么办?(注:本条仅限于参赛期间选手的参赛作品)

问题 3 答案:开发环境功能均可免费体验,遇到特殊情况可在战队群里向融云同学处理

问题 4 :小程序开发有什么注意事项?

问题 4 答案:

 (1)需要在开发者后台小程序中开通,开通 30 分钟后生效

 (2)小程序发布上线需要优先设置合法域名:https://docs.rongcloud.cn/v4/views/rtc/call/noui/quick/mini.html

 (3)小程序特殊分类需要证书,例如社交小程序需要 ICP 证书,所以大家选择小程序分类时要提前注意是否需要证书

问题 5: 融云支持哪些平台?

问题 5 答案:支持 iOS、Android、Web、Flutter、uniapp、Electron,如果有 IoT 需求可以私信融云同学

问题 6:  如果遇到集成文档问题,怎么办?(也可以在本篇文章留言回复)

问题 6 答案:可直接在战队群里反馈至融云同学,欢迎大家对文档的改进提出宝贵建议,感谢

问题7:ios没上线 push怎么做?

问题7答案:在融云开发者后台 -> 应用 -> 开发环境可以设置

微信图片_20201202183130.png


问题8:融云的RTC集成必须要集成IM?

问题8答案:RTC SDK 依赖于 IM SDK,一定要连接 IM 后再进行 RTC 相关的集成

问题9:融云新版SDK4.0版本和2.0版本对比有哪些升级?具体有哪些优化和提升?

问题9答案:4.0 SDK 是融云基于近几年的经验积累和沉淀进行的重构版,包含对架构、连接、重连、弱网等使用场景做了特殊优化,除核心能力优化外 4.0 SDK 还在持续发布新功能,例如:聊天室 KV 存储、会话置顶免打扰等

问题10:我想问一下,rongrtc的storage改动如何监听似乎rongclient设置接受到消息的onreceived回调不会触发。而改动storage 时是有设置第三个消息参数的,Sdk的debug会打印storage_set的,可以拦截不?

问题10答案:如果设置了第三个参数,会触发接收方的 RongRTC 实例的 Message received 监听

问题11:融云有没有小程序版的IM集成SDK?

问题11答案:有的,开发者后台开通小程序后可以直接下载小程序 IM SDK,开通位置:https://developer.rongcloud.cn/miniprogram/index/

问题12:弱弱的问一句,融云可否实现微信群机器人?现在微商盛行,想用融云做个自动问答的机器人客服 」

问题12答案:可以的,融云支持将消息路由的能力,消息路由到自己服务器后可以对接三方图文识别厂商

问题13:融云有内嵌到app的H5版本客服机器人吗?

问题14:不单独提供客服的,但 IM SDK 支持 H5 的

感谢各位选手的参与,Geek Online 2020 编程挑战赛 完美收官,关于大赛:

 Geek Online 2020 编程挑战赛官网

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

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

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


关于IM/RTC开发,融云开发文档建议等技术问题欢迎留言讨论

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

IM即时通讯柠檬^ 发表了文章 • 0 个评论 • 47 次浏览 • 2021-02-24 19:30 • 来自相关话题

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 即可;


融云 SDK 5.0.0 功能迭代

IM即时通讯融云技术团队 发表了文章 • 0 个评论 • 116 次浏览 • 2021-01-29 16:07 • 来自相关话题

融云 SDK 发布了 5.0 Dev 版本,在持续迭代新功能的同时,此版本对 IMKit SDK 进⾏了重构优化并且对外开源,SDK 初始化速度更快,同时减少了不必要的内存占⽤,针对 Android 库⽂件引⼊了加固技术,提升 App 安全性,详细如下:新增功... ...查看全部

融云 SDK 发布了 5.0 Dev 版本,在持续迭代新功能的同时,此版本对 IMKit SDK 进⾏了重构优化并且对外开源,SDK 初始化速度更快,同时减少了不必要的内存占⽤,针对 Android 库⽂件引⼊了加固技术,提升 App 安全性,详细如下:

新增功能

1.⾃定义多语⾔推送⽂案

功能描述:
根据⽬标⽤户设置的语⾔环境,从推送模板中选择对应语⾔的内容进⾏远程推送。

应用场景:
应⽤中存在多个国家的终端⽤户,在发送系统升级、运营活动类的通知时,需要给不同语⾔环境的⽤户推送不同的运营内容,可使⽤此功能设置多语⾔推送⽂案,增强运营效果,提升⽤户使⽤体验。

使用方式:
通过融云开发者后台,设置⾃定义推送模板,创建模板 ID。
终端⽤户通过 SDK 中 setPushLanguageCode 接⼝上报⽤户的语⾔环境。
SDK 或 Server API 发送消息时,携带后台创建的模板 ID(templateId),如⽬标⽤户未在线时,融云服务端会⾃动根据⽬标⽤户的语⾔环境选择对应的语⾔内容进⾏推送。


1.png

2.静默撤回消息功能

需要撤回⼀条消息,⼜不希望通知对⽅时,可以在撤回消息时设置 isDisableNotification 属性,设置后⽬标⽤户不会收到撤回消息时的通知栏提醒,⽀持通过 SDK 或 Server API 撤回消息时进⾏设置。

功能优化


  • 对 IMKit SDK 进⾏了代码重构并且开源,提升了 UI 品质及⽤户体验,解决了开发者在⽼版 IMKit 中某些 UI ⾃定义需求不能满⾜的问题。
  • 从 5.0 版本开始 Android IMKit SDK 使⽤ AndroidX 库实现,Google ⾃ support v7:28 开始,⼤部分 support 包都迁移到 AndroidX 下,建议开发者们尽早将项⽬转移到 AndroidX 下。
  • iOS IMLib 通讯能⼒库使⽤动态库技术,减少了不必要的内存占⽤,使 SDK 内存占⽤更⼩。
  • 对 SDK 整体性能进⾏优化,SDK 初始化速度更快,耗电更少。
  • Android SDK 引⼊了 Android 库⽂件加固技术,提升 App 安全性。
  • Android SDK 对 Android 11 系统进⾏了兼容适配。
  • 修复了 RTC SDK 的部分 BUG。

详细内容请查看官⽹版本更新描述:
IM 版本更新描述
音视频版本更新描述

融云自定义消息不显示

IM即时通讯徐凤年 发表了文章 • 0 个评论 • 127 次浏览 • 2021-01-11 15:14 • 来自相关话题

项目用的融云,IMKit SDK(自带 UI),但是出现一个问题,就是自定义消息在会话页面刚收到的时候能显示,但是退出会话页面再进入就不显示了。非常的纳闷啊。查询了存储策略,编解码方法,都没有问题。后来提交工单,技术人员给了反馈才发现自己把消息的注册放到了初始... ...查看全部

项目用的融云,IMKit SDK(自带 UI),但是出现一个问题,就是自定义消息在会话页面刚收到的时候能显示,但是退出会话页面再进入就不显示了。非常的纳闷啊。查询了存储策略,编解码方法,都没有问题。后来提交工单,技术人员给了反馈才发现自己把消息的注册放到了初始化 appkey 前边,然后人家融云写的很明确:使用融云SDK所有功能(包括显示SDK中或者继承于SDK的View)之前,您必须先调用此方法初始化 SDK。可见认真查看文档接口注释的重要性!!

/*!
 初始化融云SDK

 @param appKey  从融云开发者平台创建应用后获取到的App Key

 @discussion 您在使用融云SDK所有功能(包括显示SDK中或者继承于SDK的View)之前,您必须先调用此方法初始化SDK。
 在App整个生命周期中,您只需要执行一次初始化。

 @warning 如果您使用IMKit,请使用此方法初始化SDK;
 如果您使用IMLib,请使用RCIMClient中的同名方法初始化,而不要使用此方法。
 */
- (void)initWithAppKey:(NSString *)appKey;

融云(www.rongcloud.cn)

融云 SDK 如何实现群组操作

IM即时通讯柠檬^ 发表了文章 • 0 个评论 • 233 次浏览 • 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


融云 IM SDK 发送语音消息

IM即时通讯苏道 发表了文章 • 0 个评论 • 271 次浏览 • 2021-01-05 16:04 • 来自相关话题

由于公司既有移动端又有 web 端,所以在语音消息这遇到了些小问题。解决的过程最近整理了下也分享给大家作为参考。遇到问题web 端发送语音的问题。移动端发送来的 VoiceMessage 在 web 端不知道如何处理。解决办法问题一 融云只负责发消息,不提供录... ...查看全部

由于公司既有移动端又有 web 端,所以在语音消息这遇到了些小问题。解决的过程最近整理了下也分享给大家作为参考。

遇到问题

  1. web 端发送语音的问题。

  2. 移动端发送来的 VoiceMessage 在 web 端不知道如何处理。

解决办法

  1. 问题一 融云只负责发消息,不提供录制。

所以这边自己找了些录制的插件,这里参考了一个小示例https://blog.csdn.net/qq_37310318/article/details/88312013
拿到后改了改实现了音频录制,修改了上传的逻辑,上传逻辑使用的融云的上传插件,参考的文档 https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#FileMsg

  1. 移动端同事说他们用的是融云的 IMKit,于是提工单问了下,融云的同事给解决办法。

Android 枚举类型

/**
* 语音消息类型
*/
public enum VoiceMessageType {
  /**
    * 普通音质语音消息
    */
  Ordinary,
  /**
    * 高音质语音消息
    */
  HighQuality
}

Android

RongIM.getInstance().setVoiceMessageType(RongIM.VoiceMessageType.HighQuality);

iOS

[RCIMClient sharedRCIMClient].voiceMsgType = RCVoiceMessageTypeHighQuality;

把上上述方法在初始化 init 时设置下即可发送高清语音消息。完美解决。

实现中参考的文献:
web 实现语音录制:https://blog.csdn.net/qq_37310318/article/details/88312013

融云文档:https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#FileMsg

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


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

IM即时通讯苏道 发表了文章 • 0 个评论 • 266 次浏览 • 2021-01-05 14:37 • 来自相关话题

背景在集成融云的即时通讯时,产品脑门一拍说:咋们要实现一个功能,不管是 Web 端还是移动端登入,必须只能一个端登入成功并且后登入成功的账号需要踢掉前面登入的账号。咋的一听感觉还蛮简单的,融云不是有一个服务嘛:叫做多设备消息同步,我把该服务关掉不就行了~~ O... ...查看全部

背景

在集成融云的即时通讯时,产品脑门一拍说:咋们要实现一个功能,不管是 Web 端还是移动端登入,必须只能一个端登入成功并且后登入成功的账号需要踢掉前面登入的账号

咋的一听感觉还蛮简单的,融云不是有一个服务嘛:叫做多设备消息同步,我把该服务关掉不就行了~~ O(∩_∩)O哈哈~

但是……. ┭┮﹏┭┮
是我想的太简单了,服务关掉之后 Web 端的确可以进行互踢了,但是移动端和 Web 端还是可以在线呀,原来默认的情况下,融云仅支持 1 个 Web 端、1 个 桌面端、1 个移动端同时在线

这个是融云多端同时在线详情:https://docs.rongcloud.cn/v4/views/im/noui/guide/group/connection/multiclient/

话不多说,开始揭开谜底

1、首先将多设备消息同步 - 关闭,关闭连接:https://developer.rongcloud.cn/advance/index/YTrydqMSdEsmBtX2zX0Amg

2、这时如果多端登入状态监听会监听到状态码 6 时,执行断开链接

代码示例

im.watch({
  conversation: function(event){
    var updatedConversationList = event.updatedConversationList; // 更新的会话列表
    console.log('更新会话汇总:', updatedConversationList);
    console.log('最新会话列表:', im.Conversation.merge({
        conversationList,
        updatedConversationList
      }));
  },
  message: function(event){
    var message = event.message;
    console.log('收到新消息:', message);
  },
  status: function(event){
     console.log('连接状态码:', status);
     var status = event.status;
     if(status == 6){
       im.disconnect().then(function() {
        console.log('断开链接成功');
       });
     }
  }
});

3、通过发送自定义消息,来执行断开连接方法

比如您有两个设备 A,B,用户开始在 A 设备登入,然后再 B 设备登入成功后给自己或者给别人发一条自定义消息,A 设备在监听中根据该自定义消息判断,调用断开连接方法,即可做到只有一个设备登入

//发送自定义消息
var conversation = im.Conversation.get({
  targetId: '接收方的 userId',
  type: RongIMLib.CONVERSATION_TYPE.PRIVATE
});
conversation.send({
  messageType: 's:person', // 填写开发者定义的 messageType
  content: { // 填写开发者定义的消息内容
    name: 'RongCloud',
    age: 12
  },
  isPersited: true,// 是否存储在服务端,默认为 true
  isCounted: true  // 是否计数. 计数消息接收端接收后未读数加 1,默认为 true
}).then(function(message){
  console.log('发送 s:person 消息成功', message);
});

通过上面的步骤,就可以实现只能单设备登入了,但是需要注意您使用的 SDK 版本,一开始我用 3.0.5 SDK 来做,但是有一个问题:执行断开连接还是会进行重连,所以要使用 SDK 3.0.6 版本以上的 SDK 哦

集成融云 IM 问题总结

IM即时通讯苏道 发表了文章 • 0 个评论 • 270 次浏览 • 2021-01-05 14:37 • 来自相关话题

最近项目里用到了 IM 相关能力,并且之前也有了解融云,所以直接就用了,下面自己总结一些注意事项,在这些点上花了一丢丢时间,在此记录下1、融云是通过他们自己的 AppKey 来隔离不同应用之间的消息的,只有在一个 AppKey 的用户可互发消息2、连接融云的时... ...查看全部

最近项目里用到了 IM 相关能力,并且之前也有了解融云,所以直接就用了,下面自己总结一些注意事项,在这些点上花了一丢丢时间,在此记录下

1、融云是通过他们自己的 AppKey 来隔离不同应用之间的消息的,只有在一个 AppKey 的用户可互发消息

2、连接融云的时候,需要一个 Token,这个 Token 是通过融云的 Server 获取的,并且只能通过自己的 Server 调用,否则有安全问题,调试时可以用他们开发者后台提供的调试工具来获取 Token,写死在页面调试,这点很重要,就不用等后端接口了

3、历史消息默认不存,需要单独开通,这个也是看到了错误码才理解,之前一直在琢磨,咋没有最近聊过天的人列表

4、如果需要浏览器多个 Tab 同时连接,需要单独开通,打开多个浏览器,之前的 Tab 连接就断了,也许要单独开通,不过开发环境免费,可以随便造,哈哈

5、A 给 B 发消息,只需要知道 B 的 Id 就可以发了,B 再上线就可以收到,模拟两个发消息,可以打开两个浏览器分别模拟 A 和 B 发送和接收消息

6、A 给 B 发送消息,A 的 targetId 是 B,B 的 targetId 是 A,消息的发送人是 A,这个逻辑有点绕,简单理解为 A 的 targetId 是 B,B 的 targetId 是 A,消息的发送人 Id 不变,我滴妈呀,有点像饶舌,来哼起来 哈哈哈~

完毕,虽然没啥逻辑,记录下,好记性不如烂笔头,以免后续再用~

有需要可以去官方查看更多内容:

官网主页:https://www.rongcloud.cn

文档主页:https://docs.rongcloud.cn/v4


融云 Web 播放声音(AMR 、WAVE)

IM即时通讯赵炳东 发表了文章 • 0 个评论 • 29 次浏览 • 2021-01-05 11:50 • 来自相关话题

最近甚是苦闷,做语音播放降级,跳进了很多坑,别提有多惨了,不过结果还是不错滴,纵观前后,一句话足以概括 “痛并快乐着” ~~~ok,我少说废话,下面来总结下 Web 播放声音一些注意事项。说到 Web 我第一件事想起的就是浏览器兼容性,播放声音当然也难逃苦海,... ...查看全部

最近甚是苦闷,做语音播放降级,跳进了很多坑,别提有多惨了,不过结果还是不错滴,纵观前后,一句话足以概括 “痛并快乐着” ~~~

ok,我少说废话,下面来总结下 Web 播放声音一些注意事项。

说到 Web 我第一件事想起的就是浏览器兼容性,播放声音当然也难逃苦海,需要注意以 Trident 为内核 (IE为主) 的浏览器,和 FF、Chrome等浏览器的区别。

1、技术准备

① FF、Chrome等支持


② IE 浏览器下不支持(IE9以下


2、详细说明

为避免文章过于冗长,针对以上两种情况分别总结:

① 使用 AMR (Audio) 播放 : http://www.cnblogs.com/yuhongda0315/p/5224188.html

② 使用 Flash 播放 :http://www.cnblogs.com/yuhongda0315/p/5224450.html

3、资料下载

ActionScript : player-as3源码.rar

完整的demo : amrPlayer-jsdemo.rar

ActionScript 播放 Wave 文件 :wavePlayer-as3源码.rar

所需要的JS(amr.js 在 libamr-min.js 最下方):所需JS.rar

原始文章连接:https://www.cnblogs.com/yuhongda0315/p/5224064.html

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

融云文档:https://docs.rongcloud.cn/v4


融云 IM 那些事儿

IM即时通讯苏道 发表了文章 • 0 个评论 • 267 次浏览 • 2021-01-05 10:55 • 来自相关话题

最近闲来无事在网上冲浪,看到关注公众号推送了一篇 《Zoom大火之后,这家国内公司也很值得关注啊》 的文章,看样子八成是融云的运营稿(融云的朋友看到别打我…),不过不重要,重要的因为这篇文章确实让我对 IM 和 RTC 提起了浓厚的兴趣,因为疫情期间还没有离职... ...查看全部

最近闲来无事在网上冲浪,看到关注公众号推送了一篇 《Zoom大火之后,这家国内公司也很值得关注啊》 的文章,看样子八成是融云的

运营稿(融云的朋友看到别打我…),不过不重要,重要的因为这篇文章确实让我对 IM 和 RTC 提起了浓厚的兴趣,因为疫情期间还没有离职

公司每天都用 Zoom,后来 Zoom 这家伙宣布停止对中国提供服务后,鬼知道老板是为了彰显爱国主义情节还是怕服务不稳定,老板果断切换为腾讯会议

离职后虽然用的少了,但偶尔开个会啥的,也会用腾讯会议或者微信的音视频进行和伙伴进行线上沟通,这么说来接触音视频 Saas 也有一段时间了

但对底层如何实现的通话一无所知,你知道的,作为一个有追求的码农,知其然必知其所以然,正赶上看了前面提到的文章,于是马上动手开始研究融云的

IM 和 RTC,先从 IM 开始说起~

我是从以下几步分别了解:官网开发者后台开发文档

官网

从官网得到了以下个信息:

产品分类

1、IM + RTC: 之前在公司听同事说过融云做 IM,不知道啥时候也做了 RTC ,还挺有意思,不知道具体原因,个人理解也许 IM 的天花板比较低或者变现难,并且音视频在未来网络基础设置越来越好、流量越来越廉价、5G 的到来等种种因素,音视频还是很有前景的,才杀入 RTC 战场,分一杯羹

2、支持平台: Android、iOS、Web、小程序、Electron、Flutter 主流平台都支持

支持四种部署方式

1、公有云: 大家公用一个盘子,有点过去大通铺的赶脚,我要是胖我睡的面积就大,当然了我要是胖可能还挤到你,可能会有资源抢占的情况,不过这要看融云的预留冗余资源了

2、专有云: 相比大通铺,这个就高级多了,类似单间,空间、卫浴均为独立,并且私密性比较好

3、海外云: 海外大通铺,在线咨询了下,海外用户也能直接用国内数据中心,估计他们自己的网络链路,具体原因没有再细问,毕竟暂时也不用,不太好意思,我是一个腼腆的人儿

4、私有云: 相比单间,这就是自己盖房子了,融云提供设计图,并且找施工队给你单独盖一个琉璃大瓦房,但后续怎么维护没看到说明,有可能和通用外包的维护费用类似,比如:每年维护费是合同款的 10%,费用是我自己 YY 的,不会用也没好意思去找他们人了解

目前正在搞的活动

1、黑客马拉松:印象最深的银子,第一名给五万,我是看到晚要不一定参加,这样可以弥补一点离职期间经济损失,毕竟离职前薪资也一个月 xxx 呢(一不小心差点把工资说出来,万一媳妇看见小金库可就没有了…..慌的一批,哈哈哈)

2、WICC:全名好长,全球互联网通信云大会,不和全球占点关系,都不好意说自己是互联网公司,哈哈,不过看他们也有海外节点,这么说也合理,地址不在北京,可惜去不了,要不真的可以去 see see

3、聆听:这是一个收集建议的系统包括吐槽啥的,看样子还是比较注重客户服务,在这样一个技术可快速复制的时代,也许客户服务等软技能还是挺重要的,尤其是 ToB 企业

其他

1、其他的都是一些案例介绍,这些东各家公司如出一辙,秀秀肌肉、吹吹牛啥的,就没多看,目前我不关注这块

开发者后台

功能丰富

进入后台第一眼真的是功能丰富,看出来确实是积累了很多功能,不过产品逻辑不是很好,有点无从下手,研究了一会理解了

调试工具

调试工具点个赞,把所有服务端的接口都做了可在线调试的 API,如果集成初期没有自己 Server 接口,完全可以用这个来集成,非常方便,很惊喜

小槽点

开发者后台的界面略丑,看起来有点像智能手机和老人机的排版布局差异,虽说不影响使用吧,但作为一个有追求的青年咋能对美不挑剔呢,不对,应该少年,不对不对,是青少年,文章暂停下,我先倒腾下措辞….(两个小时后,是少年,我还是从前那个少年,没有一丝丝改变…..)

开发文档

文档分类倒是简单,IM、RTC、运营服务, 下面逐个介绍下感受

1、IM: 不愧是做 IM 起家的 Paas 厂商,支持的能力确实很出色,尤其聊天室的功能格外丰富,在线和客服妹子聊说人数无上限,支持弹性扩所容

2、RTC: 看完文档就能知道在音视频沉淀还有不够,为啥这么说,在文档投入精力一定不够,或者资源在忙于其他更重要的事情未开始规划,后台看了看发布的第一版音视频 SDK,是在去年三月份,和感觉还比较像,瞬间觉得自己像老司机一样,哈哈

3、粗略过了一遍文档,体验了下官方 Demo SealRTC,音视频质量相当不错,晚上纽约的老铁视频用的就是这个东东,非常流畅,好感度暴涨

————华丽的人肉分割线————-

整体感觉就这些,这里没有涉及技术集成,后面再集成试试,写完感觉像给融云写了一篇产品介绍的稿子,不知道融云的朋友看到会不会给我发稿费 哈哈

就写到这里了吧,太阳快出来了,睡觉~~~

另外赠从下融云相关链接

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

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


融云开发交流