上面是SAAS消息版子应用嵌入界面,当我们点击上图中的提醒、待办事项或者未完成工作区域都将进入子应用或打开新页面,换句话就是子应用的入口。这三项是子应用预设好的消息入口,通过统一接口实现。
用户通过uexEMM.login登录emm后会返回这个用户已授权可用子应用appList,appList中包含app的appId。
我们规定统一规则获取每一个子应用对外提供的msgList(如同上图显示的三项入口)。规则如下: 请求接口:租户简称+'.'+appId+".saas.appcan.cn/emoa/message" 请求参数:tenantId(租户Id),accessToken(emm登录返回的token) 请求方式:post 返回数据:
{
"status" : "000",
"msg" : {
"list" : [{
"createdAt" : "2016-04-08 15:59:00",
"title" : "方法反反复复反复反复",
"total" : 38,
"url" : {
"appId" : "EMOA",
"action" : "openwindow",
"param" : {
"data" : "todoList.html"
}
},
"icon" : "https://42.96.172.127:18443/oaapp/icon/todo1.png",
"header" : "未完成工作"
}, {
"title" : "苏荣秋的请假申请单!",
"createdAt" : "2016-04-20 16:38",
"total" : 104,
"url" : {
"appId" : "EMOA",
"action" : "openwindow",
"param" : {
"data" : "todealList.html"
}
},
"icon" : "https://42.96.172.127:18443/oaapp/icon/todo.png",
"header" : "待办事项"
}, {
"title" : "地铁7号线完成地铁7号线完成",
"createdAt" : "2016-04-26 14:26:12",
"total" : 34,
"url" : {
"appId" : "EMOA",
"action" : "openwindow",
"param" : {
"data" : "remindList.html"
}
},
"icon" : "https://42.96.172.127:18443/oaapp/icon/remind.png",
"header" : "提醒"
}
]
}
}
上面返回的数据中url下action可以处理不同情况:
注:在上述这个子应用中,在这个接口中我们还将子应用的登录写到了里面。
上面是应用列表显示页面,这里可以进入应用并打开应用功能清单页面。在这里我们通过uexAppStoreMgr
插件进行处理。
uexAppStoreMgr.open(storeIp);//storeIp为emm提供的应用商店地址,
此地址如果不在代码中写死也可以在协同开发上的打包开关设置,uexAppStoreMgr插件提供获取此配置的地址方法 具体方法如下:
uexAppStoreMgr.cbGetAppStoreHost = function(a,b,c){
//C为协同开发上配置的地址
}
uexAppStoreMgr.getAppStoreHost();
目前的saas版的正益工作是写死的应用商店地址。
uexAppStoreMgr.cbGetAppList = function(mid,type,data){
//返回应用的列表信息,包括类型,是否已安装、版本等信息,此处添加处理代码即可,通常通知显示应用的页面显示此应用列表
}
var dataJson={"type":"searchAppList","key":""};//获取所有的应用,当type为installAppFromAllList时是获取已安装的应用
uexAppStoreMgr.getAppList(JSON.stringify(dataJson));
uexAppStoreMgr提供方法loadwidget
,此方法会自动处理widget和native类型的应用,如果没下载将自动进行下载,如果已下载,native类型的将自动启动,widget类型的可以在loadwidget的回调方法中启动widget。代码如下:
uexAppStoreMgr.cbLoadWidget = function(a, b, c) {
var obj = JSON.parse(c);
var status = obj.status;
//根据status的不同处理代码
if (status == 0) {
} else if (status == 1) {
appcan.window.openToast('正在打开');
opening = 1;
uexWidget.cbStartWidget = function(opId, dataType, data) {
opening = 0;
appcan.window.closeToast();
}
uexWidget.startWidget(obj.data.appId, '10', '', 参数, '250', obj.data.appKey);
} else if (status == 2) {
uexAppStoreMgr.loadWidget(obj.data);
}
}
如果未安装将进行下载,下载有回调,可以提示用户
uexAppStoreMgr.onStartDownload = function(){
uexAppStoreMgr.cbGetProgress = function(a, b, c) {
//此处c为下载的进度
}
}
由于应用的类型还有一种是web类型的,如果此种类型可自行处理,如打开新窗口,在新窗口中打开浮动窗口,浮动窗口的url为web地址。
mas等子应用的服务都在docker中,这些服务对外提供统一的域名规则:
租户简称+"."+appId+".saas.appcan.cn/
根据此规则,我们就可以将子应用saas化访问。