/* node version_generator.js -v 1.0.0 -u https://jianmiau.tk/Resources/App/JMKA/update/remote-assets/ -s build/jsb-default/remote-assets -d remote-assets */ import { CoroutineV2 } from "./Engine/CatanEngine/CoroutineV2/CoroutineV2"; import { System_Eevent } from "./Engine/CatanEngine/CSharp/System/System_Eevent"; import LocalStorageData from "./Engine/Data/LocalStorageData"; import { Enum_HUDM } from "./HUD/Enum_HUDM"; import HUDM from "./HUD/HUDM"; import NativeClass from "./NativeClass"; import UpdatePanel from "./UpdatePanel"; import BusinessTypeSetting from "./_BusinessTypeSetting/BusinessTypeSetting"; const { ccclass, property } = cc._decorator; @ccclass export default class Manager extends cc.Component { //#region 外調參數 @property({ type: cc.WebView }) public webview: cc.WebView = null; @property({ type: cc.Node }) public BG: cc.Node = null; @property({ type: cc.Node }) public UpdatePanel: cc.Node = null; @property({ type: cc.Label }) public Version: cc.Label = null; //#endregion //#region Lifecycle protected onLoad(): void { CoroutineV2.Single(this._init()).Start(); } private *_init(): IterableIterator { new LocalStorageData(); let isNewBundle: boolean = yield* this.CheckBundleVersion(); console.log(`BUNDLE VERSION: ${LocalStorageData.Instance.BundleVersion}`); console.log(`COMPILE VERSION: ${BusinessTypeSetting.COMPILE_VERSION}`); this.Version.string = `Ver ${BusinessTypeSetting.COMPILE_VERSION}`; BusinessTypeSetting.UsePatch = `https://jianmiau.tk/Resources/App/JMKA/update/remote-assets/${BusinessTypeSetting.MajorVersion}.${BusinessTypeSetting.MinorVersion}`; cc.debug.setDisplayStats(false); new NativeClass(this.webview); if (cc.sys.isNative && isNewBundle) { new HUDM(this.UpdatePanel.getComponentInChildren(UpdatePanel), isNewBundle); let needUpdateData: Enum_HUDM.NeedUpdateDataObj = yield* HUDM.Instance.CheckUpdate(); if (needUpdateData.IsNeedUpdate) { this.UpdatePanel.active = true; return; } else { this.UpdatePanel.active = false; } } let self: this = this; // this._text_to_Speech = new Text_to_Speech(); let href: string = window.location.href; // let url: string = `http://220.134.195.1/public/bonus_casino/html5/jianmiau/Test/?host=${href}&v=${Date.now()}`; // let url: string = `https://karolchang.github.io/jm-expense-vue-ts/?host=${href}&ignore=${Date.now()}`; // let url: string = `http://karol.jianmiau.cf/jm-expense-vue-ts/?v=${Date.now()}`; let url: string = `https://jm-expense-2022.firebaseapp.com/login?host=${href}&v=${Date.now()}`; this.webview.url = url; this.webview.node.active = true; cc.view.setResizeCallback(this._resize.bind(this)); this._resize(); // Set EventListener window.addEventListener("message", function (e: MessageEvent): void { let data: any = e.data; let method: string = data.method; let value: any = data.value; if (method) { self.Birdge(method, ...value); } }, false); if (!window["Bridge"]) { window["Bridge"] = function (method: string = "", value: string = ""): void { self.Birdge(method, value); }; } let scheme: string = "jmka"; this.webview.setJavascriptInterfaceScheme(scheme); this.webview.setOnJSCallback((sender: any, url: any) => { let content: string = decodeURI(url.split(`${scheme}://?data=`)[1]); try { let data: JSON = JSON.parse(content); let method: any = data["method"]; let value: any = data["value"]; if (method) { self.Birdge(method, ...value); } } catch (error) { console.error(error); } }); } /** 跨版本溝通 * @example * CallParent('Speak', '我愛豬涵') */ public Birdge(method: string, value: string = ""): void { let self: this = this; if (method && self[method]) { if (value) { self[method](value); return; } else if (self[method]) { self[method](); return; } } console.log(`not function: ${method}, value: ${value}`); } public CloseBG(): void { this.BG.destroy(); } public Log(msg: string): void { console.log(msg); } public Speak(msg: string): void { // this._text_to_Speech.speak(msg); NativeClass.Instance.TTS_Play(msg); } public onLoadOK(): void { CoroutineV2.Single(this.GetFCMToken()).Start(); } public *GetFCMToken(): IterableIterator { const FCMToken: string = NativeClass.Instance.GetFCMToken(); if (cc.sys.os === cc.sys.OS_IOS && !FCMToken) { yield CoroutineV2.WaitTime(1); yield this.GetFCMToken(); return; } console.log(`FCMToken ${FCMToken}`); NativeClass.Instance.CocosBridge(System_Eevent.SetFCMToken, `"${FCMToken}"`); } public Alert(msg: string): void { alert(msg); } private _resize(): void { let Canvas: cc.Canvas = cc.Canvas.instance; let rect: DOMRect = cc.game.canvas.getBoundingClientRect(); /** 判断是否是横屏 */ let landscape: boolean = false; if (rect.width > rect.height) { landscape = true; } // 根据横竖屏调整节点的位置适配等 let frameSize: cc.Size = cc.view.getFrameSize(); if (landscape) { // 横屏 cc.view.setOrientation(cc.macro.ORIENTATION_LANDSCAPE); if (frameSize.height > frameSize.width) { cc.view.setFrameSize(frameSize.height, frameSize.width); } Canvas.designResolution = cc.size(1920, 1080); } else { // 竖屏 cc.view.setOrientation(cc.macro.ORIENTATION_PORTRAIT); if (frameSize.width > frameSize.height) { cc.view.setFrameSize(frameSize.height, frameSize.width); } Canvas.designResolution = cc.size(1080, 1920); } } /** 判斷更改Bundle版號.清除BUNDLE記錄 */ public *CheckBundleVersion(): IterableIterator { let isNewBundle: boolean = false; let remote_version: string = "0"; let versionLoadEnd: boolean = false; let fileName: string = "BundleVersion"; let fileFormat: string = ".txt"; let fileVersion: string = `?v=${Date.now()}`; let fileUrl: string = `https://jianmiau.tk/Resources/App/JMKA/update/remote-assets/${fileName}${fileFormat}${fileVersion}`; cc.assetManager.loadRemote(fileUrl, (err: Error, res: cc.TextAsset) => { if (!err) { remote_version = res.text; versionLoadEnd = true; console.log(`${fileName}.txt loaded`); } else { console.error(`[Error] ${fileName}載入失敗`); } }); while (!versionLoadEnd) { yield null; } let oldBundleVersion: string = LocalStorageData.Instance.BundleVersion || "0.0.0"; let newBundleVersion: string = remote_version; if (oldBundleVersion) { let IsUpdate: boolean = this.VersionCompareHandle(oldBundleVersion, newBundleVersion) < 0 ? true : false; if (IsUpdate) { console.warn(`change bundle version. ${oldBundleVersion} -> ${newBundleVersion}`); isNewBundle = true; } } LocalStorageData.Instance.BundleVersion = newBundleVersion; return isNewBundle; } public VersionCompareHandle(versionA: string, versionB: string): number { // console.log("Ver A " + versionA + "VerB " + versionB); let vA: string[] = versionA.split("."); let vB: string[] = versionB.split("."); // 長度不相等,則進行更新 if (vA.length !== vB.length) { return -1; } for (let i: number = 0; i < vA.length; ++i) { let a: number = +vA[i]; let b: number = +vB[i] || 0; if (a === b) { // 數字相同,則跳過 continue; } else { // 數字不同,則進行更新 return -1; } } // 長度相等且數字相等,則不更新 return 0; } //#endregion }