融云2.0的官方文档地址:http://docs.apicloud.com/端API/开放SDK/rongCloud2

项目需要IM模块,最后还是选择了融云.在iOS原生开发中,融云sdk集成了聊天界面,给开发者提供了很大的便利,但是在apicloud平台上,由于开发者应用IM的场景各异,需求不统一,所以官方没有将聊天界面集成到模块中.

因此我选择了AUI这套专门为apicloud提供的前端开发框架进行IM界面的搭建.AUI官方地址:http://www.auicss.com.

这套框架集成了很多手机端的UI,效果不错,而且还在不断的更新中,大家不妨尝试一下.我用过其中的几个,总体感觉还是不错的!

接下来,就具体的说一说RongYun集成的步骤了(本文会不断的更新,若发现不妥之处和需要改进的地方,可以给我留言,谢谢!)

一.准备工作

在集成融云2.0之前,首先要到融云官网上进行注册,然后添加应用信息,并且生成两个测试用的targetId并记录下对应的token(这种方法仅为测试使用)  融云的官网:http://www.rongcloud.cn

之后在API调试里面 生成userID对应的token,这些信息在初始化融云时会用到,

之后再次生成一个userID,并记录对应的token.这样,就相当于建立了两个用户,用户A和用户B,,之后便可实现用户A与用户B之间的通信了.

上述内容准备完之后,就要在自己的apicloud应用中添加融云2.0模块了.  apicloud中的融云集成之前的准备在此略过,可以参照官方文档.

二.融云2.0的集成

在详细的介绍之前,先要说一说这个聊天界面使用的框架和模板.

1.doT.js (不熟悉的小伙伴可以参照这篇博客: http://www.cnblogs.com/kuikui/p/3505768.html)

2.AUI 前端UI框架(地址在上面给过了,很实用,小伙伴们可以看一看).

3.UIChatBox, 文档地址: http://docs.apicloud.com/端API/界面布局/UIChatBox#m11

好了,有了这几个,就可以轻松的完成一个简单的聊天界面的集成了!

1.融云2.0的初始化

首先要在config文件里填入一下代码

<feature name="rongCloud2"><param name="appKey" value="这里填写在融云官网自己app对应的key" /></feature>
   关于初始化,有一点一定要知道:融云对于整个应用初始化只需要一次, 再次初始化或者 connect 就会出错.
    //1、RongY初始化var rong = api.require('rongCloud2');rong.init(function (ret, err) {});//2、进行监听rong.setOnReceiveMessageListener(function (ret, err) {});//3、链接到RongYrong.connect({token: $api.getStorage("RongToken")},function (ret, err) {if (ret.status == 'success') {//实时监听收到的消息} else {}});



  上述代码是在进入聊天界面之前,对融云sdk进行的init和connect方法.

2.聊天界面UI

   聊天界面UI就用到了AUI和doT.js.以下是详细的代码
<span style="font-size:14px;"><body><!--//发送语音提示框-->
<div class="aui-toast" style="display:none" id="loading"><div class="aui-toast-loading"></div><div class="aui-toast-content"></div>
</div>
<!--聊天页面-->
<div id="wrap" class="flex-wrap flex-vertical"><div id="message-content2" style="margin-top: 10px"></div><div class="aui-content aui-content-padded" id="message-content"><script id="message-content-template" type="text/x-dot-template">{{for(var i=0;i<it.length ;i++){}}{{? it[i].tag=== 'TxtMsg'}}<div class="{{=it[i].firstSendType}}" style="margin-top: 20px">{{? it[i].messageDirection=== 'SEND'}}<div class="aui-text-center history-date">{{=it[i].sentTime}}</div>{{?? it[i].messageDirection=== 'RECEIVE'}}<div class="aui-text-center history-date">{{=it[i].receivedTime}}</div>{{?}}<div class="{{=it[i].secondSendType}}"><img src="../image/demo1.png"></div><div class="{{=it[i].thirdSendType}}"><div class="{{=it[i].fourthSendType}}"></div><span id="txt">{{=it[i].content.text}}</span></div></div>{{?}}{{? it[i].tag === 'ImgMsg'}}<div class="{{=it[i].firstSendType}}" style="margin-top: 20px">{{? it[i].messageDirection=== 'SEND'}}<div class="aui-text-center history-date">{{=it[i].sentTime}}</div>{{?? it[i].messageDirection=== 'RECEIVE'}}<div class="aui-text-center history-date">{{=it[i].receivedTime}}</div>{{?}}<div class="{{=it[i].secondSendType}}"><img src="../image/demo1.png"></div><div class="{{=it[i].thirdSendType}}"><div class="{{=it[i].fourthSendType}}"></div><img class="lazy" id="image" style="width: 100px; height: 100px" ;data-original="{{=it[i].content.imageUrl}}"οnclick="clickShowBigPic('{{=it[i].content.imageUrl}}')"></div></div>{{?}}{{? it[i].tag === 'VcMsg'}}<div class="{{=it[i].firstSendType}}" style="margin-top: 20px">{{? it[i].messageDirection=== 'SEND'}}<div class="aui-text-center history-date">{{=it[i].sentTime}}</div>{{?? it[i].messageDirection=== 'RECEIVE'}}<div class="aui-text-center history-date">{{=it[i].receivedTime}}</div>{{?}}<div class="{{=it[i].secondSendType}}"><img src="../image/demo1.png"></div><div class="{{=it[i].thirdSendType}}"><div class="{{=it[i].fourthSendType}}"></div><div class="aui-chat-status"><i id="voice-length{{=it[i].messageId}}" class="">{{=it[i].content.duration}}"</i></div>{{? it[i].content.duration <= '15'}}<span style="width: {{=it[i].content.duration * 15}}px;height: 30px; border-radius: 5px; background: green"οnclick="playVoice('{{=it[i].messageId}}', '{{=it[i].</span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 14px;">content</span><span style="font-family: Arial, Helvetica, sans-serif;">}}')"></span></span><span style="font-size:14px;">{{??}}<span style="width: 170px;height: 30px; border-radius: 5px; background: green"οnclick="playVoice('{{=it[i].messageId}}', '{{=it[i].content}}')"></span>{{?}}</div></div>{{?}}{{}}}</script></div>
</div>
</body></span>

整个聊天界面的UI就是这些代码了,还是很简单的吧~~当然了,这里只实现了基本的功能,代码后续会不断的更新.

3.JS部分

    在JS部分,要写的就是各种点击方法,数据的加载这些内容了,我们一个个的来看
    到目前为止,我只集成了文本消息,图片消息,语音消息,定位消息(获取发送者位置,通过文本消息发送).
3.1 文本消息的发送
<span style="font-size: 18px;"> </span><span style="font-size:14px;">//发送消息function sengTxtMsg(p) {if (isConnetced) {var para;var rong = api.require('rongCloud2');rong.sendTextMessage({conversationType: 'PRIVATE',targetId: '13644978865',text: p.msg,extra: ''}, function (ret, err) {//                        alert(JSON.stringify((ret)));//这里要判断消息类型,最后设定消息标签.if (ret.status == 'prepare') {var tag;if (ret.result.message.objectName == "RC:TxtMsg") {tag = "TxtMsg";} else if (ret.result.message.objectName == "RC:ImgMsg") {tag = "ImgMsg";} else if (ret.result.message.objectName == "RC:VcMsg") {tag = "VcMsg";} else if (ret.result.message.objectName == "RC:LBSMsg") {tag = "LBSMsg";}para = {firstSendType: "aui-chat-sender",secondSendType: "aui-chat-sender-avatar",thirdSendType: "aui-chat-sender-cont",fourthSendType: "aui-chat-right-triangle",content: ret.result.message.content,tag: tag,//时间戳sentTime: getTrueTime(ret.result.message.sentTime),//发送类型messageDirection: "SEND"};//这里我设置的每隔3分钟才会生成一个时间戳,如果没到三分钟时间为空,就显示不出来了if (!timeTag) {para.sentTime = "";}}else if (ret.status == 'success') {//doT.js的拼接msgObj.push(para);var interText = doT.template($("#message-content-template").text());$("#message-content2").html(interText(msgObj));$("img.lazy").lazyload();document.getElementsByTagName('BODY')[0].scrollTop = document.getElementsByTagName('BODY')[0].scrollHeight;//时间戳判断为false 不再发送timeTag = false;}else if (ret.status == 'error')api.toast({msg: err.code});});} else {api.alert({msg: "未连接到服务器"});}}</span>

ok,再简单的说明一下:通过点击键盘发送按钮,获取到输入框的文本信息,将其作为参数传递到该方法中,通过该方法将消息发送到用户B.

  
可见iPhone模拟器上及时的收到了我发送的文本消息.
3.2 图片消息的发送
//发送图片function sendPictures(index) {var type = "";if (index == "0") {type = 'album';getPicture(type);} else if (index == "1") {type = 'camera';getPicture(type);} else {getLocation();}}//获取图片function getPicture(type) {var para;api.getPicture({sourceType: type,encodingType: 'jpg',mediaValue: 'pic',destinationType: 'url',allowEdit: false,quality: 80,
//            targetWidth: 100,
//            targetHeight: 100,saveToPhotoAlbum: false}, function (ret, err) {if (ret) {var para;var rong = api.require('rongCloud2');rong.sendImageMessage({conversationType: 'PRIVATE',targetId: '13644978865',imagePath: ret.data,extra: ''}, function (ret, err) {
//                            alert(JSON.stringify((ret)));if (ret.status == 'prepare') {var tag;if (ret.result.message.objectName == "RC:TxtMsg") {tag = "TxtMsg";} else if (ret.result.message.objectName == "RC:ImgMsg") {tag = "ImgMsg";} else if (ret.result.message.objectName == "RC:VcMsg") {tag = "VcMsg";} else if (ret.result.message.objectName == "RC:LBSMsg") {tag = "LBSMsg";}para = {firstSendType: "aui-chat-sender",secondSendType: "aui-chat-sender-avatar",thirdSendType: "aui-chat-sender-cont",fourthSendType: "aui-chat-right-triangle",content: ret.result.message.content,tag: tag,//时间戳sentTime: getTrueTime(ret.result.message.sentTime),//发送类型messageDirection: "SEND"};//判断时间if (!timeTag) {para.sentTime = "";}}else if (ret.status == 'progress') {}
//                                api.toast({msg: ret.result.progress});else if (ret.status == 'success') {//时间戳判断为false 不再发送timeTag = false;msgObj.push(para);var interText = doT.template($("#message-content-template").text());$("#message-content2").html(interText(msgObj));$("img.lazy").lazyload();document.getElementsByTagName('BODY')[0].scrollTop = document.getElementsByTagName('BODY')[0].scrollHeight;}else if (ret.status == 'error') {api.toast({msg: "请检查当前网络状态"});}});} else {alert(JSON.stringify(err));}});}
在做一下简要的说明:首先判断图片的来源:(1).用户相册 (2).相机 从相应的来源选取图片后就开始执行图片发送的方法了.
   
   在手机上拍了一张电脑的图片发送后,iPhone模拟器就会收到刚刚收到的图片信息了.
3.3 语音消息发送
//发送语音消息function sendVoiceMsg(para) {var param;var rong = api.require('rongCloud2');rong.sendVoiceMessage({conversationType: 'PRIVATE',targetId: '13644978865',voicePath: para.path,duration: para.duration,extra: ''}, function (ret, err) {
//                    alert(JSON.stringify(ret));if (ret.status == 'prepare') {
//                        api.toast({ msg: JSON.stringify(ret.result.message) });var tag;if (ret.result.message.objectName == "RC:TxtMsg") {tag = "TxtMsg";} else if (ret.result.message.objectName == "RC:ImgMsg") {tag = "ImgMsg";} else if (ret.result.message.objectName == "RC:VcMsg") {tag = "VcMsg";} else if (ret.result.message.objectName == "RC:LBSMsg") {tag = "LBSMsg";}param = {firstSendType: "aui-chat-sender",secondSendType: "aui-chat-sender-avatar",thirdSendType: "aui-chat-sender-cont",fourthSendType: "aui-chat-right-triangle",content: ret.result.message.content,tag: tag,//时间戳sentTime: getTrueTime(ret.result.message.sentTime),//发送类型messageDirection: "SEND"};//判断时间if (!timeTag) {param.sentTime = "";}}else if (ret.status == 'success') {//改变时间戳状态timeTag = false;msgObj.push(param);alert(JSON.stringify(msgObj));alert(JSON.stringify(msgObj[msgObj.length - 1]));var interText = doT.template($("#message-content-template").text());$("#message-content2").html(interText(msgObj));$("img.lazy").lazyload();document.getElementsByTagName('BODY')[0].scrollTop = document.getElementsByTagName('BODY')[0].scrollHeight;}else if (ret.status == 'error') {
//                        api.toast({ msg: err.code });}});}
</span>
发送语音消息前要先调用  api.startRecord()方法记录刚才的录音,最后通过上述方法将语音发送给对方.

 
 上面就是我刚才发送的一连串语音消息了.
3.4 消息的接收
 消息的接收,要用到 rong.setOnReceiveMessageListener这个方法.也就是这个方法会监听你收到的消息.具体代码如下
  
var rong = api.require('rongCloud2');rong.setOnReceiveMessageListener(function (ret, err) {
//            alert(JSON.stringify(ret));var tag;var para;if (ret.result.message.objectName == "RC:TxtMsg") {tag = "TxtMsg";} else if (ret.result.message.objectName == "RC:ImgMsg") {tag = "ImgMsg";} else if (ret.result.message.objectName == "RC:VcMsg") {tag = "VcMsg";} else if (ret.result.message.objectName == "RC:LBSMsg") {tag = "LBSMsg";}para = {firstSendType: "aui-chat-receiver",secondSendType: "aui-chat-receiver-avatar",thirdSendType: "aui-chat-receiver-cont",fourthSendType: "aui-chat-left-triangle",content: ret.result.message.content,tag: tag,receivedTime: getTrueTime(ret.result.message.receivedTime),messageDirection: "RECEIVE"};if (!timeTag) {para.receivedTime = "";}msgObj.push(para);var interText = doT.template($("#message-content-template").text());$("#message-content2").html(interText(msgObj));$("img.lazy").lazyload();document.getElementsByTagName('BODY')[0].scrollTop = document.getElementsByTagName('BODY')[0].scrollHeight;//时间戳状态timeTag = false;});
 上面就是三条通过iPhone模拟器发送的消息,一条语音消息,一条图片消息,一天文字消息.
3.4 获取历史消息
  获取历史消息也用对应的方法.而且这些消息是存在本地的,所以获取很方便
  
//获取最近聊天信息function getRecentConverMsg() {//        alert(num);var rong = api.require('rongCloud2');//先获取之前的聊天记录rong.getHistoryMessages({conversationType: 'PRIVATE',targetId: '13644978865',oldestMessageId: -1,count: 500}, function (ret, err) {//            api.refreshHeaderLoadDone();var arr = [];arr = ret.result;
//            alert(JSON.stringify(arr));//记录最早的时间戳$api.setStorage('time', arr[arr.length - 1].receivedTime);for (var i = arr.length - 1; i >= 0; i--) {if (arr[i].messageDirection == "SEND") {arr[i].firstSendType = "aui-chat-sender";arr[i].secondSendType = "aui-chat-sender-avatar";arr[i].thirdSendType = "aui-chat-sender-cont";arr[i].fourthSendType = "aui-chat-right-triangle";} else {arr[i].firstSendType = "aui-chat-receiver";arr[i].secondSendType = "aui-chat-receiver-avatar";arr[i].thirdSendType = "aui-chat-receiver-cont";arr[i].fourthSendType = "aui-chat-left-triangle";}if (arr[i].objectName == "RC:TxtMsg") {arr[i].tag = "TxtMsg";} else if (arr[i].objectName == "RC:ImgMsg") {arr[i].tag = "ImgMsg";} else if (arr[i].objectName == "RC:VcMsg") {arr[i].tag = "VcMsg";} else if (arr[i].objectName == "RC:LBSMsg") {}//如果时间间隔大于五分钟 加上时间戳if (arr[i].receivedTime - $api.getStorage("time") >= 180000) {
//                   alert("yes");$api.setStorage('time', arr[i].receivedTime);arr[i].receivedTime = getTrueTime(arr[i].receivedTime);arr[i].sentTime = getTrueTime(arr[i].sentTime);} else {arr[i].receivedTime = "";arr[i].sentTime = "";}msgObj.push(arr[i]);}var interText = doT.template($("#message-content-template").text());$("#message-content2").prepend(interText(msgObj));$("img.lazy").lazyload();document.getElementsByTagName('BODY')[0].scrollTop = document.getElementsByTagName('BODY')[0].scrollHeight;});}
 
 
  这样,我可以获取到之前3.31的聊天记录.

  到这里,最基本的功能介绍完了,后续的功能还有很多,比如图片的查看,保存图片到本地,语音的播放等等,都是小问题了,这些代码就不放上来了.
  本文会不断更新,欢希望大家提出更多的意见,一起进步!我的微信656593047,可以加我一起交流!!

  聊天页面代码地址:https://github.com/ZCLegendary/APICloudRongYun

APICloud平台的融云2.0集成相关推荐

  1. 融云 IM SDK 集成 — 刷新会话界面和会话列表界面

    融云 IM SDK 集成 - 刷新会话界面和会话列表界面 最近集成融云 IMkit 发现, 融云 IMkit 提供的 ConversationListFragment 和 ConversationFr ...

  2. php融云开源sdk使用im,融云 IM SDK 集成 --- 刷新会话界面和会话列表界面

    融云 IM SDK 集成 --- 刷新会话界面和会话列表界面 最近集成融云 IMkit 发现, 融云 IMkit 提供的 ConversationListFragment 和 Conversation ...

  3. android腾讯云im刷新会话列表,融云 IM SDK 集成 --- 刷新会话界面和会话列表界面...

    融云 IM SDK 集成 --- 刷新会话界面和会话列表界面 最近集成融云 IMkit 发现, 融云 IMkit 提供的 ConversationListFragment 和 Conversation ...

  4. iOS开发融云即时通讯集成详细步骤

    1.融云即时通讯iOS SDK下载地址   http://rongcloud.cn/downloads  选择iOS   SDK下载 2.进行应用开发之前,需要先在融云开发者平台创建应用,如果您已经注 ...

  5. 融云 IM SDK 集成 --- 刷新会话界面和会话列表界面

    最近集成融云 IMkit 发现, 融云 IMkit 提供的 ConversationListFragment 和 ConversationFragment 都没有提供刷新方法. 我们有个需求是, 使用 ...

  6. 融云发送图片消息_融云IM SDK集成,Server API 发送图片消息时,缩略图生成逻辑说...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 大致压缩过程 原图宽或高只要有一边大于 240 则执行压缩处理 根据缩率图最大尺寸 240.最小尺寸 100 的要求加载图片文件(适度同比缩放原图) 将步 ...

  7. 艾科思移动报表平台与金蝶云之家集成

    一.绑定云之家 本页下面的内容截图中找到相应的配置 二. 云之家团队EID配置 登陆 https://www.yunzhijia.com 云之家平台,获得团队EID信息 三. 轻应用配置 假设您已创建 ...

  8. android 融云定义主题,融云开发者文档

    # 集成推送 融云 SDK 从 2.8.10 版本开始支持 HMS 推送,如您使用的是之前版本的 SDK 请先进行升级. HMS 需要在手机上安装 2.4.0+ 版本的华为移动服务(华为帐号) # 准 ...

  9. 融云IM接入记录(1)——单聊

    前言 本篇为开篇,会涉及很多基本的东西,所以篇幅较大,若是觉得行文啰嗦还请各位大佬不要打我. 本篇目的,是从0开始到实现单聊则打住,后续的特定需求会新开特定篇来写. 若是跟着文章走,遇见了坑请看文末的 ...

最新文章

  1. 又一先锋与世长辞:Dennis Ritchie(C语言之父、Unix之父、图灵奖获得者),享年70岁...
  2. java编程中的点_Java的21个技术点和知识点归纳(转)
  3. Java与WCF交互(一):Java客户端调用WCF服务
  4. angularjs 的笔记
  5. Spring Boot集成Dubbo多模块项目创建与配置
  6. SAP Customer Data Cloud(Gigya)的用户搜索实现
  7. 负载均衡原理与实践详解 第三篇 服务器负载均衡的基本概念-网络基础
  8. 网易云复盘:云计算前端这一年(AngularJS粉慎入)
  9. 魔改部署自己专属的合成大西瓜(三:上线篇<踩坑篇>)
  10. 终结者:终止线程循环的方式
  11. 由找工作引发的读研感悟
  12. 计算机网络实验 Go Back N (带有ACK)滑动窗口协议 C++
  13. 大疆激光雷达livox avia 在ubuntu18.04+ROS中基本使用方法
  14. 使用WLW 写博客的测试
  15. Epson机械手简单实例编程
  16. 虚拟机VMware使用U盘装系统
  17. 《A Transformer-based joint-encoding for Emotion Recognition andSentiment Analysis》论文翻译
  18. Decide.com进军团购业务并推“退差价计划”
  19. 关于NC65通过接口新增客户档案并分配出现的分配组织错误的问题及解决方法
  20. 机器人二弟_“可佳二代”机器人好性感

热门文章

  1. 一个成功的男人如何去追求身边的女人
  2. 骄傲! 咱中国人的区块链技术闯进了国际学术顶会!
  3. 前端微信签名验证工具_微信支付服务商签名验证无误,但是统一下单后服务器返回【签名错误】...
  4. 微信小程序***实现身份验证
  5. 【科研导向】Outer Product-based Neural Collaborative Filtering (ConvNCF)基于外积的神经协同过滤<论文理解代码分析>
  6. 基于Android的房屋租赁系统
  7. UVa1646 - Edge Case
  8. 攻防世界-江苏工匠杯
  9. 码支付易支付等接口对接方法
  10. 减少银行和金融机构的客户流失