融云im小程序集成初体验

最近领导让做一个小程序端的聊天功能,基于多方考虑,最终选择了融云的im来实现,那就先写个demo体验下吧。首先呢,当然是查看官方文档,文档地址如下: https://docs.rongcloud.cn/v4/views/im/noui/guide/p...
继续阅读 »

最近领导让做一个小程序端的聊天功能,基于多方考虑,最终选择了融云的im来实现,那就先写个demo体验下吧。

微信截图_20210415151418.png

首先呢,当然是查看官方文档,文档地址如下: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/setting/include/mini.html

需要注意要在管理后台的小程序服务下将小程序的开关打开,否则会报错,相关的demo也可从后端下载到。

拿到sdk了,我们就可以上手集成了,嘻嘻……

由于是demo,暂时先把appkey和token配置写死了,放在了config.js中,appkey和token可以从管理后台获取到。

其次呢,我们需要把im引入,可以整一个公用的js文件,在此引入im sdk,初始化一个全局的im对象(在此呢需要注意im对象一定是全局的,不能赋值给小程序里面的data值,之前我就犯了错,赋值给了data,导致页面只要一调用setData方法就一直报Converting string to Json的错误,大家可以在集成过程中避雷呢)。

引入代码如下:

const RongIMLib = require("./RongIMLib-3.0.7-dev.js");
const config = require("../public/config");
const imInstance = RongIMLib.init({ appkey: config.appkey});
export {
  RongIMLib,
  config,
  imInstance
}

接着我们创建一个主页面,在这个页面中我们可以建立融云的连接以及获取会话列表。

connect() { 
    if (this.data.isConnect) {
        this.data.im.disconnect();
    }
    imInstance.connect({ token: config.token }).then(user => {
        this.isConnect = true;
        this.getConversationList();
        console.log('链接成功, 链接用户 id 为: ', user);
    }).catch(error => {
    console.log('链接失败: ', error);
 });
},

注意事项:在此需要注意安全域名问题,要不会报错,导致连接不上融云的服务。

1. 开发环境的话,可以在右上角的详情中的本地设置中将不校验合法域名的地方打上对勾。

2. 生产环境的话,可以参考如下地址设置: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/setting/include/mini.html

这样的话就可以连接成功了,哈哈,第一步总算是跨出去了。

接下来我们可以在连接成功后获取会话列表,代码如下:

imInstance.Conversation.getList().then(list => {
  this.setData({
    conversationList: list
  })
}).catch(error => {
  console.log('获取会话列表失败: ', error);
});

点击详情跳转到聊天页面,在此需要注意如果要获取历史记录的话是要开通im商业版-单群聊云存储的。开通后按照api使用说明获取就可以了,代码如下:

getHistory(conversation) {
    const option = {
        timestrap: +new Date(),
        count: 10
        };
        conversation.getMessages(option).then((result) => { 
            var hasMore = result.hasMore; // 是否还有历史消息可以获取
            this.setData({
              messageList: result.list
            })
        });      
}

接下来发送消息等其他接口,正常调用就可以了,和web端sdk基本是一致的,参考官方文档即可,整个集成过程花了两三天吧,还算顺利。有不足之处还望大家多多指教,多多交流……

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

融云开发文档地址:https://docs.rongcloud.cn/v4/


收起阅读 »

融云发送文件和图片消息

前段时间集成了web端融云的聊天功能,但是只能发送普通消息,最近产品经理出了新需求,需要把文件发送和图片发送加上,那就撸起袖子走一遍。官方文档说明地址如下: https://docs.rongcloud.cn/v4/views/im/noui/gui...
继续阅读 »

前段时间集成了web端融云的聊天功能,但是只能发送普通消息,最近产品经理出了新需求,需要把文件发送和图片发送加上,那就撸起袖子走一遍。

微信截图_20210415151151.png

官方文档说明地址如下: https://docs.rongcloud.cn/v4/views/im/noui/guide/group/msgmanage/msgsend/web.html

看过文档之后,才发现发送文件和图片消息是分两步的,首先要实现文件和图片的上传,然后拿到数据后发送消息。融云默认是存储到七牛服务器的,其实也可以上传到自己的服务器,由于是个demo,我暂时就存储到七牛啦。

文件和图片上传

demo地址:https://github.com/rongcloud/rongcloud-web-im-upload,用到的文件可以从以上demo地址中拿到。

上传暂时还不支持npm的引如方式,需要在html中引入上截图中的三个文件,顺序如下:

<script src = "./send-data.js"></script>
<script src = "../upload.js"></script>
<script src="./init.js"></script>

然后在input的change事件中,触发以下方法:

 fileChange(evt, type) {
        this.currentType = type === 'img' ? RongIMLib.FileType.IMAGE : RongIMLib.FileType.FILE;
        const file = evt.target.files[0];
        console.log('file', file);
        if (type === 'img') {
            UploadClient.initImage(this.config, (uploadFile) => { // 上传文件为: UploadClient.initFile
                uploadFile.upload(file, this.uploadCallbacks);
            });
        } else {
            UploadClient.initFile(this.config, (uploadFile) => { 
                uploadFile.upload(file, this.uploadCallbacks);
            });
        }

    },

config配置如下:

config() {
        return {
            domain: 'http://upload.qiniu.com',
            fileType: this.currentType,
            getToken: (callback) => {
                this.rongIMClient.getFileToken(this.currentType , {
                onSuccess: (data) => {
                    callback(data.token);
                },
                onError: () => {
                    console.error('get file token error', error);
                }
                });
            }
        }
    },

成功回调配置如下:

uploadCallbacks() {
        return {
            onProgress: (loaded, total) => {
                const percent = Math.floor(loaded / total * 100);
                console.log('已上传: ', percent);
              },
              onCompleted: (data) => {
                  this.currentFile = data;
                  this.getFileUrl(data);
              },
              onError: (error) => {
                console.error('上传失败', error);
              }
        }
    },

注:如果是图片的话在onCompleted里面通过data.thumbnail是可以拿到图片的缩略图的。 接下来是获取文件或者图片的url,也需要在onComplete回调中获取,代码如下:

   getFileUrl(data) {
        if (data.thumbnail) {
           this.currentFile.base64 = `data:image/jpg;base64,${data.thumbnail`;
        }    
        this.rongIMClient.getFileUrl(this.currentType, data.filename, data.name, {
        onSuccess: (data) => {
            this.currentFile = Object.assign(this.currentFile, data);
            this.sendFileMessage(this.currentType);
            console.log('文件 url 为: ', data);
        },
        onError: function(error) {
            console.log('get file url error', error);
        }
        })
    },

拿到文件或者图片的url之后就可以发送图片或者文件消息了。

文件和图片消息发送

发消息代码如下:

  sendFileMessage(type) {
        let msg = {};
        if (type ===  RongIMLib.FileType.IMAGE) {
            msg = new RongIMLib.ImageMessage({content:  this.currentFile.base64, imageUri: this.currentFile.downloadUrl});
        } else {
            msg = new RongIMLib.FileMessage({name:  this.currentFile.name, size: this.currentFile.size, type: this.currentFile.type, fileUrl: this.currentFile.downloadUrl});
        }
        var conversationType = this.targetUser.conversationType;
        var targetId = this.targetUser.id;  // 目标 Id
        var callback = {
        onSuccess:  (message) => {
            this.handleMessage(message);
        },
        onError:  (errorCode) => {
        }
        };
        this.rongIMClient.sendMessage(conversationType, targetId, msg, callback);
    },

至此,发送图片和文件消息完成,整体算是顺利……

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


收起阅读 »

集成融云即时通讯碰到的一些问题

前言公司产品需要新增即时通讯的模块,经过调研后使用融云的即时通讯 SDK 由于以前没有做过相关聊天类的项目,在开发的时候碰到了很多坑,下面会将碰到的问题和解决方案记录下来以做备份和学习交流融云官网:https://www.rongcloud.cn/ ...
继续阅读 »

前言

公司产品需要新增即时通讯的模块,经过调研后使用融云的即时通讯 SDK 由于以前没有做过相关聊天类的项目,在开发的时候碰到了很多坑,下面会将碰到的问题和解决方案记录下来以做备份和学习交流

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

问题列表

1、如何获取历史消息

解决方案: 因为 Web 端没有本地存储,不提供本地获取方法,只能从远端获取 使用获取历史消息方法需要在开发者后台开启 IM 商用版 - 单群聊云存储 服务,服务开通后 30 分钟左右生效 每次最多只能获取 20 条历史消息,通过改变参数 timestrap 来获取其他时间段的历史消息

2、删除会话后还有会话

解决方案: 1、删除会话. 正常来说只要没有收发消息, 会话就不会再生成了 2、如果您有清除 localStorage 的操作, 则 SDK 内部会重新拉取离线消息. 而会话列表是根据收发消息生成的. 则会再次产生会话. 所以建议您检查下是否有清除 localStorage 的操作. 如果有, 建议您只清除自己业务相关的 key 3、如果您换端登录, 则会再次收离线消息, 如果希望此时依然不显示删除的消息. 可以在您删除消息后发一条自定义消息比如: (1). 删除会话 A (2). 发送自定义消息, 标识删除了会话 A (3). 换端登录, 重复收之前已收到过的消息 (4). 收消息时收到了步骤 (2) 中发送的删除标识消息, 根据此自定义消息, 再次调用删除会话方法删除会话

3、怎样才能获取到加入群组之前的聊天记录

解决方案: 加入群组,融云默认是获取不到之前的历史消息,如果想获取到之前的历史消息,需要在开发者后台 -- 免费基础功能 中开通 “新用户获取加入群组前历史消息” 服务,服务开通后 30 分钟左右生效

4、消息中的接收方和发送方 ID 为什么是相同的

解决方案: 如果在接收方来查看消息的话,接收方 id 和 发送方 id 是相同的。 消息体中 targetId 表示会话 id (接收方),senderUserId 表示发送方 id ,messageDirection 表示消息方向,发送: 1,接收: 2 如果 A 给 B 发送一条消息,那么在 B 的角度看的话 targetId 为 A,senderUserId 也是 A,只是 messageDirection 为 2 表示接收 在 A 的角度看的话, targetId 为 B,senderUserId 是 A,只是 messageDirection 为 1 表示发送

5、删除历史消息时,参数与文档描述一致,但是结果却返回 33007 表示:未开通历史消息服务,但是开发者后台早已经开通了

解决方案: 因传入了比融云服务器时间还要大的时间, 所以服务返回了此错误码. 如果要保证删除成功, 建议传入会话最后一条消息的 sentTime (发送时间)

6、接收 emoji 显示不出来

解决方案: 1、Web SDK 接收消息后,消息体内的原生 Emoji 字符会被解码为对应 Unicode 码,需调用转化方法才能正确显示 2、不同浏览器, 不同设备, 展示的原生 Emoji 表情都不同 3、如需多端展示 Emoji 一致, 需使用 emojiToHTML 转化为 HTML 后再展示(此方法为以图片形式展示) 4、emojiToHTML 和 symbolToHTML 仅支持默认的 128 个 emoji. 展示更多, 需自行扩展 详情参考:https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/msgsend/web.html#emoji

暂时先记录这些,后续还有的话会继续添加进去,也欢迎大家进行补充,一起学习一下,笔芯 ♥️ ♥️ ♥️ !!!


收起阅读 »

融云im撤回消息

由于疫情原因,公司基于融云做了个在线的聊天室,之前增加了一些聊天室的基础功能,最近呢由于需求补充,需要把消息撤回加上。 官方文档说明地址: https://docs.rongcloud.cn/v4/views/im/noui/guide/chatro...
继续阅读 »

由于疫情原因,公司基于融云做了个在线的聊天室,之前增加了一些聊天室的基础功能,最近呢由于需求补充,需要把消息撤回加上。 官方文档说明地址: https://docs.rongcloud.cn/v4/views/im/noui/guide/chatroom/msgmanage/msgrecall/web.html

撤回消息代码如下:

recall() {
         const conversation = this.im.Conversation.get({
            targetId: this.targetUser.id,
            type: this.targetUser.conversationType
          });
          conversation.recall({
            messageUId: this.currentMsg.messageUId,
            sentTime: this.currentMsg.sentTime
          }).then((message) => {
            this.$message.success('撤回成功');
            const msg =  Object.assign({extra: {nickname: this.currentUser.nickname}}, message);
            this.handleMessage(msg, false);
          });
    },

在此要注意,撤回成功之后是不会触发会话的监听的,需要自己在成功的回调里面处理撤回的消息。撤回消息处理代码如下:

if (message.messageType === 'RC:RcCmd') {
            const msg = Object.assign({tip: `${isSelef ? '您':  nickname}撤回了一条消息`}, message);
            if (messageIds.includes(message.content.messageUId)) {
                const index = messageIds.indexOf(message.content.messageUId);
                this.messageList.splice(index, 1, msg);
            } else {
                this.messageList.push(message);
            }
        } else {
            this.messageList.push(message);
        }

当对方在消息监听中收到上述的消息时,也可以调用上述的方法进行撤回消息处理。

撤回消息现在是没有时间限制的,如果要加上时间限制,可以根据消息的sentTime处理。

至此,消息撤回已成功集成。集成中发现了一个问题,撤回的消息在会话列表中还存在,已经给融云提交工单,看后续能不能处理。

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

融云开发文档地址:https://docs.rongcloud.cn/v4/


收起阅读 »

快速了解 Electron:基于 Web 跨平台桌面实现 - 即时通讯

Electron 知识普及目前市面上的通讯软件多数都是支持多种平台的,Android 端、iOS 端、PC 端、Web 端、小程序端等。由于传统的 PC 端开发成本很高。所以今天给大家推荐使用 Electron 来实现 PC 端。Electron 是通过将 C...
继续阅读 »

Electron 知识普及

目前市面上的通讯软件多数都是支持多种平台的,Android 端、iOS 端、PC 端、Web 端、小程序端等。由于传统的 PC 端开发成本很高。所以今天给大家推荐使用 Electron 来实现 PC 端。

Electron 是通过将 Chromium 和 Node.js 合并到同一个运行时环境中,可以用 HTML、CSS 和 JavaScript 构建跨平台桌面应用程序。

Electron 可以将开发好的程序打包成 Mac、Windows 和 Linux 系统。

Electron 官网 https://www.electronjs.org/

Electron 开发 PC 端的理由

  1. 使用 Web 技术进行开发,开发成本低,可扩展性强;

  2. 跨平台,一套代码可打包为 Windows、Linux、Mac 三套软件;

  3. 可直接在现有 Web 应用上进行扩展;

  4. 提供浏览器不具备的能力;

实现即时通讯

传统 web 端通信多数都是由 websock 或者是长轮询实现的。目前市面上也有很多做即时通讯的三方,例如:融云,网易云等等。我选择的是融云。

融云提供了一个桌面端解决方案,是使用 Electron 实现。不过个人觉得那个版本有些低,但还是试用了下。

下载 Demo 启动起来,Demo 里面给的很简单不过基本的功能还是有的,把 Demo 中的地址换成了我自己的地址还是比较方便的。

此处省略了些实现过程,Electron 使用的是融云提供的 Demo, web 站点是之前集成的融云的 web 端 SDK。 如果大家想要了解可以先看下文档,由于项目中有很多其他模块内容就不再次展示了。

文档地址 https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/include/web.html

由于我们场景就是单群聊,所以用到的核心接口如下。

  1. 初始化连接https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/include/web.html#init

  2. 设置监听https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/include/web.html#listener

  3. 连接融云https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/include/web.html#connect

  4. 发消息https://docs.rongcloud.cn/v4/views/im/noui/guide/quick/include/web.html#send

当时测试时直接用的快速集成中的代码段进行了下修改。还是很方便的。如果需要大家可以自行查看。

结果上图

24954647-5f7d3bbb34d7d453.png

收起阅读 »

融云升级到到5.0报错

使用 pod ,从4.x版本升级到 5.x,写法和报错如下写法: [RCIM sharedRCIM].enableBurnMessage = YES; 报错:Property 'enableBurnMessage' not found on o...
继续阅读 »

使用 pod ,从4.x版本升级到 5.x,写法和报错如下

  1. 写法: [RCIM sharedRCIM].enableBurnMessage = YES; 报错:Property 'enableBurnMessage' not found on object of type 'RCIM *' 解决:把代码改成 RCKitConfigCenter.message.enableDestructMessage = YES; 因为 SDK 把接口从 RCIM 类移到了 RCKitMessageConf 中

  2. 解决完上述属性报错后,出现了以下报错: 报错:Apple Mach-O Linker Error

     ld: library not found for -lopencore-amrnb
     clang: error: linker command failed with exit code 1 (use -v to see invocation)

    解决:TARGETS - Build Settings - Other Linker Flags 里去掉 -l"opencore-amrnb"

  3. 解决完上述报错后,又出现了以下报错: 报错:Apple Mach-O Linker Error

     ld: library not found for -lopencore-amrwb
     clang: error: linker command failed with exit code 1 (use -v to see invocation)

    解决:TARGETS - Build Settings - Other Linker Flags 里去掉 -l"opencore-amrwb"

  4. 解决完上述报错后,又出现了以下报错: 报错:Apple Mach-O Linker Error

     ld: library not found for -lvo-amrwbenc
     clang: error: linker command failed with exit code 1 (use -v to see invocation)

    解决:TARGETS - Build Settings - Other Linker Flags 里去掉 -l"vo-amrwbenc"

希望大家可以活学活用,在报错的时候全局搜一下对应的关键词,看是不是引用的问题导致


收起阅读 »

融云集成错误码汇总

最近集成了融云 IM SDK,过程中遇到了错误码,这时需要去 SDK 头文件找到对应的错误码查看原因。下列给大家整理了一下,希望可以帮到大家,如果还有疑问,可以联系融云的技术:30007 : 导航 HTTP 请求失败。建议:更换网络环境,如无法解决,联系服务端...
继续阅读 »
最近集成了融云 IM SDK,过程中遇到了错误码,这时需要去 SDK 头文件找到对应的错误码查看原因。下列给大家整理了一下,希望可以帮到大家,如果还有疑问,可以联系融云的技术:
微信截图_20210318112905.png

30007 : 导航 HTTP 请求失败。建议:更换网络环境,如无法解决,联系服务端排查(尤其是私有云)' :

31002 : AppKey 错误。请检查您使用的 AppKey 是否正确

30010 : 创建 Socket 连接失败。建议:一般是网络不好,需更换网络试一下。

31004 : Token 无效。建议:一是 token 错误,请您检查客户端初始化使用的 AppKey 和您服务器获取 token 使用的 AppKey 是否一致;二是 token 过期,是因为您在开发者后台设置了 token 过期时间,您需要请求您的服务器重新获取 token 并再次用新的 token 建立连接

31005 : AppKey 与 Token 不匹配。建议:请检查您使用的 AppKey 与 Token 是否正确,是否匹配。一般有以下三种原因。一是 token 错误,请您检查客户端初始化使用的 AppKey 和您服务器获取 token 使用的 AppKey 是否一致;二是 token 过期,是因为您在开发者后台设置了 token 过期时间,您需要请求您的服务器重新获取 token 并再次用新的 token。三是 App 校验未通过,是因为您在开发者后台设置了 App 校验建立连接。

31007 : BundleID 不正确。建议:请检查您 App 的 BundleID 是否正确

31008 : AppKey 被封禁或已删除。建议:请检查您使用的 AppKey 是否被封禁或已删除。

31009 : 用户被封禁。建议:检查您使用的 Token 是否正确,以及对应的 UserId 是否被封禁

31010 : 用户被踢下线。建议:当前用户在其他设备上登录,此设备被踢下线'

31023 : 用户在其它设备上登录。建议:重连过程中当前用户在其它设备上登录

33001 : SDK 没有初始化。建议:在使用 SDK 任何功能之前,必须先 init

33003 : 开发者接口调用时传入的参数错误。建议:请检查接口调用时传入的参数类型和值

34001 : Connection 已经存在。建议:调用过connect之后,只有在 token 错误或者被踢下线或者用户 logout 的情况下才需要再次调用 connect。其它情况下 SDK会自动重连,不需要应用多次调用 connect 来保持连接

34005 : 连接环境不正确。建议:融云公有云 SDK 无法连接到私有云环境。请确认需要连接的环境,使用正确 SDK 版本

34006 : 连接超时。建议:当调用 connectWithToken:timeLimit:dbOpened:success:error: 接口,timeLimit 为有效值时,SDK 在 timeLimit 时间内还没连接成功返回此错误

30011 : Socket 断开。建议:Socket 连接被断开,主要有两种情况,一是用户主动调用 disconnect 之后,Socket 被服务器断开;二是中间路由原因等导致 Socket 断开

30008 : 导航 HTTP 返回数据格式错误。建议:建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30004 : 导航 HTTP 发送失败,是否设置 ATS。建议:如果是偶尔出现此错误,SDK 会做好自动重连,开发者无须处理。如果一直是这个错误,应该是您没有设置好ATS。ATS 默认只使用 HTTPS 协议,当HTTP 协议被禁止时 SDK 会一直 30004 错误。您可以参考 iOS 开发文档中的 ATS 设置说明。链接如下:https://support.rongcloud.cn/ks/OTQ1

30012 : PING 失败。建议:建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30013 : PING 超时。建议:建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

30014 : 信令发送失败。建议:建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31000 : 连接 ACK 超时。建议:建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31001 : 信令版本错误。建议:问融云的技术人员吧

31003 : 服务器当前不可用。建议:建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

31006 : 连接重定向。建议:建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

32061' : 连接被拒绝。建议:建立连接的临时错误码,SDK 会做好自动重连,开发者无须处理。

20604 : 发送消息频率过高,1 秒钟最多只允许发送 5 条消息。建议:多个消息发送的时候中间加个延时

20607 : 请求超出了调用频率限制,请稍后再试。建议:不要多余频繁的调用接口

21406 : 当前用户不在该讨论组中

22406 : 当前用户不在该群组中。建议:到融云开发者后台 API 调用模块对应服务中进行查询

22408 : 当前用户在群组中已被禁言。建议:让开发者服务端人员确认一下是否在群组中

23406 : 当前用户不在该聊天室中。建议:到融云开发者后台 API 调用模块对应服务中进行查询核实

23408 : 当前用户在该聊天室中已被禁言。建议:到融云开发者后台 API 调用模块对应服务中进行查询核实

23409 : 当前用户已被踢出并禁止加入聊天室。被禁止的时间取决于服务端调用踢出接口时传入的时间。

23410 : 聊天室不存在。建议:到融云开发者后台 API 调用模块对应服务中进行查询核实

23411 : 聊天室成员超限,默认聊天室没有人数限制,开发者可以提交工单对某个 Appkey 进行聊天室人数限制,设置后加入聊天室时如果人数超限,会提示这个错误码

23412 : 聊天室接口参数无效。请确认参数是否为空或者有效

23414 : 聊天室云存储业务未开通。建议:到融云开发者后台进行开通

23423 : 超过聊天室的最大状态设置数,1 个聊天室默认最多设置 100 个

23424 : 聊天室中非法覆盖状态值,状态已存在,没有权限覆盖。建议:这个值只有创建者才能修改。如果必须修改,则需要调用 RCIMClient 中forceSetChatRoomEntry:key:value:sendNotification:autoDelete:notificationExtra:success:error:接口。具体请到 RCIMClient 中查看 API

23425 : 超过聊天室中状态设置频率,1 个聊天室 1 秒钟最多设置和删除状态 100 次。建议:降低设置和删除频率

23426 : 聊天室状态存储功能没有开通,请联系商务开通

23427 : 聊天室状态值不存在

26002 : 操作跟服务端同步时出现问题,有可能是操作过于频繁所致。如果出现该错误,请延时 0.5s 再试

34004 : 聊天室状态未同步完成,刚加入聊天室时调用获取 KV 接口,极限情况下会存在本地数据和服务器未同步完成的情况,建议延时一段时间再获取

30001 : 当前连接不可用(连接已经被释放),只能表明当前连接是断开的,具体原因还需要通过其他错误码分析

30002 : 当前连接不可用,只能表明当前连接是断开的,具体原因还需要通过其他错误码分析。建议:可能是网络不可用,请切换网络试一下

30003 : 客户端发送消息请求,融云服务端响应超时。建议:服务器可能有问题

33002 : 数据库错误,造成错误的原因:1. 需要保证连接融云成功并且数据库打开后再调用业务接口,比如发消息。2. userId 中包含特殊字符。

33003 : 开发者接口调用时传入的参数错误。建议:请检查接口调用时传入的参数类型和值

33007 : 历史消息云存储业务未开通。可以在融云开发者后台中开启该服务

30016 : 消息大小超限,消息体(序列化成 json 格式之后的内容)最大 128k bytes。建议:缩小消息体的大小,避免超过 128 k

25101 : 撤回消息参数无效。请确认撤回消息参数是否正确的填写

26001 : push 设置参数无效。请确认是否正确的填写了 push 参数

20605 : 操作被禁止。 此错误码已被弃用

20606 : 操作不支持。仅私有云有效,服务端禁用了该操作。

21501 : 发送的消息中包含敏感词 (发送方发送失败,接收方不会收到消息)

21502 : 消息中敏感词已经被替换 (接收方可以收到被替换之后的消息

34002 : 小视频时间长度超出限制,默认小视频时长上限为 2 分钟。建议:视频不要超过 2 分钟

34003 : GIF 消息文件大小超出限制, 默认 GIF 文件大小上限是 2 MB

34007 : 查询的公共服务信息不存在, 请确认查询的公共服务的类型和公共服务 id 是否匹配

34008 : 消息不能被扩展, 消息在发送时,RCMessage 对象的属性 canIncludeExpansion 置为 YES 才能进行扩展。建议:把RCMessage 对象的属性 canIncludeExpansion 置为 YES

34009 : 消息扩展失败, 一般是网络原因导致的,请确保网络状态良好,并且融云 SDK 连接正常

34010 : 消息扩展大小超出限制, 默认消息扩展字典 key 长度不超过 32 ,value 长度不超过 64 ,单次设置扩展数量最大为 20,消息的扩展总数不能超过 300

34011' : 媒体消息媒体文件 http 上传失败


收起阅读 »

教你轻松构建一个可以泡妞的 app

此篇文章是比较初级的,主要是指导性内容,不涉及技术。适合非移动端开发人员,公司拍板的老总,有创业梦想的人士。如果你想做个能泡妞的 app 但是不知如何着手,这边文章对你应该很有帮助。1.找一个第三方 IM 通讯平台,集成他家的 SDK(省时省力省心省钱)。我教...
继续阅读 »

此篇文章是比较初级的,主要是指导性内容,不涉及技术。适合非移动端开发人员,公司拍板的老总,有创业梦想的人士。如果你想做个能泡妞的 app 但是不知如何着手,这边文章对你应该很有帮助。

微信截图_20210318112752.png

1.找一个第三方 IM 通讯平台,集成他家的 SDK(省时省力省心省钱)。我教你找的方法,百度搜索:“即时通讯” 这四个字就行,会出现一堆搜索结果。也有很多品牌做广告。建议还是看前几个品牌吧,起码广告能力和 SEO 引擎优化能力不错

2.。搜索出来的结果基本都是这云那云的,可以点击进去了解一下价格,手机下载他家的产品,体验一下 demo,看看聊天界面怎么样,消息到达快还是慢。根据自己的喜好和理解,选择一家即可

3.接下来需要从他家官网找到文档,比如 iOS 平台的文档。应该会有 pod 集成或者手动集成的方式。第一步就是集成 SDK 到工程中

4.然后注册他家的账号,添加应用,获取 appkey 、用户 token 一类的信息(各个平台可能有差异,需以具体为准)。这些信息是用来连接他家服务器的。连接成功后,自己构造个按钮作为聊天入口,点击事件设置成发送消息给某人,比如登陆的是 A 用户,发消息给 B 用户。另一台设备也得跑,登陆 B 用户,给 A 用户发消息。同时都需要一个会话列表,在接收消息的时候展示出来会话。

5.可以聊天的 app 就这样搞定了。剩下的好友列表一类的用户信息就需要从自己服务器请求了。慢慢打磨吧

目前市面上 IM 即时通讯 SDK 比较成熟的还是有几家的,竞争也相对比较激烈。体验了几家,感觉从技术支持服务角度来讲,融云还是可以的。前阵子公司项目对接了融云,建了交流群,有问题往里抛就行,会有对应平台的技术解疑答惑。个人认为处理速度还是很及时的,可能是创业公司原因,服务这块没的说。


收起阅读 »

【iOS开发】自定义融云选取位置页面和位置信息页面的导航栏

选取位置页面创建 RCLocationPickerViewController 的子类:RCDLocationViewController,可以实现自定义导航栏左右按钮- (void)viewDidLoad {   &n...
继续阅读 »
  1. 选取位置页面

  2. 创建 RCLocationPickerViewController 的子类:RCDLocationViewController,可以实现自定义导航栏左右按钮

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"自定义左按钮" style:UIBarButtonItemStyleDone target:self action:@selector(leftItemDidPressed:)];
    self.navigationItem.leftBarButtonItem.tintColor = [UIColor redColor];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"自定义右按钮" style:UIBarButtonItemStyleDone target:self action:@selector(rightItemDidPressed:)];
    self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
}
- (void)leftItemDidPressed:(id)sendr {
    [self dismissViewControllerAnimated:YES completion:nil];
}
- (void)rightItemDidPressed:(id)sendr {
    [super rightBarButtonItemPressed:nil];
}
  • 在聊天页子类重写以下方法,并设置代理,present 到子类的对象中。

/*!
 扩展功能板的点击回调

 @param pluginBoardView 输入扩展功能板View
 @param tag             输入扩展功能(Item)的唯一标示
 */
- (void)pluginBoardView:(RCPluginBoardView *)pluginBoardView clickedItemWithTag:(NSInteger)tag {
    switch (tag) {
           case PLUGIN_BOARD_ITEM_LOCATION_TAG: {
               RCDLocationViewController *vc = [[RCDLocationViewController alloc] init];
               vc.delegate = self;
               UINavigationController *navi = [[UINavigationController alloc] initWithRootViewController:vc];
               [self presentViewController:navi animated:YES completion:nil];
           }
               break;

           default:
               [super pluginBoardView:pluginBoardView clickedItemWithTag:tag];
               break;
       }
}
  • 聊天页子类需要遵循代理 RCLocationPickerViewControllerDelegate,并实现方法: ```objective-c /*! 地理位置选择完成之后的回调

    @param locationPicker 地理位置选取的ViewController @param location 位置的二维坐标 @param locationName 位置的名称 @param mapScreenShot 位置在地图中的缩略图

    @discussion 如果您需要重写地理位置选择的界面,当选择地理位置完成后,需要调用此回调通知RCConversationViewController定位已完成,可以进一步生成位置消息并发送。 */

  • (void)locationPicker:(RCLocationPickerViewController *)locationPicker didSelectLocation:(CLLocationCoordinate2D)location

        locationName:(NSString *)locationName
       mapScreenShot:(UIImage *)mapScreenShot {

    RCLocationMessage *locationMessage = [RCLocationMessage messageWithLocationImage:mapScreenShot location:location locationName:locationName]; [self sendMessage:locationMessage pushContent:nil]; }

2. 位置信息页面
- 创建 RCLocationViewController 的子类LocationViewController

```objective-c
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"自定义左按钮" style:UIBarButtonItemStyleDone target:self action:@selector(leftItemDidPressed:)];
    self.navigationItem.leftBarButtonItem.tintColor = [UIColor redColor];

    self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
}
- (void)leftItemDidPressed:(id)sendr {
    [self dismissViewControllerAnimated:YES completion:nil];
}
  • 在会话页面重写点击位置消息的回调 ```objective-c

/**

  • 打开地理位置。开发者可以重写,自己根据经纬度打开地图显示位置。默认使用内置地图 *

  • @param locationMessageContent 位置消息 */

    • (void)presentLocationViewController:(RCLocationMessage )locationMessageContent { // LocationViewController为 RCLocationViewController 的子类 LocationViewController locationViewController = [[LocationViewController alloc] init]; locationViewController.locationName = locationMessageContent.locationName; locationViewController.location = locationMessageContent.location; locationViewController.modalPresentationStyle = UIModalPresentationFullScreen; UINavigationController *navc = [[UINavigationController alloc] initWithRootViewController:locationViewController]; navc.modalPresentationStyle = UIModalPresentationFullScreen; [self presentViewController:navc animated:YES completion:NULL]; } ```


收起阅读 »

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

从 【4.0.3 】版本开始,融云新增了消息扩展功能,文档如下: https://docs.rongcloud.cn/v4/views/im/noui/guide/private/msgmanage/expansion/ios.html总结文档中的几...
继续阅读 »

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

总结文档中的几个重点:

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

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

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

  • 仅支持单聊、群聊。

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

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

使用步骤:

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

  2. 如果使用的是IMKit提供的UI发送消息,或者使用RCConversationViewController中的sendMessage和sendMediaMessage方法发送消息,都会触发下面回调:

/*!
 准备发送消息的回调

 @param messageContent 消息内容

 @return 修改后的消息内容

 @discussion 此回调在消息准备向外发送时会回调,您可以在此回调中对消息内容进行过滤和修改等操作。
 如果此回调的返回值不为nil,SDK会对外发送返回的消息内容。
 */
- (RCMessageContent *)willSendMessage:(RCMessageContent *)messageContent;

在回调中判断如果是需要扩展的消息,就根据messageContent,自己构造一个RCMessage对象,并设置好canIncludeExpansion和expansionDic。

RCMessage *message = [[RCMessage alloc] initWithType:self.conversationType targetId:self.targetId direction:MessageDirection_SEND messageId:0 content:messageContent];
message.canIncludeExpansion = YES;
message.expansionDic = dict;

再调用RCIM中对应的send方法将消息发送出去,并且在准备发送消息的回调中return nil。

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

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

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


收起阅读 »