【APICloud平台融云模块教程第一弹】聊天会话的实现及UI

闲来无事写个教程给大家。
实现功能:融云会话聊天及UI,发送表情消息
使用模块:rongCloud   chatBox
融云的各种申请我就不说了。
教程开始:因为融云为第三方模块,每次调试都得需要云编译,建议大家先把UI和基本代码做好。
JS插件使用:zepto.min.js
一、UI的制作
效果图:

CSS代码:
/*会话消息容器*/
#messageList { padding: 15px 0; overflow: hidden;}
/*接收消息类,左侧*/
.receiver{ clear:both;}
.receiver .receiver-avatar{float: left;}        
.receiver .receiver-avatar img { width: 50px; height: 50px;}
.receiver .receiver-cont{ float: left;margin: 0 20px 10px 15px; padding: 10px; border-radius:7px; max-width: 60%; position: relative;}
.receiver .status { width: 30px; height: 30px; position: absolute; right: -35px; top: 3px;}
/*发送消息类,右侧*/
.sender{clear:both;}
.sender .status { width: 30px; height: 30px; position: absolute; left: -35px; top: 3px; font-size: 18px; font-weight: 700; color: #990000;}
.sender .status img { width: 30px; height: 30px;}
.sender .sender-avatar{float: right;}
.sender .sender-avatar img { width: 50px; height: 50px;}
.sender .sender-cont{float:right; margin: 0 10px 10px 20px; padding: 10px; border-radius:7px; color: #ffffff; max-width: 60%; position: relative;}
.left_triangle{ height:0px; width:0px; border-width:8px; border-style:solid; border-color:transparent #faff72 transparent transparent; position: absolute; left:-16px; top:6px; }
.right_triangle{ height:0px; width:0px; border-width:8px; border-style:solid; border-color:transparent transparent transparent #15b5e9; position: absolute; right:-16px; top:6px;}
<div id="messageList">
<div class="sender">
        <div class="sender-avatar">
                <img src="chatTemplateExample2_files/cat.jpg">
        </div>
        <div class="sender-cont">
                <div class="right_triangle"></div>
                <span><img src="发送用户头像" width="30" height="30">发送内容</span>
                <div class="status"><!--发送状态--></div>
        </div>

</div>
<div class="receiver">
        <div class="receiver-avatar">
                <img src="对方用户头像">
        </div>
        <div class="receiver-cont">
                <div class="left_triangle"></div>
                <span>发送内容</span>
        </div>
</div>
</div>

上面的就直接拿去复制使用了
----------------------------------------------------------
二、融云的链接
融云的链接需要用到token了,我们可以在自己的服务器搭建一个生成获取token的方法。这个方法在融云的文档里面有介绍,以php为例
生成用户的token要使用到用户ID,用户昵称,用户头像。
网站上的每个用户都需要对应一个token,可以将这个token写入到自己的用户表中,以便调取使用。
在APP上使用融云聊天时token时只需要获取自己的token就可以。
APP我使用的方法是用户登录后get获取token然后写入到本地数据库中,然后从本地调用(这样有点安全性问题)
class类
class ServerAPI{
    private $appKey;                //appKey
    private $appSecret;             //secret
    const   SERVERAPIURL = ‘https://api.cn.rong.io‘;    //请求服务地址
    private $format;                //数据格式 json/xml

/**
     * 参数初始化
     * @param $appKey
     * @param $appSecret
     * @param string $format
     */
    public function __construct($appKey,$appSecret,$format = ‘json‘){
        $this->appKey = $appKey;
        $this->appSecret = $appSecret;
        $this->format = $format;
    }

/**
     * 获取 Token 方法
     * @param $userId   用户 Id,最大长度 32 字节。是用户在 App 中的唯一标识码,必须保证在同一个 App 内不重复,重复的用户 Id 将被当作是同一用户。
     * @param $name     用户名称,最大长度 128 字节。用来在 Push 推送时,或者客户端没有提供用户信息时,显示用户的名称。
     * @param $portraitUri  用户头像 URI,最大长度 1024 字节。
     * @return json|xml
     */
    public function  getToken($userId,$name,$portraitUri) {
        try{
            if(empty($userId))
                throw new Exception(‘用户 Id 不能为空‘);
            if(empty($name))
                throw new Exception(‘用户名称 不能为空‘);
            if(empty($portraitUri))
                throw new Exception(‘用户头像 URI 不能为空‘);

$ret = $this->curl(‘/user/getToken‘,array(‘userId‘=>$userId,‘name‘=>$name,‘portraitUri‘=>$portraitUri));
            if(empty($ret))
                throw new Exception(‘请求失败‘);
            return $ret;
        }catch (Exception $e) {
            print_r($e->getMessage());
        }
    }
}
下面开始聊天的程序,大体思路为:
打开好友对话窗口-----加载融云模块----初始化融云-----连接融云(我的token)----发送消息(对方用户ID)
                                |----------加载----初始化-----链接-----监听消息
首先我们来先实现给指定用户发送消息(结合chatBox)
JS
1.获取指定用户ID,一般情况下是从其他页面传递过来的(比如好友列表),加载chatBox模块
下面代码里面有三个自定义函数,
getMessage(mytoken);---------监听获取最新消息
sendMessage(mytoken,sendMsg);-------发送消息
getImgsPaths(sourcePathOfChatBox, callback);-------表情图片类的处理
这三个后面会有单独说明

var touserid = null;好友ID全局
apiready = function(){
   touserid = api.pageParam.touserid;//好友用户ID
   var mytoken = $api.getStorage(‘token‘);//我的token
   getMessage(mytoken);//获取最新消息,后面会有专门介绍
   //引入chatbox
        var chatBox = api.require(‘chatBox‘);
        var sourcePath = "widget://image/emotion";//表情存放目录
        var emotionData;//存储表情

getImgsPaths(sourcePath, function (emotion) {
                emotionData = emotion;
        })
        chatBox.open({
                //按钮类,图片URL就根据实际情况来
                switchButton:{
                faceNormal:"widget://image/chatBox_face1.png",
                faceHighlight:"widget://image/chatBox_face1.png",
                addNormal: "widget://image/chatBox_add1.png",
                addHighlight: "widget://image/chatBox_add1.png",
                keyboardNormal: "widget://image/chatBox_key1.png",
                keyboardHighlight: "widget://image/chatBox_key1.png"
            },
            sourcePath: sourcePath
        },function(ret,err){
                /*
                *1.用户输入文字或表情
                */
                /*用户输入表情或文字*/
                /*使用读文件方法,读json*/
                var sendMsg = transText(ret.msg);
                //发送消息
                sendMessage(mytoken,sendMsg);//发送消息的函数,后面会有介绍
                /*将文字中的表情符号翻译成图片,并可自定义图片尺寸*/
                function transText(text, imgWidth, imgHeight){
                        var imgWidth = imgWidth || 30;
                        var imgHeight = imgHeight || 30;
                        var regx = /\[(.*?)\]/gm;
                        var textTransed = text.replace(regx,function(match){
                                var imgSrc = emotionData[match];
                                if(!imgSrc){
                                        //说明不对应任何表情,直接返回
                                        return match;
                                }
                                var img = "<img src="+imgSrc+" width="+imgWidth+" height="+imgHeight+">";
                                return img;
                        });
                        return textTransed;
                }
        });
}
这样页面就成功加载了chatBox模块,下面先介绍一下表情图片类的处理函数,看不明白的就直接拿去使用了
/*一个工具方法:可以获取所有表情图片的名称和真实URL地址,以JSON对象形式返回。其中以表情文本为 属性名,以图片真实路径为属性值*/
function getImgsPaths(sourcePathOfChatBox, callback){
        var jsonPath = sourcePathOfChatBox + "/emotion.json";//表情的JSON数组
        api.readFile({
                path: jsonPath
        },function(ret,err){
                if(ret.status){
                        var emotionArray = JSON.parse(ret.data);
                        var emotion = {};
                        for(var idx in emotionArray){
                                var emotionItem = emotionArray[idx];
                                var emotionText = emotionItem["text"];
                                var emotionUrl = "../image/emotion/"+emotionItem["name"]+".png";
                                emotion[emotionText] = emotionUrl;
                        }
                        /*把emotion对象 回调出去*/
                        if("function" === typeof(callback)){
                                callback(emotion);
                        }
                }
        });
}

2.使用融云发送消息
先加载融云模块,在初始化,初始化后链接,发送消息
sendMessage(mytoken,content);---我的token,消息内容

//发送消息
function sendMessage(mytoken,content){
        var rong = api.require(‘rongCloud‘);
        rong.init();//初始化
        rong.connect({
                    token: mytoken//我的token
            },
            function(ret, err){
                        if(ret.status=="success"){
                                rong.sendTextMessage({
                                        conversationType: ‘PRIVATE‘,//类型
                                        targetId: touserid,//好友ID,因为是设置了全局,所以直接拿来使用了
                                        text: content,//消息内容
                                        extra: ‘‘
                                    }, function (ret, err) {
                                        if (ret.status == ‘prepare‘){
                                                //准备发送
                                                $("#messageList").append(‘<div class="sender"><div class="sender-avatar"><img src="http://www.qinghuwai.com/uploadfile/member/1/avatar/1.jpg"></div><div class="sender-cont"><div class="right_triangle"></div><span>‘+ret.result.message.content.text+‘</span><div id="status_‘+ret.result.message.messageId+‘" class="status">准备发送时的状态,可以加载一张loading图片</div></div></div>‘);
                                        }else if (ret.status == ‘success‘){
                                                //发送成功后移除loading
                                                $("#status_"+ret.result.message.messageId).remove();
                                        }else if (ret.status == ‘error‘){
                                                //发送失败后的护理,一般讲loading图片变为 “!”;
                                                $("#status_"+ret.result.message.messageId).html("!");
                                        }    
                                    }
                                );
                        };
                }
        );
        
}
3.监听最新消息
//接受消息
function getMessage(mytoken){
        var rong = api.require(‘rongCloud‘);
        rong.init();
        rong.setOnReceiveMessageListener(function (ret, err) {                if(ret.result.message.targetId==touserid){
                    $("#messageList").append(‘<div class="receiver"><div class="receiver-avatar"><img src="http://www.qinghuwai.com/uploadfile/member/6/avatar/6.jpg"></div><div class="receiver-cont"><div class="left_triangle"></div><span>‘+ret.result.message.content.text+‘</span></div></div>‘);
                 }
        })
        rong.connect({
                    token: mytoken
            },
            function(ret, err){}
        );
}

到此就差不多完成了,云编译一下看小效果,不明白的欢迎楼下提问

时间: 2024-08-25 11:40:26

【APICloud平台融云模块教程第一弹】聊天会话的实现及UI的相关文章

AndroidStudio使用教程(第一弹)

AndroidStudio使用教程(第一弹) Android Studio是一套面世不久的IDE(即集成开发环境),免费向谷歌及Android的开发人员发放.Android Studio以IntelliJ IDEA为基础, 旨在取代Eclipse和ADT(Android开发者工具)为开发者提供更好的开发工具. 运行相应速度.智能提示.布局文件适时多屏预览等都比Eclipse要强,但也不能说全部都是有点现在Studio中无法在一个窗口管理多个Project, 每个Project都要打开一个窗口,或

我的长大app开发教程第一弹:Fragement布局

在接下来的一段时间里我会发布一个相对连续的Android教程,这个教程会讲述我是如何从零开始开发"我的长大"这个Android应用. 在开始之前,我先来介绍一下"我的长大":这是一个校园社交app,准确点说是一个资讯+社交的校园app.目标用户是在校大学生,老师.项目初期提供的功能有:校园资讯,校园服务,校园问答,核心的社交功能会在稍后视情况推出.我们的竞争对手有微信,QQ,空间,微博,知乎...等杀手级应用,所以我们压力还是有点大,但是,还有机会(逃...当我没说

apicloud+融云实现即时通讯

请尊重作者的辛勤劳动!!! 使用apicloud开发已经快2个月了,起初的目的就是为了实现安卓和苹果的兼容,属于一个试验项目,究竟apicloud是否能够满足公司的要求?最 终看来还是不错的,使用apicloud+融云实现了类似微信即时通讯的功能.看到有很多后来的人依然在这块挣扎,我就把自己的实现思路和成果分享出来和 大家一起交流一下,我也是第一次做手机开发,有很多经验不足的地方,希望大家能够直接指出来,我也不断完善自己的产品.     这次没有使用本地数据库,所有数据都是从融云和服务器获取,会

融云CEO韩迎:如何基于云通讯构建企业竞争力

近日,"第四届互联网+高峰论坛暨大数据应用峰会 CIO 时代中国行苏州站"活动成功举行.本次论坛由中国新一代 IT 产业推进联盟.江苏省企业信息化协会指导,CIO 时代学院.苏州工业园区人工智能产业协会.江苏省企业信息化协会苏州代表处联合主办,吸引了来自全国各地的近150名行业翘楚.知名 CIO 及专家学者参会,与会者围绕"新 IT 助力制造业再增长"的主题进行深入沟通与探讨. 活动现场 融云 CEO 韩迎受邀参会,并就"如何基于云通讯构建企业移动信息化竞

黑马程序员:赶紧下载iOS10开发教程第二弹

虽然6月13日WWDC2016的发布会结束了,但是本届大会的开发者session环节还在持续进行着.黑马程序员本着对技术的狂热,对学生负责的态度,仍然坚持每天对课程进行深入的研发.本文主要是黑马程序员对iOS 10 中SDK所更新的主要内容进行总结.根据黑马程序员惯例,在文章的最后,有相关相关教学视频及Demo会有分享链接,供各位下载! 1.Grand Center Dispatch GCD 在本次一更新主要有以下内容: ?创建私有队列 ?安排异步执行的工作项目(items) ?GCD能自动将工

IOS集成融云SDK即时通讯

相信大家在项目中会用到即时通讯功能,自己去写的话会需要前后台合作,会大大加大开发的周期,所以考虑使用第三方的即时通讯平台,比如现在有融云,环信....等等等!楼主在项目开发过程中使用到过环信和融云,今天就为大家写下IOS端集成环信的方法和可能会遇到的问题.(融云提供聊天会话列表和聊天界面并且允许我们自定义,所以很方便的). 一:准备工作        1.首先打开融云官网http://www.rongcloud.cn/,注册自己的账户,并登陆.        2.点击左边创建应用,在打开的小窗口

APICloud平台的融云2.0集成

融云2.0的官方文档地址:http://docs.apicloud.com/端API/开放SDK/rongCloud2 项目需要IM模块,最后还是选择了融云.在iOS原生开发中,融云sdk集成了聊天界面,给开发者提供了很大的便利,但是在apicloud平台上,由于开发者应用IM的场景各异,需求不统一,所以官方没有将聊天界面集成到模块中. 因此我选择了AUI这套专门为apicloud提供的前端开发框架进行IM界面的搭建.AUI官方地址:http://www.auicss.com. 这套框架集成了很

新一代免费云平台Nano: 3分钟构建你的私有云-图文教程

前言 虚拟化是目前很多开发和运维同学的刚需,但是目前的产品要么笨重繁杂,资源消耗高学习困难,要么收费昂贵,于是就有了Nano这个项目,一方面是为了自己用起来舒服,另一方面也是让不满现有产品的同学们有更多选择. Nano完全用GO开发,底层虚拟化使用免费的KVM,基于自己十几年大型分布式系统的开发经验,希望把Nano设计成一个高度自动化,无需人工管理配置,轻巧简便同时兼顾性能与稳定性的IaaS平台. Nano提供了丰富的REST API接口支持,同时也提供了完整的Web管理门户,无论是定制自己产品

融云开发漫谈:你是否了解Go语言并发编程的第一要义?

2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻译引进国内,并迅速引起广泛关注,本书由融云的一位研发工程师赵晨光联合翻译,旨在帮助Go语言学习者了解并发设计的模式和应用场景,更加深入理解Go语言特性,从而提升自身技术研发水平. “Go语言并发编程快速入门的第一要义” <Go语言并发之道>主要讲解了Golang语言的最佳实践和模式,引导读者如何选