From 0a7aaa7508a42aef167deba9105a3849b2ef313c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B2=A1=E5=A4=8D=E4=B9=A0?= <2353956224@qq.com> Date: Wed, 29 Oct 2025 19:46:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A8=B3=E5=AE=9A=E6=AD=A3=E5=BC=8F=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 69 ++++++++++++++++++++++++++++++++++++++++++++++------ package.json | 2 +- 2 files changed, 63 insertions(+), 8 deletions(-) diff --git a/main.js b/main.js index 1833ad0..115d22e 100644 --- a/main.js +++ b/main.js @@ -29,6 +29,40 @@ let updateInProgress = false; // 有更新或正在下载 -> true let updateDownloaded = false; // 已下载完成(通常会随即重启安装) let pendingNavs = []; // 被延迟的跳转请求(函数队列) let installingNow = false; // 正在静默安装(用户点击“立即重启安装”之后) + + +// --- 持久化兼容模式开关(仅影响本机) --- +const compatFile = path.join(app.getPath('userData'), 'compat.json'); +function readCompat() { try { return JSON.parse(fs.readFileSync(compatFile, 'utf8')); } catch { return {}; } } +function writeCompat(obj) { try { fs.writeFileSync(compatFile, JSON.stringify(obj, null, 2)); } catch { } } + +// 支持三种触发:环境变量、命令行、持久化标记 +const SAFE_MODE = + process.env.YOLO_SAFE_MODE === '1' || + process.argv.includes('--safe-mode') || + readCompat().safeMode === true; + +// (可选)允许命令行清除持久化标记:--clear-safe-mode +if (process.argv.includes('--clear-safe-mode')) { + const c = readCompat(); delete c.safeMode; writeCompat(c); + console.log('[Compat] cleared safeMode flag'); +} + +// === 兼容模式等价于 bat 里的那些开关(不含日志) === +if (SAFE_MODE) { + app.disableHardwareAcceleration(); // --disable-gpu + app.commandLine.appendSwitch('disable-gpu'); + app.commandLine.appendSwitch('in-process-gpu'); // --in-process-gpu + app.commandLine.appendSwitch('disable-direct-composition'); // --disable-direct-composition + // 如需更稳再关沙箱:默认开着更安全;若你确实要关,则解除注释 + // app.commandLine.appendSwitch('no-sandbox'); // --no-sandbox + console.log('[SAFE_MODE] enabled'); +} + + + + + function flushPendingNavs() { const fns = pendingNavs.slice(); pendingNavs = []; @@ -50,11 +84,26 @@ process.on('unhandledRejection', (reason, p) => { console.error('[unhandledRejection未捕获异常]', reason); }); +// 渲染崩溃 → 持久化 safeMode=true(下次自动以兼容模式启动) app.on('web-contents-created', (_, contents) => { - contents.on('render-process-gone', (event, details) => { + contents.on('render-process-gone', (_event, details) => { console.error('⚠️ 渲染崩溃:', details); + if (['launch-failed', 'abnormal-exit'].includes(details.reason)) { + const c = readCompat(); c.safeMode = true; writeCompat(c); + console.warn('[Compat] set safeMode=true (persisted), will auto-use SAFE_MODE next launch'); + } }); }); +//(可选)更广义的子进程异常也触发降级 +app.on('child-process-gone', (_e, details) => { + if ((details.type === 'GPU' || details.type === 'Renderer') && + ['launch-failed', 'abnormal-exit'].includes(details.reason)) { + const c = readCompat(); c.safeMode = true; writeCompat(c); + console.warn('[Compat] GPU/Renderer gone, safeMode persisted'); + } +}); + + app.on('ready', () => { console.log('[App Ready] 当前版本:', app.getVersion()); @@ -270,17 +319,23 @@ function createWindow() { frame: true, fullscreenable: false, webPreferences: { - preload: path.join(__dirname, 'js', 'preload.js'), // ✅ 这里必须配置 + preload: path.join(__dirname, 'js', 'preload.js'), contextIsolation: true, nodeIntegration: false, - sandbox: true, + + // 推荐:默认 true;只有 SAFE_MODE 才 false(等价 --no-sandbox) + sandbox: SAFE_MODE ? false : true, + webSecurity: true, backgroundThrottling: false, enableRemoteModule: false, offscreen: false, - experimentalFeatures: true, // 保险 + + // 兼容模式更稳:关实验特性 + experimentalFeatures: SAFE_MODE ? false : true, + autoplayPolicy: 'no-user-gesture-required', - devTools: true, // 开发者工具 + devTools: true, } }); @@ -289,8 +344,8 @@ function createWindow() { // 自动判断环境使用不同的页面地址 const isProd = app.isPackaged; - const targetURL = isProd ? 'iosaitest.yolozs.com' : 'http://192.168.1.128:8080'; - // const targetURL = isProd ? 'https://iosai.yolozs.com' : 'http://192.168.1.128:8080'; + // const targetURL = isProd ? 'https://iosaitest.yolozs.com' : 'http://192.168.1.128:8080'; + const targetURL = isProd ? 'https://iosai.yolozs.com' : 'http://192.168.1.128:8080'; console.log('[页面加载] 使用地址:', targetURL); let retryIntervalId = null; diff --git a/package.json b/package.json index 7fcc201..970d0e2 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "YOLO-ios-ai", "productName": "YOLO(AI助手ios)", - "version": "2.5.3", + "version": "2.7.1", "description": "Vue3 + WS 控制台", "author": "yourname", "main": "main.js",