Enhancements to make it more Mac App Store (mas) compatible

- disable the autoupdater if running as mas (was not working anyway, just logging an error on every start)
- replace check via app.requestSingleInstanceLock() with LSMultipleInstancesProhibited in Info.plist
  due to https://github.com/electron/electron/issues/15958
- Quit the app also when all windows are closed to conform to macOS Human Interface Guidelines
  Comments from review:
  If the application is a single-window app, it might be appropriate to save data and quit the app when the main window is closed.
- "asarUnpack": "**/*.node" to also sign the native addons when packaging
- add the required mas-specific entitlements which include the app-sandbox key

Signed-off-by: Christoph Settgast <csett86@web.de>
This commit is contained in:
Christoph Settgast 2021-03-11 21:28:31 +01:00 committed by Saúl Ibarra Corretgé
parent 9b09a4bfa9
commit 5c49372e11
4 changed files with 40 additions and 7 deletions

12
main.js
View File

@ -162,7 +162,9 @@ function createJitsiMeetWindow() {
setApplicationMenu(); setApplicationMenu();
// Check for Updates. // Check for Updates.
autoUpdater.checkForUpdatesAndNotify(); if (!process.mas) {
autoUpdater.checkForUpdatesAndNotify();
}
// Load the previous window state with fallback to defaults. // Load the previous window state with fallback to defaults.
const windowState = windowStateKeeper({ const windowState = windowStateKeeper({
@ -290,8 +292,9 @@ function handleProtocolCall(fullProtocolCall) {
/** /**
* Force Single Instance Application. * Force Single Instance Application.
* Handle this on darwin via LSMultipleInstancesProhibited in Info.plist as below does not work on MAS
*/ */
const gotInstanceLock = app.requestSingleInstanceLock(); const gotInstanceLock = process.platform === 'darwin' ? true : app.requestSingleInstanceLock();
if (!gotInstanceLock) { if (!gotInstanceLock) {
app.quit(); app.quit();
@ -345,10 +348,7 @@ app.on('second-instance', (event, commandLine) => {
}); });
app.on('window-all-closed', () => { app.on('window-all-closed', () => {
// Don't quit the application on macOS. app.quit();
if (process.platform !== 'darwin') {
app.quit();
}
}); });
// remove so we can register each time as we run the app. // remove so we can register each time as we run the app.

View File

@ -39,11 +39,18 @@
"hardenedRuntime": true, "hardenedRuntime": true,
"entitlements": "entitlements.mac.plist", "entitlements": "entitlements.mac.plist",
"entitlementsInherit": "entitlements.mac.plist", "entitlementsInherit": "entitlements.mac.plist",
"asarUnpack": "**/*.node",
"extendInfo": { "extendInfo": {
"NSCameraUsageDescription": "Jitsi Meet requires access to your camera in order to make video-calls.", "NSCameraUsageDescription": "Jitsi Meet requires access to your camera in order to make video-calls.",
"NSMicrophoneUsageDescription": "Jitsi Meet requires access to your microphone in order to make calls (audio/video)." "NSMicrophoneUsageDescription": "Jitsi Meet requires access to your microphone in order to make calls (audio/video).",
"LSMultipleInstancesProhibited": true
} }
}, },
"mas": {
"entitlements": "resources/entitlements.mas.plist",
"entitlementsInherit": "resources/entitlements.mas.inherit.plist",
"hardenedRuntime": false
},
"linux": { "linux": {
"artifactName": "jitsi-meet-${arch}.${ext}", "artifactName": "jitsi-meet-${arch}.${ext}",
"category": "VideoConference;AudioVideo;Audio;Video;Network", "category": "VideoConference;AudioVideo;Audio;Video;Network",

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.microphone</key>
<true/>
</dict>
</plist>