先看一下云巴即时消息平台与每个客户端页面之间的关系图
如上图所示,云巴可以理解为客户端页面的外层消息总线,每个客户端首先连接到云巴中注册的应用的连接上,然后在这个应用空间里订阅频道,或者向频道发布消息。发布消息后,则其他的客户端页面就可以相应的收听到消息,并可以根据此消息进行相关的处理。
WeX5中集成的流程:
1.在主页中实现与云巴的连接,然后通过shell将云巴的订阅频道、发布消息等封装成weX5内部的消息总线;
2.每个非主页的页面可以面向shell编程,直接调用shell的发布消息功能(派发)和接收消息(监听注册)功能实现与其他页面的协同。
先看集成云巴的实现代码:
1)引入云巴的sdk,在首页main.w中加入下面的代码
var Yunba = require("../js/yunba-js-sdk"); var yunba_demo = new Yunba({appkey: '584e4abbb09557xxxxx4293d'}); //云巴网站上注册的appkey
2)在模型加载时连接云巴,并封装成shell的服务
//加载即时通讯 Model.prototype.modelLoad = function(event){ var me = this; yunba_demo.init(function (success) { if (success) { yunba_demo.connect(function (success, msg) { if (success){ console.log('连接成功!'); yunba_demo.subscribe({'topic': 'demo_channel'}, function (success, msg) { if (success){ console.log('订阅成功'); }else{ console.log(msg); } }); me.setAlias();//设置别名 }else{ console.log(msg); } }); } }); //监听消息接收 yunba_demo.set_message_cb(function (data) { justep.Shell.fireEvent("retMessage",{message:data.msg,channel:data.topic});//提交收到的即时消息到shell总线 }); justep.Shell.on("subscribeChannel",this.subscribe,this);//提供订阅频道的服务 justep.Shell.on("publishMessage",this.publishMessage,this);//提供发送消息的服务 justep.Shell.on("getAliasList",this.getAliasList,this);//提供查询在线用户列表的服务 }; //订阅频道 Model.prototype.subscribe = function(event){ var channelName = event.channelName; yunba_demo.subscribe({'topic': channelName}, function (success, msg) { if (success){ console.log('订阅成功'); }else{ console.log(msg); } }); }; //设置别名 Model.prototype.setAlias = function(){ var alias = window.sessionData.fperson; yunba_demo.set_alias({'alias': alias}, function (data) { if (data.success) { console.log('设置别名成功'); }else{ console.log(data.msg); } }); }; //发布消息 Model.prototype.publishMessage = function(event){ var channel = event.channel; var message = event.message; yunba_demo.publish({'topic': channel, 'msg': message}, function (success, msg) { if (success) console.log('消息发布成功'); else console.log(msg); }); }; //获取在线人员列表 Model.prototype.getAliasList = function(){ var channel = event.channel; var aliasArry = []; yunba_demo.get_alias_list(channel, function (success, data) { if (success) { data.alias.forEach(function (alias) { yunba_demo.get_state(alias,function(data){ if(data.success){ if(data.data=='online'){ aliasArry.push(data.alias); } } }); }); if(aliasArry.length > 0){ justep.Shell.fireEvent("retAliasList",{alias:aliasArry.join(",")});//提交在线用户列表的结果到shell总线 } } else { console.log(data.error_msg); } }); }; //模型卸载 Model.prototype.modelUnLoad = function(event){ justep.Shell.off("subscribeChannel",this.subscribe); justep.Shell.off("publishMessage",this.publishMessage); justep.Shell.off("getAliasList",this.getAliasList); };
3)需要推送消息或者接收消息的页面如test.w中的代码
//添加监听 Model.prototype.modelParamsReceive = function(event){ justep.Shell.on("retMessage",this.receiveMessage,this); }; //收到消息后的处理逻辑 Model.prototype.receiveMessage = function(event){ var message = event.message; var msg = JSON.parse(message); var faction = msg.faction; var ss = msg.msg; alert("收到2"+faction+",内容是"+ss); }; //发消息 Model.prototype.button2Click = function(event){ var message = JSON.stringify({faction:'notice',msg:'hello'}); justep.Shell.fireEvent("publishMessage",{channel:"demo_channel",message:message}); }; //退出当前 Model.prototype.button1Click = function(event){ justep.Shell.off("retMessage",this.receiveMessage,this); this.owner.close(); };
需要注意的几个地方:
1.云巴sdk中依赖一个socket.io的js,注意要把这个js文件也要下载下来,并检查sdk的js文件中引入的路径是否正确。
2.要想让shell框架生效,必须要创建shellimp,可以在index.w页中创建
var Model = function(){ this.callParent(); this.shellImpl = new ShellImpl(this, { contentsXid : "pages" }); };
3.test页面取消监听不要写在model的unload事件中,实测关闭页面后并没有执行;另外为了保证再次打开页面时能正常加载注册监听方法,shell.on的注册方法要写在modelParamsReceive中,不要写在model的onload方法中