先看一下雲巴即時消息平台與每個客戶端頁面之間的關系圖

如上圖所示,雲巴可以理解為客戶端頁面的外層消息總線,每個客戶端首先連接到雲巴中注冊的應用的連接上,然后在這個應用空間里訂閱頻道,或者向頻道發布消息。發布消息后,則其他的客戶端頁面就可以相應的收聽到消息,並可以根據此消息進行相關的處理。
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方法中
