eletctronでコマンドライン引数を受け取る場合に、macosx固有の注意点として"-psn_0_xxxxxx"のような引数に対処する必要がある。
daisy-sequenceをデバッグしていて発見。
# よく紹介される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"のような引数を受け取る場合がある。
これを適切に取り除く必要がある。
```
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 にドロップすると良い。ドロップしたファイルがダウンロード扱いされる。