見出し画像

eletctronでコマンドライン引数を受け取る (とmacosxの注意点)

eletctronでコマンドライン引数を受け取る場合に、macosx固有の注意点として"-psn_0_xxxxxx"のような引数に対処する必要がある。


daisy-sequenceをデバッグしていて発見。

スクリーンショット 2020-05-03 11.07.44


# よく紹介されるelectronでの引数の受け取り方法

electronで引数にファイルを受け取る時、以下の対応が必要となる。


## electronはデバッグとリリースでコマンドライン引数の数が異なる

デバッグではElectron実行ファイルのパスだけでなく、アプリのmainを入れたjsのパスも引数として渡される。

let argv = remote.process.argv;

    if(argv[0].endsWith('lectron')){
       argv.shift();
   }

ここで'lectron'とendsWithでマッチしているのは、プラットフォームにより'Electron'/'electron'で先頭大文字小文字の2パターンがあるため。


## electronは OSXでは'open-file' イベントを受ける


electronアプリにGUI上からファイルを渡して開く時、(ファイルをドロップして開く等)macosxではwin/linuxのように通常引数では受け取れないため、以下のコールバックで受け取る。


``` : electronベース(nodeプロセス側)でコールバック受け取り

// MacOSX
global.sharedObject = {'osx_open_file': null};
let openFileHandler = function(event, path) {
   event.preventDefault();
   global.sharedObject.osx_open_file = path;
};
app.on('open-file', openFileHandler);

```: electronアプリ(レンダラプロセス側)で上で保存した値を受け取り


    if(typeof remote.getGlobal('sharedObject').osx_open_file === 'string'){
       if(null === arg.open_filepath){
           arg.open_filepath = remote.getGlobal('sharedObject').osx_open_file;
       }
   }


# macosxのelectronで引数から"-psn_0_xxxxxx"を取り除く

macosxでリリースしたアプリをダウンロードして起動すると、初回起動時に、

"-psn_0_xxxxxx"のような引数を受け取る場合がある。

スクリーンショット 2020-05-03 11.08.26

スクリーンショット 2020-05-03 12.47.05


これを適切に取り除く必要がある。

        if(/^-psn_0_[0-9]+$/.test(arg.open_filepath)){
           // macosxでブラウザからダウンロードしたバイナリを初回起動した際に、
           // 渡される場合のあるコマンドライン引数(ex. '-psn_0_2958034')を除外する。
           console.debug("through for macosx:", arg.open_filepath);
           return true;
       }


ただし、初回起動時から引数でさらにファイルパスを渡された場合に、うまく行かないかもしれない。(その場合の引数の順序などの動作は確認していない。)


不明な引数について今回の話に近い報告がされているissue

https://github.com/electron/electron/issues/4403


## テスト方法

なお、macosxでテストする際、「ネットワークからダウンロードしたファイル」のフラグをONにする必要がある。

これには実行ファイル(の配布zip)をchrome にドロップすると良い。ドロップしたファイルがダウンロード扱いされる。

この記事が気に入ったらサポートをしてみませんか?