Commit a49d8225 authored by liujiangnan's avatar liujiangnan

feat: 优化壳的加载逻辑和出错重试机制

parent 88aa3d43
...@@ -17,9 +17,15 @@ cc.Class({ ...@@ -17,9 +17,15 @@ cc.Class({
start() { start() {
cc.game.addPersistRootNode(cc.find("cacertNode")); cc.game.addPersistRootNode(cc.find("cacertNode"));
this.setMiddleLayerProgress(`正在初始化配置,请耐心等待`);
const middleLayerData = JSON.parse(this.getMiddleLayerData()); const middleLayerData = JSON.parse(this.getMiddleLayerData());
this.baseUrl = middleLayerData.baseUrl; this.baseUrl = middleLayerData.baseUrl;
this.middleLayerName = middleLayerData.middleLayerName; this.middleLayerName = middleLayerData.middleLayerName;
if (this.baseUrl.indexOf(`staging-`) > 0) {
this.DOMAIN = "http://staging-teach.cdn.ireadabc.com/";
} else {
this.DOMAIN = "http://teach.cdn.ireadabc.com/";
}
cc.debug.setDisplayStats(false); cc.debug.setDisplayStats(false);
const welcomeNode = cc.find(`Canvas/welcome/${this.middleLayerName}`); const welcomeNode = cc.find(`Canvas/welcome/${this.middleLayerName}`);
...@@ -33,56 +39,105 @@ cc.Class({ ...@@ -33,56 +39,105 @@ cc.Class({
); );
} }
const uri = `/api/template/v1/${this.middleLayerName}`; const uri = `/api/template/v2/${this.middleLayerName}`;
this.setMiddleLayerProgress(`正在检查更新`);
this.callNetworkApiGet(this.baseUrl, uri, {}, (respData) => { this.callNetworkApiGet(this.baseUrl, uri, {}, (respData) => {
const data = JSON.parse(respData); const data = JSON.parse(respData).data;
let configData = data.data.conf.web_desktop; let sceneName, version, bondleUrl = "";
if (cc.sys.os == cc.sys.OS_IOS) {
configData = data.data.conf.ios; this.setMiddleLayerProgress(`正在检查配置文件`);
} else if (cc.sys.os == cc.sys.OS_ANDROID) { const templateBaseUrl = `${this.DOMAIN}h5template/${data.name}/v${data.last_version}`;
configData = data.data.conf.android; this.callNetworkApiGet(templateBaseUrl, '/config.json', {}, (conf) => {
} conf = JSON.parse(conf);
sceneName = conf.android.sceneName;
cc.assetManager.loadBundle( version = "";
configData.bondleUrl, bondleUrl = `${templateBaseUrl}/web_desktop`;
{ version: configData.version }, if (cc.sys.isNative && cc.sys.os == cc.sys.OS_IOS) {
async (err, bundle) => { sceneName = conf.ios.sceneName;
version = conf.ios.version;
bondleUrl = `${templateBaseUrl}/ios/${conf.ios.sceneName}`;
}
if (cc.sys.isNative && cc.sys.os == cc.sys.OS_ANDROID) {
sceneName = conf.android.sceneName;
version = conf.android.version;
bondleUrl = `${templateBaseUrl}/android/${conf.ios.sceneName}`;
}
this.setMiddleLayerProgress(`正在加载最新的配置文件`);
cc.assetManager.loadBundle( bondleUrl, { version: version }, async (err, bundle) => {
if (err) { if (err) {
console.log(err); console.log(err);
return; return;
} }
bundle.loadScene(sceneName, null, (finish, total, item) => {
bundle.loadScene(configData.sceneName, null, null, (e, scene) => { const p = Math.floor(finish / total * 100);
this.setMiddleLayerProgress(`正在下载资源 ${p}%`);
}, (e, scene) => {
if (e) { if (e) {
console.log(e); console.log(e);
return; return;
} }
this.setMiddleLayerProgress(`资源下载完成,正在更新`);
cc.director.runScene(scene); cc.director.runScene(scene);
}); });
} }
); );
});
}); });
}, },
callNetworkApiGet(baseUrl, uri, data, callBack) { async callNetworkApiGet(baseUrl, uri, data, callBack) {
let queryStr = "?"; let queryStr = '?';
const params = [];
for (const key in data) { for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) { if (Object.hasOwnProperty.call(data, key)) {
const value = data[key]; params.push(`${key}=${data[key]}`);
queryStr += `${key}=${value}`; }
} }
queryStr += params.join("&");
const url = `${baseUrl}${uri}${queryStr}`;
// 如果请求失败 最多尝试5次重连
for(let i=0; i<5; i++) {
const result = await this.newXMLHttpRequest(url)
if(result != null) {
// 正常响应
callBack(result)
break
} else {
// 5秒有没有响应 - 重新请求
this.setMiddleLayerProgress(`请求失败,重试第${i+1}次`)
} }
}
},
newXMLHttpRequest(url) {
return new Promise((resovle, reject) => {
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
// 设置定时器 5秒终止连接
let timeoutId = setTimeout(() => {
xhr.abort();
resovle(null)
}, 5000);
xhr.onreadystatechange = () => { xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && xhr.status >= 200 && xhr.status < 400) { if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {
callBack(xhr.responseText); // 如果有定时器, 清除定时器
if(timeoutId) {
clearTimeout(timeoutId);
timeoutId = null;
}
resovle(xhr.responseText);
} }
}; };
const url = `${baseUrl}${uri}${queryStr}`;
console.log("url = " + url); console.log('url = ' + url);
xhr.open("GET", url, true); xhr.open('GET', url, true);
xhr.send(); xhr.send();
})
}, },
getMiddleLayerData() { getMiddleLayerData() {
...@@ -102,8 +157,28 @@ cc.Class({ ...@@ -102,8 +157,28 @@ cc.Class({
} else { } else {
return JSON.stringify({ return JSON.stringify({
baseUrl: "http://staging-openapi.iteachabc.com", baseUrl: "http://staging-openapi.iteachabc.com",
middleLayerName: "middleLayer_for_debug", middleLayerName: "middleLayer_for_JJ",
}); });
} }
}, },
setMiddleLayerProgress(str = "") {
if (cc.sys.isNative && cc.sys.os == cc.sys.OS_IOS) {
return jsb.reflection.callStaticMethod(
"RootViewController",
"middleLayerProgress:",
str
);
} else if (cc.sys.isNative && cc.sys.os == cc.sys.OS_ANDROID) {
return jsb.reflection.callStaticMethod(
"com/iplayabc/cocos/AppActivity",
"middleLayerProgress",
"(Ljava/lang/String;)Ljava/lang/String;",
str
);
} else {
console.log(`加载进度:${str}`);
return null;
}
},
}); });
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment