Electron の app.requestSingleInstanceLock は Mac App Store (MAS) 向けビルドで動かない

Electron にはアプリの多重起動を防止するための requestSingleInstanceLock が用意されていますが、Mac App Store (MAS) ビルドではアプリが起動していなくても false を返すという問題が有りました。false だった場合に閉じる処理を書いているアプリでは、起動直後にすぐウィンドウが閉じて終了してしまう現象が起こります。

エラー

Contents/MacOS/ にある実行ファイルから実行すると、コンソールに下記のようなエラーが出ました。SingletonSocket: Operation not permitted (1) のログが出ていたため、問題を特定することができました。

[8325:0511/112820.037550:ERROR:process_singleton_posix.cc(1170)] Failed to bind() /var/folders/3y/v4gw12vn3dlbxtw4bcm2xd5h0000gn/T/jp.codingcafe.signal/S/SingletonSocket: Operation not permitted (1)

対処法

macOS では requestSingleInstanceLock を使う必要はなく、Info.plist に LSMultipleInstancesProhibited を true として追加することで多重起動を防止することができます。MAS ビルドの場合は requestSingleInstanceLock を使わないように修正します。

MAS ビルドかどうかは const isMas = process.mas === true で判定できるので、次のようになります。

const isMas = process.mas === true

if (!isMas) {
  const gotTheLock = app.requestSingleInstanceLock()
  ...
}

関連 issue

https://github.com/electron/electron/issues/34744 https://github.com/electron/electron/issues/15958 https://github.com/electron/electron/issues/20088