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

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

产品要求给输入框加个Placeh,其实挺简单一功能,寻遍他们的官网https://www.rongcloud.cn/和文档https://docs.rongcloud.cn/v4/都没有找到相关资料,现实很残酷,SDK 木有这个接口,只能自己实现了,... ...查看全部

产品要求给输入框加个Placeh,其实挺简单一功能,寻遍他们的官网https://www.rongcloud.cn/和文档https://docs.rongcloud.cn/v4/都没有找到相关资料,现实很残酷,SDK 木有这个接口,只能自己实现了,思来想去,用了个笨办法,加个 UILabel 一试,还真行,有需要的您请往下看。

其实就是给输入框价格 UILabel,在该显示的时候显示,该隐藏的时候隐藏就完事儿了,代码如下:

  1. 在聊天页面添加一个 UILabel 属性

@property(nonatomic, strong) UILabel *placeholderLabel;
  1. 初始化并添加 placeholderLabel 对象

- (void)configPlaceholder {    
    //初始化和设置    
    self.placeholderLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 180, 20)];
    [self.chatSessionInputBarControl.inputTextView addSubview:self.placeholderLabel];
    self.placeholderLabel.text = @"测试 Placeholder";    
    self.placeholderLabel.textColor = [UIColor grayColor];    
    self.placeholderLabel.userInteractionEnabled = YES;    
    //添加点击手势    
    UITapGestureRecognizer *tapLabel = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapPlaceholderLabel)];    
    [self.placeholderLabel addGestureRecognizer:tapLabel];
}
- (void)tapPlaceholderLabel {    
    [self.chatSessionInputBarControl updateStatus:KBottomBarKeyboardStatus animated:YES];
}
  1. 在内容发生变化和点击发送后,设置 placeholder 效果的显示

- (void)inputTextView:(UITextView *)inputTextView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {    
    //在内容发生变化和点击发送后,设置 placeholder 效果的显示    
    if ((range.location == 0 && [text isEqualToString:@""]) || [text isEqualToString:@"
"]) {        
        self.placeholderLabel.hidden = NO;    
        } else {        
        self.placeholderLabel.hidden = YES;    
        }
}
  1. 还要提一下,融云的 SDK 有撤回消息以后的“重新编辑”功能,在这个时候,要关闭 placeholder 效果的显示

- (void)didTapReedit:(RCMessageModel *)model {    
    self.placeholderLabel.hidden = YES;    
    [super didTapReedit:model];
}

到这儿功能就完成了,placeholderLabel 的具体文字效果可以自行修改调整,希望上面的代码可以帮到你,喜欢的话,点个赞吧。

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

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

背景我们在设计聊天类 APP 都会有一套完整的用户信息存储机制,用来保存我们的通讯录列表,以及每个用户的头像、昵称、姓名、等等一系列的用户信息,防止我们过多的进行服务器请求,对用户体验很差。这篇文章就简单的给大家创建一套用户信息机制来提供一个简单的思路。场景如... ...查看全部

背景

我们在设计聊天类 APP 都会有一套完整的用户信息存储机制,用来保存我们的通讯录列表,以及每个用户的头像、昵称、姓名、等等一系列的用户信息,防止我们过多的进行服务器请求,对用户体验很差。这篇文章就简单的给大家创建一套用户信息机制来提供一个简单的思路。

场景如下:
目前我们集成了融云的 IMLib SDK , 融云 IMLib SDK 仅提供了消息数据的存储与查询。用户信息和 UI 界面需要我们自己来维护,而融云的 IMKit 虽然提供了用户信息的管理,但是部分 UI 还是和我们产品设计不符的,那么如何设计一套类似于 IMKit 的用户信息管理机制,就是我们面临的问题。

融云SDK:
https://docs.rongcloud.cn/v4/

思考

我们在实现这套机制的时候都需要哪些内容?

  1. 首先我们要进行存储,存储那就需要维护一个数据库。参考融云 IMKit 发现有下面一个配置

/*!
 是否将用户信息和群组信息在本地持久化存储,默认值为NO
 @discussion
 如果设置为NO,则SDK在需要显示用户信息时,会调用用户信息提供者获取用户信息并缓存到Cache,此Cache在App生命周期结束时会被移除,下次启动时会再次通过用户信息提供者获取信息。
 如果设置为YES,则会将获取到的用户信息持久化存储在本地,App下次启动时Cache会仍然有效。
 */
@property (nonatomic, assign) BOOL enablePersistentUserInfoCache;

经过测试以及融云专业技术人员的回答,发现这个配置起到的作用就是本次的用户信息是否会进行数据库存储。

这里的数据库存储是指当此配置生效时,会在本地进行数据库文件的创建。而不生效的时候,是不创建的。如果不创建的话还需要存储的话,那应该就是存储到内存了。 而我们是需要每次登陆都有一些用户信息的,那不需要使用内存了,需要我们进行数据库存储,所以我们需要准备一个 db 的管理类,处理所有的数据库操作。

实现

以 融云 SDK 为例,以一个用户的 userinfo 为例大体来绘制一下整个流程图。

首先整理一些各个类的用处,大体内容如下:

UserInfoDBHelper: 数据库管理

#import <Foundation/Foundation.h>
#import "UserInfo.h"
NS_ASSUME_NONNULL_BEGIN
@interface UserInfoDBHelper : NSObject
- (void)createDB;
- (UserInfo *)getUserInf(NSString *)userId;
- (void)refreshUserInf(UserInfo *)userInfo;
@end
NS_ASSUME_NONNULL_END

UserInf 用户信息模型

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UserInfo : NSObject
/**
 id
 name
 url
 */
@end
NS_ASSUME_NONNULL_END


UserInfoCache: 用户信息读取类

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface UserInfoCache : NSObject
- (UserInfo *)getUserInf(NSString *)userId;
- (void)refreshUserInf(UserInfo *)userInfo;
@end
NS_ASSUME_NONNULL_END

UserInfoManager: 对外入口

#import <Foundation/Foundation.h>
#import "UserInfo.h"
NS_ASSUME_NONNULL_BEGIN
@protocol UserInfoDelegate <NSObject>
- (void)getServerUserInf(NSString *)userid;
@end
@interface UserInfoManager : NSObject
@property (nonatomic, weak) id<UserInfoDelegate> delegate;
- (UserInfo *)getUserInf(NSString *)userid;
- (void)refreshUserInf(UserInfo *)userInfo;
@end
NS_ASSUME_NONNULL_END

此处提供了一个简单的流程图,供大家参考

image.png

解析:

  1. 首先用户登录,

  2. 绘制 UI,同时根据用户的 id 来调用 manager.getuserinfo。

  3. manager 会调用用户的 cache 类来获取 db 内的用户信息。

  4. 在 cache 调用的时候如果你进行了内存缓存则先在内存缓存中进行查找,然后调用 db.get 进行查找

  5. db 在首次使用的时候会进行数据库文件检查,不存在则创建并直接用户信息返回空。然后调用
    manager 的 delegate 获取用户信息,再拿到用户信息后发送通知来刷新 UI。
    6.如果已创建的直接调用 db 的 get。然后刷新 UI。

整体先只提供了一个思路,具体里面的一些内部优化还需实践。

可能用到的技术点:

  1. SQL 的使用

  2. 单例类的使用

  3. GCD 队列

  4. 通知

  5. 代理

  6. 如果使用内存缓存的话还需要保证线程安全。

整体的一个简单思路就是上面供大家参考,待我写完再分享整体代码给大家。


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

IM即时通讯dht1212 发表了文章 • 0 个评论 • 234 次浏览 • 2021-01-08 11:13 • 来自相关话题

升级 Xcode12 后,模拟器都是 iOS14 了,运行自己的项目,到了聊天页面就崩溃,具体崩溃信息为Thread 1: “-[_UIPageControlIndicatorContentView setImage:]: unrecognized selec... ...查看全部

升级 Xcode12 后,模拟器都是 iOS14 了,运行自己的项目,到了聊天页面就崩溃,具体崩溃信息为Thread 1: “-[_UIPageControlIndicatorContentView setImage:]: unrecognized selector sent to instance。

从崩溃看,猜测是因为缺少了某个方法导致了崩溃,提了个工单给融云,他们的技术支持服务还是挺到位的,很快给了答复,他们对这个问题已经做了及时处理(其实他们已经发了站内信和邮件,自己没注意),更新了官网下载和 pod 上的 SDK,卸载现有 SDK,重新下载 2.10.4 以上版本 SDK 就可以了。

并且这个崩溃只针对使用 imkit的,使用 imlib 的用户没事儿,下面是他们在工单里面回复的具体内容:

通过 Xcode 12 打包 App,在 iOS 14 版本中我司发现 2.x 、4.0.0 、4.0.0.1 版本的 IMKit SDK 与 iOS 14 出现了兼容问题,该问题会引起 App 崩溃,针对该问题进行了紧急的修复
您可以在如下版本获得修改后的 SDK 版本:
1、iOS IMKit SDK 版本为 4.0.0 和 4.0.0.1 的客户务必升级至 4.0.1+ 版本。
2、iOS IMKit SDK 版本为 2.x 客户务必升级至 2.10.6-DEV 或者 2.10.4-Stable( 9 月 18 日发布的版本),这两个版本已针对该问题进行了修复
(1)请务必于 2020 年 9 月 18 日以后重新下载获取 SDK,更新您的 App,下载地址:https://www.rongcloud.cn/downloads/history/ios
(2)使用 Pod 集成的客户,请参考文档先清理 Pod 缓存,文档地址:https://docs.rongcloud.cn/v4/views/im/ui/guide/private/setting/include/ios.html#cocoapods-clean
3、基于 iOS IMLib SDK 集成的客户不受影响。


小吐槽一下,这个崩溃问题虽然发了站内信和邮件,但还是不太容易一起注意,如果能在下面的官网或文档里面有个弹窗或浮动提示就更好了

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


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

IM即时通讯dht1212 发表了文章 • 0 个评论 • 242 次浏览 • 2021-01-08 11:13 • 来自相关话题

最近公司要做一个社交 app,对于时间就是金钱的当今社会,招聘大量人才去搭建通讯系统肯定是不划算的,花费人力物力财力做出来的 app,可能还没人用。那就瞎了。所以毋庸置疑,一拍即合,用第三方的。就开始了对于目前市面上主流的第三方 IM SDK 进行调研。其中有... ...查看全部

最近公司要做一个社交 app,对于时间就是金钱的当今社会,招聘大量人才去搭建通讯系统肯定是不划算的,花费人力物力财力做出来的 app,可能还没人用。那就瞎了。所以毋庸置疑,一拍即合,用第三方的。就开始了对于目前市面上主流的第三方 IM SDK 进行调研。其中有腾讯云,网易云信,融云,环信等。列出了一堆对比条件,最后领导拍板用哪个。末端程序员是没有选择权的。好好搬砖就可以了~要明白自己的身份,嘎嘎

过程不说了,最后选择了用融云,废话不多说,直接勒~这里只介绍一下如何快速集成,让俩人聊起来,这也算是一个里程碑啊。对于程序员来说,聊不起来可就毁了,领导都特么奶凶奶凶的~~~

1.先到融云官网 (https://www.rongcloud.cn/) 进行注册(注册按钮自己找吧),这个可以让你们产品经理或者啥领导去做,可以用公司的邮箱,别用自己的吧,后期自己换了地儿,对公司也是损失不是。注册后添加应用,拿到 appkey

2.xcode 创建一个新工程,或者找自己公司的项目,这里我推荐使用 pod 方式管理第三方,方便快捷,省时省力。因为手动方式太落后了,且配置繁琐,稍有遗漏就会报错,有些报错排查起来费时费力费心费电,所以还是老老实实的用 pod 吧。不听老人言,吃亏在眼前,听哥的没错,融云文档写了如何用 pod,几行命令的事。弄完后,也就是把 SDK 集成好了,跑一下工程,如果不报错,祝贺你兄嘚,马上可以聊天了,看下一步

3.需要在 appDelegate 中导入头文件。#import 。对了,我们用的是带界面的 SDK,快速集成不费事。


4.初始化 SDK

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    //下边引号内需要替换为你的 appkey,别特么原封不动的抄哈,嘎嘎
    [[RCIM sharedRCIM] initWithAppKey:@"融云开发者后台的 AppKey"];
    return YES;
}

5.这一步该连接融云了兄嘚

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [[RCIM sharedRCIM] initWithAppKey:@"获取到的 AppKey"];
    [[RCIM sharedRCIM] connectWithToken:@"开发者的 server 通过请求 server api 获取到的 token 值"
                           dbOpened:^(RCDBErrorCode code) {}
                            success:^(NSString *userId) {}
                              error:^(RCConnectErrorCode status) {}];
    return YES;
}

敲黑板1:在这我得多说你几句,必须要看成功回调和失败回调的调用,进了 success 就是成功了,进了 error 就是错误了。错误了你要看 status 状态码啊,根据错误码来找问题。我在调试过程中就遇到了 RC_CONN_TOKEN_INCORRECT 错误码,顾名思义:token 不正确。这个就要找自己的服务端人员看是哪里问题导致的 token 不正确了。

敲黑板1:还有 @”开发者的 server 通过请求 server api 获取到的 token 值”,这个 token,在刚开始测试的时候,你们的服务端可能还没集成,所以可以先到融云开发者后台“服务管理” - “API 调用” - “用户服务” - “获取 Token” 那里,随便输入一个 userId,name,portraitUri,就可得到 token 了。用这个 token 去连接即可,省时省力。

6.至此,恭喜你啊,已经连接融云成功了。下一步就是该琢磨如何找人聊天了。

7.聊天,需要俩人,对吧,现在连接的用户为之一,另一个需要再去融云开发者后台申请一个 token,记住他的 userId,发消息是需要 userId 的。然后创建个按钮,点击事件写如下代码即可,跳转之后,就能聊天了。然后再跑一个模拟器或者真机,用后申请的 token 登陆,俩人就能互相对话了。

RCConversationViewController *chatViewController = 
[[RCConversationViewController alloc] 
initWithConversationType:ConversationType_PRIVATE targetId:"后申请 token 时填写的 userId"];
[self.navigationController pushViewController:chatViewController animated:YES];


简单介绍融云 imkit 包含功能

IM即时通讯dht1212 发表了文章 • 0 个评论 • 237 次浏览 • 2021-01-08 11:13 • 来自相关话题

说明本篇文章简单介绍一下融云 imkit 包含的功能,大家可在阅读之后来对大体内容有一个基础的了解。详细内容还请翻阅 官方文档基本内容融云 imkit 是为了方便开发者快速集成而开发的一套 UI 库,里面主要包含三部分内容:用户信息会话列表会话页面用... ...查看全部

说明

本篇文章简单介绍一下融云 imkit 包含的功能,大家可在阅读之后来对大体内容有一个基础的了解。详细内容还请翻阅 官方文档

基本内容

融云 imkit 是为了方便开发者快速集成而开发的一套 UI 库,里面主要包含三部分内容:

  • 用户信息

  • 会话列表

  • 会话页面

image.png

用户信息

image.png

用户信息是指融云 SDK 提供了一套完整的用户信息的显示与存储机制,里面包含了用户信息、群信息、群名片信息,开发者仅仅需要将自己 App Server 内的用户信息包装成一个融云的特有的用户信息对象,然后传递给对应的接口即可。之后融云 SDK 会自己帮助显示对应用户的用户信息,并存储在本地数据库,方便后续的读取。

大体的显示流程可参考官方的流程图:

image.png

会话列表

image.png

会话列表是融云 SDK 根据消息生成的一个 list

当收到一条新消息并且会话列表没有当前会话的时候,SDK 会自动生成一条新的会话数据,并添加到 tableview 中。

需要注意的是融云的会话列表不会存储在服务器中,只在本地存储。当切换设备时,需要去融云开发者后台开通多设备同步,这样在新设备登录的时候,会触发融云的消息补偿,当移动端接收到消息的时候,会在新设备也生成一个新的会话列表。正常情况就是你设置几天就补偿几天。

支持的功能有:

  • 会话置顶

  • 会话删除

  • 会话免打扰

  • 已读回执显示

  • 有人@显示

会话页面

image.png

融云的会话页面整体可分为两部分

  • 消息展示区

  • 输入框

消息展示

消息展示就是当前用户收发消息展示的地方,和常规 APP 一样,接收在左边,发送在右边。发送方是不显示昵称的,接收方可根据配置来选择是否显示昵称。

SDK 自带的消息展示有

  • 文本消息

  • 语音消息

  • 图片消息

  • GIF 消息

  • 视频消息

  • 位置消息

  • 文件消息

  • 小灰条消息

开发者还能根据自己的需求来自定义其他消息,自定义消息有两种用法:

  1. 发送其他需要展示的消息,对应绑定一套 UI 组件,收到消息后,融云SDK 帮助你把绑定的这套 UI 展示到界面上。

  2. 当做控制消息:控制消息就是你不展示到界面上,但是你可以利用消息机制来做处理,从服务器或者其他地方下发一个指令,收到这个消息后,UI不会发生任何变化。但你可以根据这条消息来处理你的业务操作。比如刷新某个页面,获取某个信息等等

开发者可以继承融云的会话页面,在其子类来进行其他操作,在进入会话页面的时候,SDK 会自动拉取当前会话的历史聊天记录,这个操作会先从本地数据库获取,如果不够 10 条的话,会从服务器获取,需要开通历史消息云存储功能。(融云 SDK 会在本地搭建一套数据库,用来存储你所有的聊天内容)

在获取到历史记录之后,SDK 会自动帮你展示到 消息展示区。展示出来的消息都支持以下功能:

  • 发送出去的消息支持已读回执(单群聊)

  • 消息撤回:kit 默认为两分钟

  • 消息多选

  • 消息转发:支持合并转发

  • 消息引用

  • 消息删除

输入框

SDK 提供的输入框共分为四部分:

  • 文本输入

  • 语音输入

  • 表情

  • 扩展板

文本输入:

文本输入支持用户输入任何文本

群聊输入 @ 可触发@ 人功能

语音输入:

语音输入分为普通语音消息高清语音消息

高清语音消息是在2.9.25之后支持的。建议使用此套方案。

表情:
SDK 有一套默认的 emoji 表情,且支持表情自定义。

扩展板:

扩展板也就是 + 号区域,SDK 默认支持的功能有:

  • 音视频(需要集成 融云音视频,集成之后会自动出现)

  • 照片

  • 位置:支持位置实时共享

  • 语音输入:需要使用科大讯飞的库来做,融云提供了相关的库内容

  • 名片

  • 文件:文件消息是 SDK 下载到指定目录的文件,并非手机系统的文件。

  • 其他:自定义内容,可根据自己的业务添加其他的小内容。

此外,SDK还提供了 常用语功能,目前仅支持单聊,且字数在 30 字以内,可进行类似快捷回复之类的操作。

其他内容,后续补充。

更多详细的内容可自己阅读官网文档。


SDK 兼容 JSON

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

最近在集成融云 SDK,于是看了下融云的 SDK 源码,发现源码中有一段针对 JSON 的适配,由于针对 IE9 以下不支持 JSON 对象的处理方式,在此分享下1、优点: 除中文外的字符都会转为 Unicode 。2、缺点:JSON.parse() 使用 e... ...查看全部

最近在集成融云 SDK,于是看了下融云的 SDK 源码,发现源码中有一段针对 JSON 的适配,由于针对 IE9 以下不支持 JSON 对象的处理方式,在此分享下

1、优点: 除中文外的字符都会转为 Unicode 。

2、缺点:JSON.parse() 使用 eval 进行转换的,这个方法不是很安全,还看到人介绍用 new Function ,但是没有测试,这里暂时标记下,有空测试下。

if (!window["JSON"]) {
window["JSON"] = (function () {
    function JSON() {
    }
    JSON.parse = function (sJSON) {
        return eval('(' + sJSON + ')');
    };
    JSON.stringify = function (value) {
        return this.str("", { "": value });
    };
    JSON.str = function (key, holder) {
        var i, k, v, length, mind = "", partial, value = holder[key], me = this;
        if (value && typeof value === "object" && typeof value.toJSON === "function") {
            value = value.toJSON(key);
        }
        switch (typeof value) {
            case "string":
                return me.quote(value);
            case "number":
                return isFinite(value) ? String(value) : "null";
            case "boolean":
            case "null":
                return String(value);
            case "object":
                if (!value) {
                    return "null";
                }
                partial = [];
                if (Object.prototype.toString.apply(value) === "[object Array]") {
                    length = value.length;
                    for (i = 0; i < length; i += 1) {
                        partial[i] = me.str(i, value) || "null";
                    }
                    v = partial.length === 0 ? "[]" : "[" + partial.join(",") + "]";
                    return v;
                }
                for (k in value) {
                    if (Object.prototype.hasOwnProperty.call(value, k)) {
                        v = me.str(k, value);
                        if (v) {
                            partial.push(me.quote(k) + ":" + v);
                        }
                    }
                }
                v = partial.length === 0 ? "{}" : "{" + partial.join(",") + "}";
                return v;
        }
    };
    JSON.quote = function (string) {
        var me = this;
        me.rx_escapable.lastIndex = 0;
        return me.rx_escapable.test(string) ? '"' + string.replace(me.rx_escapable, function (a) {
            var c = me.meta[a];
            return typeof c === "string" ? c : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
        }) + '"' : '"' + string + '"';
    };
    JSON.rx_escapable = new RegExp('[\\\"\\\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]', "g");
    JSON.meta = {
        "\b": "\\b",
        "    ": "\\t",
        "\n": "\\n",
        "\f": "\\f",
        "\r": "\\r",
        '"': '\\"',
        "''": "\\''",
        "\\": "\\\\"
    };
    return JSON;
})();
}

看到这段代码,觉得融云 SDK 在兼容性上还是有处理的,又在 IE7 下做了测试,果然可以稳定运行(这年头还有 IE7 ,是不是很神奇)

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

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


融云 IM SDK 发送语音消息

IM即时通讯苏道 发表了文章 • 0 个评论 • 255 次浏览 • 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 个评论 • 253 次浏览 • 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 个评论 • 250 次浏览 • 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


友情链接