稳定正式版
This commit is contained in:
69
main.js
69
main.js
@@ -29,6 +29,40 @@ let updateInProgress = false; // 有更新或正在下载 -> true
|
|||||||
let updateDownloaded = false; // 已下载完成(通常会随即重启安装)
|
let updateDownloaded = false; // 已下载完成(通常会随即重启安装)
|
||||||
let pendingNavs = []; // 被延迟的跳转请求(函数队列)
|
let pendingNavs = []; // 被延迟的跳转请求(函数队列)
|
||||||
let installingNow = false; // 正在静默安装(用户点击“立即重启安装”之后)
|
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() {
|
function flushPendingNavs() {
|
||||||
const fns = pendingNavs.slice();
|
const fns = pendingNavs.slice();
|
||||||
pendingNavs = [];
|
pendingNavs = [];
|
||||||
@@ -50,11 +84,26 @@ process.on('unhandledRejection', (reason, p) => {
|
|||||||
console.error('[unhandledRejection未捕获异常]', reason);
|
console.error('[unhandledRejection未捕获异常]', reason);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 渲染崩溃 → 持久化 safeMode=true(下次自动以兼容模式启动)
|
||||||
app.on('web-contents-created', (_, contents) => {
|
app.on('web-contents-created', (_, contents) => {
|
||||||
contents.on('render-process-gone', (event, details) => {
|
contents.on('render-process-gone', (_event, details) => {
|
||||||
console.error('⚠️ 渲染崩溃:', 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', () => {
|
app.on('ready', () => {
|
||||||
console.log('[App Ready] 当前版本:', app.getVersion());
|
console.log('[App Ready] 当前版本:', app.getVersion());
|
||||||
@@ -270,17 +319,23 @@ function createWindow() {
|
|||||||
frame: true,
|
frame: true,
|
||||||
fullscreenable: false,
|
fullscreenable: false,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
preload: path.join(__dirname, 'js', 'preload.js'), // ✅ 这里必须配置
|
preload: path.join(__dirname, 'js', 'preload.js'),
|
||||||
contextIsolation: true,
|
contextIsolation: true,
|
||||||
nodeIntegration: false,
|
nodeIntegration: false,
|
||||||
sandbox: true,
|
|
||||||
|
// 推荐:默认 true;只有 SAFE_MODE 才 false(等价 --no-sandbox)
|
||||||
|
sandbox: SAFE_MODE ? false : true,
|
||||||
|
|
||||||
webSecurity: true,
|
webSecurity: true,
|
||||||
backgroundThrottling: false,
|
backgroundThrottling: false,
|
||||||
enableRemoteModule: false,
|
enableRemoteModule: false,
|
||||||
offscreen: false,
|
offscreen: false,
|
||||||
experimentalFeatures: true, // 保险
|
|
||||||
|
// 兼容模式更稳:关实验特性
|
||||||
|
experimentalFeatures: SAFE_MODE ? false : true,
|
||||||
|
|
||||||
autoplayPolicy: 'no-user-gesture-required',
|
autoplayPolicy: 'no-user-gesture-required',
|
||||||
devTools: true, // 开发者工具
|
devTools: true,
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -289,8 +344,8 @@ function createWindow() {
|
|||||||
|
|
||||||
// 自动判断环境使用不同的页面地址
|
// 自动判断环境使用不同的页面地址
|
||||||
const isProd = app.isPackaged;
|
const isProd = app.isPackaged;
|
||||||
const targetURL = isProd ? 'iosaitest.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';
|
const targetURL = isProd ? 'https://iosai.yolozs.com' : 'http://192.168.1.128:8080';
|
||||||
console.log('[页面加载] 使用地址:', targetURL);
|
console.log('[页面加载] 使用地址:', targetURL);
|
||||||
|
|
||||||
let retryIntervalId = null;
|
let retryIntervalId = null;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "YOLO-ios-ai",
|
"name": "YOLO-ios-ai",
|
||||||
"productName": "YOLO(AI助手ios)",
|
"productName": "YOLO(AI助手ios)",
|
||||||
"version": "2.5.3",
|
"version": "2.7.1",
|
||||||
"description": "Vue3 + WS 控制台",
|
"description": "Vue3 + WS 控制台",
|
||||||
"author": "yourname",
|
"author": "yourname",
|
||||||
"main": "main.js",
|
"main": "main.js",
|
||||||
|
|||||||
Reference in New Issue
Block a user