基于融云的IM

融云IM

前言

没什么好说,先从官方把知识点摘抄一遍,慢慢理解…

正文

基础概念

业务篇

单聊
指两个用户一对一进行聊天,两个用户间可以是好友也可以是陌生人,融云不对用户的关系进行维护管理,会话关系由融云负责建立并保持,当 App 在后台运行或者 App 进程被杀死后,有新消息时会收到推送通知。

群组聊天
群组指两个以上用户一起进行聊天,群组成员信息由 App 提供并进行维系,融云只负责将消息传达给群组中的所有用户, App 在后台运行或者 App 进程被杀死后可以收到推送通知。同一个用户最多可支持加入 500 个群,每个群最大人数上限为 3000 人,App 内的群组数量没有限制。

讨论组
讨论组指两个以上用户一起进行聊天,用户可以自行添加好友生成一个讨论组聊天, App 在后台运行或者 App 进程被杀死后可以收到推送通知,与群组不同的是,讨论组会话关系由融云负责建立并保持,同一个用户最多可加入 500 个讨论组,讨论组中成员上限不超过 500 人。

聊天室
聊天室成员不设用户上限,海量消息并发即时到达,用户退出聊天界面后即视为离开聊天室,不会再接收到任何聊天室中消息,没有推送通知功能。会话关系由融云负责建立并保持连接,通过 SDK 相关接口,可以让用户加入或者退出聊天室。

客服消息
用户与您的 App 后台客服进行消息通讯,支持文字、图片、位置、语音、表情、图文等消息类型,支持单客服和多客服服务,提供“机器人”和“人工”配合使用,可设置“机器人”或者“人工”优先接待功能。

音视频通话
指通过 IP 网络,使两个用户建立一对一、一对多的音视频通话。融云音视频 SDK 包括两部分:CallKit 和 CallLib 。

应用公众服务
为 App 开发者提供 App 内建公众服务能力,通过在融云开发者站点创建 App 公众号,帮助 App 快速覆盖用户需求。

公众服务
是在应用开发者和公众帐号运营者之间建立的对接平台,应用开发者可以通过平台引入公众服务资源,帮助 App 快速覆盖用户需求。

会话列表
指各种会话依照顺序先后排列的界面,其中会话列表中的每一个列表项称之为一条会话。排列的先后顺序会依赖于置顶、最新会话、未读会话和时间等因素,聊天室类型的会话不会进入到会话列表中。

聊天界面
指聊天的具体界面,显示聊天的标题、成员头像、聊天内容、输入框等。

通知
通知(Notification)是一种用户界面展现概念,是指在设备端以某种形式弹出一条提示。

通知分为本地通知(Local Notification)和远程通知(Remote Notification)。尽管您看到的是一样的界面展现,但是他们分别来自本地发起和远程发起。

本地通知指的是您的应用程序在前台、或者在后台但仍然在生命周期存活,此时收到消息,会直接通过前台的应用程序弹出提示窗口。

远程通知指的是您的应用程序已经完全退出,应用进程已经不存在,此时通过 iOS 上的 APNS 系统服务或者 Android 上的服务进程收到消息,并弹出提示栏。大家开发和调试过程中,务必要清楚本地通知和远程通知的区别。

推送
推送(Push)是一种技术概念,是指从服务端实时发送信息到客户端。

大家概念中的典型推送服务是类似 APNS(Apple Push Notification Service)、GCM(Google Cloud Messaging) 等服务。在国内,由于谷歌服务不能使用,因此您的应用必须使用第三方或者自己研发的服务来推送。

因为融云是使用长连接技术来实现 IM 服务的,和典型的 Push 服务具有相同的长连接机制,所以,很多开发者也会直接使用融云来实现推送功能。

在某些场合,iOS 平台的推送(通过 APNS 的 Push)和远程通知(Remote Notification)表示相同的意思,可以互相替换使用。

广播
广播(Broadcast)是一种业务概念,是通过后台管理界面或者调用服务端接口,向 App 中的所有用户发送一条消息。通常“广播”和“推送”是开发者容易产生混淆的地方。

系统消息
系统消息(System Message)是一种业务概念,是指利用系统帐号(非用户帐号,用户不可登录)向用户发送的消息,既可以是通过调用广播接口发送给所有人的消息,也可以是加好友等单条通知消息。

在融云平台中,其实并不存在系统消息的概念,一般系统消息特指会话类型(ConversationType)为“系统(SYSTEM)”的会话中的消息。

开发篇

App Key / Secret
App Key / Secret 相当于您的 App 在融云的帐号和密码。是融云 SDK 连接服务器所必需的标识,每一个 App 对应一套 App Key / Secret。

融云提供了两套环境,开发环境和生产环境,前者是方便您集成开发和测试的,后者是 App 上线之后真正运营的商业环境。两者间数据隔离,避免开发环境数据和线上生产环境数据互相冲突。针对开发者的生产环境和开发环境,我们提供两套 App Key / Secret ,在正式上线前,请务必切换到生产环境。

Token
Token 即用户令牌,相当于您 APP 上当前用户连接融云的身份凭证。每个用户连接服务器都需要一个 Token,用户更换即需要更换 Token。每次初始化连接服务器时,都需要向服务器提交 Token。

IM基础服务开发指南(Web SDK开发指南)

1.引入SDK
获取官方 Web SDK (目前版本为 2.2.5 ) 地址加入到自己页面中 如下:
<script src="http(s)://cdn.ronghub.com/RongIMLib-2.2.5.min.js"></script>

融云 Web SDK 从 0.9.9 版本起将开始支持 seaJs 和 requireJs 等模块加载器。

使用 requireJs 进行模块加载:

require.config({
    paths: {
     protobuf: 'http(s)://cdn.ronghub.com/protobuf-2.1.5.min',
     RongIMLib: 'http(s)://cdn.ronghub.com/RongIMLib-2.2.5.min'
    }
});

require(['protobuf','RongIMLib'], function(protobuf,RongIMLib) {
     //初始化
     RongIMLib.RongIMClient.init();
     //dosomething...
});

使用 seaJs 进行模块加载

seajs.config({
 alias: {
   "RongIMLib":'http(s)://cdn.ronghub.com/RongIMLib-2.2.5.min.js'
  }
});

seajs.use("RongIMLib",function(){
   //dosomething...
});
2.编写代码

初始化SDK
请使用您前面从融云开发者平台注册得到的 App Key,传入 init 方法,初始化 SDK 。在整个应用程序全局,只需要调用一次 init 方法。

// 初始化
// RongIMClient.init(appkey, [dataAccessProvider],[options]);
// appKey: 官网注册的appkey
// dataAccessProvider:自定义本地存储方案的实例,不传默认为内存存储,自定义需要实现WebSQLDataProvider所有的方法,此参数必须是传入实例后的对象
RongIMClient.init("e7x8xycsx6flq");

设置监听器
必须设置监听器后,再连接融云服务器,代码示例如下:

// 设置连接监听状态(status标识当前连接状态)
// 连接状态监听器
RongIMClient.setConnectionStatusListener({
    onChanged: function(status) {
        switch (status) {
            case RongIMLib.ConnectionStatus.CONNECTED:
                console.log("链接成功");
                break;
            case RongIMLib.ConnectionStatus.CONNECTING:
                console.log("正在链接");
                break;
            case RongIMLib.ConnectionStatus.DISCONNECTED:
                console.log("断开链接");
                break;
            case RongIMLib.ConnectionStatus.KICKED_OFFLINE_BY_OTHER_CLIENT:
                console.log("其他设备登录");
                break;
            case RongIMLib.ConnectionStatus.NETWORK_UNAVAILABLE:
                console.log("网络不可用");
                break;
        }
    }
})

// 消息监听器
 RongIMClient.setOnReceiveMessageListener({
    // 接收到的消息
    onReceived: function (message) {
        // 判断消息类型
        switch(message.messageType){
            case RongIMClient.MessageType.TextMessage:
                   // 发送的消息内容将会被打印
                console.log(message.content.content);
                break;
            case RongIMClient.MessageType.VoiceMessage:
                // 对声音进行预加载                
                // message.content.content 格式为 AMR 格式的 base64 码
                RongIMLib.RongIMVoice.preLoaded(message.content.content);
                break;
            case RongIMClient.MessageType.ImageMessage:
                // do something...
                break;
            case RongIMClient.MessageType.DiscussionNotificationMessage:
                // do something...
                break;
            case RongIMClient.MessageType.LocationMessage:
                // do something...
                break;
            case RongIMClient.MessageType.RichContentMessage:
                // do something...
                break;
            case RongIMClient.MessageType.DiscussionNotificationMessage:
                // do something...
                break;
            case RongIMClient.MessageType.InformationNotificationMessage:
                // do something...
                break;
            case RongIMClient.MessageType.ContactNotificationMessage:
                // do something...
                break;
            case RongIMClient.MessageType.ProfileNotificationMessage:
                // do something...
                break;
            case RongIMClient.MessageType.CommandNotificationMessage:
                // do something...
                break;
            case RongIMClient.MessageType.CommandMessage:
                // do something...
                break;
            case RongIMClient.MessageType.UnknownMessage:
                // do something...
                break;
            default:
                // 自定义消息
                // do something...
        }
    }
});

获取Token
Token也叫用户令牌,是SDK端用来连接融云服务器的凭证,每个用户链接服务器都需要一个Token。每次初始化连接服务器时,都需要向服务器提交Token。

要想获取用户Token,流程如下:首先需要您的App查询您的应用程序服务器,然后您的应用程序服务器再访问融云服务器获取,最后返回给App,App用返回的Token连接服务器登录。

连接服务器
将您在上一节请求身份认证服务器时获取的Token传入connect方法,开始连接服务器。在整个应用程序全局,只需要调用一次connect方法,SDK会负责自动重连。

您可以用在上一节介绍的API调试工具生成一个Token,这里我们假设您生成Token时使用的参数如下:
用户Id: userId=“1”
用户在融云系统中唯一的身份Id,可为任意数字或字符串,但必须保证全局唯一。
用户名称: name=“韩梅梅”
用户的显示名称,用来在Push推送时,或者客户端没有提供用户信息时,显示用户的名称。
用户头像地址: portraitUri=”http://rongcloud-web.qiniudn.com/docs_demo_rongcloud_logo.png”
这里为了测试,您可以随意提供一个地址,如果此图片不存在,会显示默认的投降。
假设返回的Token是

mKmyKqTSf7aNDinwAFMnz7NXKILeV3X0+CCRBOxmtOApmvQjMathViWrePIfq0GuTu9jELQqsckv4AhfjCAKgQ==

代码示例

// 初始化
RongIMClient.init("e7x8xycsx6flq");
var token = "mKmyKqTSf7aNDinwAFMnz7NXKILeV3X0+CCRBOxmtOApmvQjMathViWrePIfq0GuTu9jELQqsckv4AhfjCAKgQ==";

// 连接融云服务器。
      RongIMClient.connect(token, {
        onSuccess: function(userId) {
          console.log("Login successfully." + userId);
        },
        onTokenIncorrect: function() {
          console.log('token无效');
        },
        onError:function(errorCode){
              var info = '';
              switch (errorCode) {
                case RongIMLib.ErrorCode.TIMEOUT:
                  info = '超时';
                  break;
                case RongIMLib.ErrorCode.UNKNOWN_ERROR:
                  info = '未知错误';
                  break;
                case RongIMLib.ErrorCode.UNACCEPTABLE_PaROTOCOL_VERSION:
                  info = '不可接受的协议版本';
                  break;
                case RongIMLib.ErrorCode.IDENTIFIER_REJECTED:
                  info = 'appkey不正确';
                  break;
                case RongIMLib.ErrorCode.SERVER_UNAVAILABLE:
                  info = '服务器不可用';
                  break;
              }
              console.log(errorCode);
            }
      });

发送消息
发送单聊、群组及聊天室消息,发送消息必须在执行初始化SDK方法及连接融云服务器connect成功之后进行。

 // 定义消息类型,文字消息使用 RongIMLib.TextMessage
 var msg = new RongIMLib.TextMessage({content:"hello",extra:"附加信息"});
 //或者使用RongIMLib.TextMessage.obtain 方法.具体使用请参见文档
 //var msg = RongIMLib.TextMessage.obtain("hello");
 var conversationtype = RongIMLib.ConversationType.PRIVATE; // 私聊
 var targetId = "xxx"; // 目标 Id
 RongIMClient.getInstance().sendMessage(conversationtype, targetId, msg, {
                // 发送消息成功
                onSuccess: function (message) {
                    //message 为发送的消息对象并且包含服务器返回的消息唯一Id和发送消息时间戳
                    console.log("Send successfully");
                },
                onError: function (errorCode,message) {
                    var info = '';
                    switch (errorCode) {
                        case RongIMLib.ErrorCode.TIMEOUT:
                            info = '超时';
                            break;
                        case RongIMLib.ErrorCode.UNKNOWN_ERROR:
                            info = '未知错误';
                            break;
                        case RongIMLib.ErrorCode.REJECTED_BY_BLACKLIST:
                            info = '在黑名单中,无法向对方发送消息';
                            break;
                        case RongIMLib.ErrorCode.NOT_IN_DISCUSSION:
                            info = '不在讨论组中';
                            break;
                        case RongIMLib.ErrorCode.NOT_IN_GROUP:
                            info = '不在群组中';
                            break;
                        case RongIMLib.ErrorCode.NOT_IN_CHATROOM:
                            info = '不在聊天室中';
                            break;
                        default :
                            info = x;
                            break;
                    }
                    console.log('发送失败:' + info);
                }
            }
        );

同步会话列表
在浏览器中使用融云Web SDK与在移动端中使用 融云IOS、Android SDK不同的是浏览器一刷新页面,之前已经存在在内存中存好的会话列表都将会清空。

Web SDK提供getConversationList来获取会话列表,如果本地不存在会话记录,SDK会自动向服务器拉去,此方法必须在执行初始化SDK方法init及连接融云服务器connect成功之后进行。

// getConversationList示例

RongIMClient.getInstance().getConversationList({
    onSuccess: function(list) {
        console.log(list);
    };
    onError: function(error) {
        // do something
    }
}, null)

获取历史消息
通过getHistoryMessages来帮助开发者获取历史消息记录。此方法必须在执行初始化SDK方法及连接融云服务器connect成功之后记性,使用此方法前提是APP必须开启单群聊消息云存储,如APP没有开启则执行onError方法。

单群聊消息云存储不支持聊天室消息云存储,拉去历史消息最多一次性拉去20条消息。拉取顺序按时间倒序拉取,如果本地不存在历史消息,SDK会自动向服务器拉取。

拉取历史消息为循环拉取,举例:
条件:历史记录为 45 条,每次拉取 20 条。
第一次拉取 list 长度为 20,hasMsg 为 true。
第二次拉取 list 长度为 20,hasMsg 为 true。
第三次拉取 list 长度为 5,hasMsg 为 false。
第四次拉取 list 长度为 0,hasMsg 为 false。
第四次拉取:重复第一次拉取,以此循环

//getHistoryMessages
 RongIMClient.getInstance().getHistoryMessages(RongIMLib.ConversationType.PRIVATE, 'targetId', null, 20, {
          onSuccess: function(list, hasMsg) {
            // hasMsg为boolean值,如果为true则表示还有剩余历史消息可拉取,为false的话表示没有剩余历史消息可供拉取。
               // list 为拉取到的历史消息列表
          },
          onError: function(error) {
              // APP未开启消息漫游或处理异常
                   // throw new ERROR ......
          }
        });

自定义消息(未做太多标记)
1.自定义消息支持方式
2.自定消息类型参数说明
3.自定消息注意事项

检测未读消息
此接口用来查询当前传入Token是否有未读消息,此方法必须在执行初始化SDK方法init及连接融云服务器connect成功之后进行。

// 此接口必须在init()方法之后调用。
RongIMClient.getInstance().hasRemoteUnreadMessages('mKmyKqTSf7aNDinwAFMnz7NXKILeV3X0+CCRBOxmtOApmvQjMathViWrePIfq0GuTu9jELQqsckv4AhfjCAKgQ==',{
    onSuccess:function(hasMessage){
        if(hasMessage){
            // 有未读的消息
        }else{
            // 没有未读的消息
        }
    },onError:function(err){
        // 错误处理...
    }
});

参考文献

  1. 融云官网
    http://www.rongcloud.cn/docs/quick_start.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值