Commit a49d8225 authored by liujiangnan's avatar liujiangnan

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

parent 88aa3d43
......@@ -17,9 +17,15 @@ cc.Class({
start() {
cc.game.addPersistRootNode(cc.find("cacertNode"));
this.setMiddleLayerProgress(`正在初始化配置,请耐心等待`);
const middleLayerData = JSON.parse(this.getMiddleLayerData());
this.baseUrl = middleLayerData.baseUrl;
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);
const welcomeNode = cc.find(`Canvas/welcome/${this.middleLayerName}`);
......@@ -33,58 +39,107 @@ cc.Class({
);
}
const uri = `/api/template/v1/${this.middleLayerName}`;
const uri = `/api/template/v2/${this.middleLayerName}`;
this.setMiddleLayerProgress(`正在检查更新`);
this.callNetworkApiGet(this.baseUrl, uri, {}, (respData) => {
const data = JSON.parse(respData);
let configData = data.data.conf.web_desktop;
if (cc.sys.os == cc.sys.OS_IOS) {
configData = data.data.conf.ios;
} else if (cc.sys.os == cc.sys.OS_ANDROID) {
configData = data.data.conf.android;
}
cc.assetManager.loadBundle(
configData.bondleUrl,
{ version: configData.version },
async (err, bundle) => {
if (err) {
console.log(err);
return;
}
const data = JSON.parse(respData).data;
let sceneName, version, bondleUrl = "";
bundle.loadScene(configData.sceneName, null, null, (e, scene) => {
if (e) {
console.log(e);
this.setMiddleLayerProgress(`正在检查配置文件`);
const templateBaseUrl = `${this.DOMAIN}h5template/${data.name}/v${data.last_version}`;
this.callNetworkApiGet(templateBaseUrl, '/config.json', {}, (conf) => {
conf = JSON.parse(conf);
sceneName = conf.android.sceneName;
version = "";
bondleUrl = `${templateBaseUrl}/web_desktop`;
if (cc.sys.isNative && cc.sys.os == cc.sys.OS_IOS) {
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) {
console.log(err);
return;
}
cc.director.runScene(scene);
});
}
);
bundle.loadScene(sceneName, null, (finish, total, item) => {
const p = Math.floor(finish / total * 100);
this.setMiddleLayerProgress(`正在下载资源 ${p}%`);
}, (e, scene) => {
if (e) {
console.log(e);
return;
}
this.setMiddleLayerProgress(`资源下载完成,正在更新`);
cc.director.runScene(scene);
});
}
);
});
});
},
callNetworkApiGet(baseUrl, uri, data, callBack) {
let queryStr = "?";
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
const value = data[key];
queryStr += `${key}=${value}`;
}
}
const xhr = new XMLHttpRequest();
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && xhr.status >= 200 && xhr.status < 400) {
callBack(xhr.responseText);
}
};
async callNetworkApiGet(baseUrl, uri, data, callBack) {
let queryStr = '?';
const params = [];
for (const key in data) {
if (Object.hasOwnProperty.call(data, key)) {
params.push(`${key}=${data[key]}`);
}
}
queryStr += params.join("&");
const url = `${baseUrl}${uri}${queryStr}`;
console.log("url = " + url);
xhr.open("GET", url, true);
xhr.send();
// 如果请求失败 最多尝试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();
// 设置定时器 5秒终止连接
let timeoutId = setTimeout(() => {
xhr.abort();
resovle(null)
}, 5000);
xhr.onreadystatechange = () => {
if (xhr.readyState == 4 && (xhr.status >= 200 && xhr.status < 400)) {
// 如果有定时器, 清除定时器
if(timeoutId) {
clearTimeout(timeoutId);
timeoutId = null;
}
resovle(xhr.responseText);
}
};
console.log('url = ' + url);
xhr.open('GET', url, true);
xhr.send();
})
},
getMiddleLayerData() {
if (cc.sys.isNative && cc.sys.os == cc.sys.OS_IOS) {
return jsb.reflection.callStaticMethod(
......@@ -102,8 +157,28 @@ cc.Class({
} else {
return JSON.stringify({
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