# 10、apiCloud对接

# (ios & android)通用

# h5代码实现

点击查看代码
function apiCloud(name, postMessageData = {}) {
		return new Promise((resolve, reject) => {
			let data = {
				method: name,
				data: postMessageData,
				id: name + new Date().getTime()
			}
			try {
				window[data.id] = res => {
					delete window[data.id];
					resolve(res);
				}
			} catch(e) {
				reject(e);
			}
			api.sendEvent({
				name: 'comm',
				extra: JSON.stringify(data)
			});
		})
	}

h5传给apicloud的json数据
{
    "method":"jumpapp",
    "data":{
        "url":"https://www.baidu.com"
    },
    "id":"jumpapp1608612711261"
}

method: h5要调用apicloud的方法
data: method方法所需要的的参数
id: apicloud回调h5的方法名

例子: 
apiCloud('jumpapp', {
	url: 'https://www.baidu.com'
}).then(res => {
    
})

res为apicloud的回调值 对象格式

# apiCloud端代码实现

点击查看代码
api.openFrame({
	name: 'detailframeweb',
	url: 'https://www.baidu.com'
});
api.addEventListener({
	name: 'comm'
}, function(ret, err) {
	let res = ret.value;
	switch(res.method) {
		case "jumpapp":
			//apicloud处理业务如: 打开app, 打开浏览器, 下载app, 获取用户设备信息等等
			//回传给h5
			let data = JSON.stringify({
				method: res.method,
				data: {},
				id: res.id
			})
			let js = `(function(){${res.id}(${data})})()`;
			console.log(js, data)
			api.execScript({
				frameName: 'detailframeweb',
				script: js
			});
			break;
	}
})

ret: h5传给apicloud的数据
value = {
	"method":"jumpapp",
	"data":{
		"url":"https://www.baidu.com"
	},
	"id":"jumpapp1608612711261"
}
data: apicloud回传给h5的数据, 已js注入自执行函数的方式传给h5
{
    method: 告诉h5是那个方法的回调
    data: 回调给h5的具体数据
    id: 回调函数的唯一id
}

注意事项: 
1.api.openFrame函数中parasm参数的name值需要和api.execScript函数params的name值一致, 否则js会注入失败
2.回传给h5的data为一个对象格式的json字符串, 否则h5端则无法正确解析