Il crash SIGTRAP su macOS M3 è causato da Squirrel.framework (auto-updater) incluso automaticamente da electron-builder. Il framework usa componenti Swift che crashano durante l'inizializzazione quando:
- App è firmata ma NON notarizzata
- Hardened runtime è abilitato
- Sistema è macOS 15+ su Apple Silicon (M-series)
Modificare package.json:
{
"build": {
"mac": {
"target": [
{
"target": "zip",
"arch": ["x64", "arm64"]
}
],
"category": "public.app-category.utilities",
"icon": "gui/icon.icns",
"hardenedRuntime": false,
"gatekeeperAssess": false,
"entitlements": "build/entitlements.mac.plist",
"entitlementsInherit": "build/entitlements.mac.plist"
},
"publish": {
"provider": "github",
"owner": "maxabba",
"repo": "LocalStream"
}
},
"dependencies": {
...
"electron-updater": "^6.1.7"
}
}Vantaggi:
- Nessun crash su M3
- Auto-update funziona ancora via GitHub releases
- Più leggero (no Squirrel.framework)
Implementazione in gui/main.js:
const { autoUpdater } = require('electron-updater');
// Configura auto-updater
autoUpdater.autoDownload = false;
autoUpdater.autoInstallOnAppQuit = true;
// Check for updates on startup
app.whenReady().then(() => {
createWindow();
// Check dopo 3 secondi dall'avvio
setTimeout(() => {
autoUpdater.checkForUpdates();
}, 3000);
});
// Events
autoUpdater.on('update-available', (info) => {
mainWindow.webContents.send('update-available', info);
});
autoUpdater.on('update-downloaded', (info) => {
mainWindow.webContents.send('update-downloaded', info);
});Requisiti:
- Apple Developer Program ($99/anno)
- Certificato "Developer ID Application"
- App Store Connect API key
Setup:
-
Ottieni certificati da Apple Developer
-
Configura notarizzazione in
package.json:
{
"build": {
"mac": {
"hardenedRuntime": true,
"gatekeeperAssess": false,
"entitlements": "build/entitlements.mac.plist",
"entitlementsInherit": "build/entitlements.mac.plist",
"notarize": {
"teamId": "38C8C426NW"
}
},
"afterSign": "scripts/notarize.js"
}
}- Crea
scripts/notarize.js:
const { notarize } = require('@electron/notarize');
exports.default = async function notarizing(context) {
const { electronPlatformName, appOutDir } = context;
if (electronPlatformName !== 'darwin') {
return;
}
const appName = context.packager.appInfo.productFilename;
return await notarize({
appBundleId: 'com.localstream.app',
appPath: `${appOutDir}/${appName}.app`,
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,
teamId: '38C8C426NW'
});
};- Variabili d'ambiente:
export APPLE_ID="tua-email@apple.com"
export APPLE_APP_SPECIFIC_PASSWORD="xxxx-xxxx-xxxx-xxxx"- Build con notarizzazione:
npm install --save-dev @electron/notarize
npm run build:macVantaggi:
- Nessun warning di sicurezza per gli utenti
- Hardened runtime abilitato (più sicuro)
- Distribuzione professionale
Svantaggi:
- Costo annuale $99
- Build più lenta (notarizzazione ~5-10 minuti)
Configurazione attuale (hardenedRuntime: false, firmato ma non notarizzato):
{
"build": {
"mac": {
"hardenedRuntime": false,
"gatekeeperAssess": false,
"entitlements": "build/entitlements.mac.plist"
}
}
}Pro: Nessun costo, build veloce
Contro: Utenti devono fare xattr -cr manualmente
Electron 28.0.0 è vecchio. Le versioni più recenti potrebbero avere fix per M3.
Aggiornamento:
npm install --save-dev electron@latest electron-builder@latestTesta:
npm run build:mac-armRischio: Potrebbero servire modifiche al codice per compatibilità.
Per uso personale/interno:
- Usa Opzione 1 (hardenedRuntime: false) ✅
- Istruisci utenti a fare
xattr -crprima di aprire l'app
Per distribuzione pubblica:
- Implementa Opzione 2 (notarizzazione Apple) ✅
- Costa $99/anno ma esperienza utente perfetta
- Richiesto per distribuzione seria
Per sviluppo/testing:
- Build unsigned (
identity: null) ✅ - Solo per testing locale, non distribuire
package.json - Configurazione build:
"hardenedRuntime": false // Cambiato da trueProssimi step (se implementi electron-updater):
- Aggiungi dipendenza
electron-updater - Modifica
gui/main.jsper gestire update events - Configura GitHub releases per pubblicare aggiornamenti
Prima di distribuire, testa su:
- ✅ Mac M1/M2/M3 (Apple Silicon)
- ✅ Mac Intel (x64)
- ✅ macOS 13 (Ventura)
- ✅ macOS 14 (Sonoma)
- ✅ macOS 15 (Sequoia)
Stato attuale: Configurazione con hardenedRuntime: false che risolve il crash M3 mantenendo la firma Developer ID.