リファレンスマニュアル閲覧用の Chemr だけど、ベースの Electron を1.2.1にバージョンアップした。
しかし codesign するとあいかわらずフリーズするので改めて調べてみたら Console.app に以下のようなログがでていた。
sandboxd[131]: ([19968]) Chemr Helper(19968) deny mach-lookup org.chromium.Chromium.rohitfork.19966 sandboxd[131]: ([19973]) Chemr Helper(19973) deny mach-lookup org.chromium.Chromium.rohitfork.19966 sandboxd[131]: ([19974]) Chemr Helper(19974) deny mach-lookup org.chromium.Chromium.rohitfork.19966
ググってみると Electron broken on OS X in Apple Sandboxed apps (App Store) · Issue #3871 · electron/electron · GitHub あたりの問題のようだ。
Sign Your App のentitlements あたりに変更が必要になった模様。
長いので結論だけ書くと以下のようにすればなおった。electron-packager を使っている前提で
Team ID を取得する
Apple Developer Center にいくと、Membership Details に Team ID という項目がある。
あるいはコードサイン用に Key Chain に自分用の証明書を入れていると思うが、その証明書名の括弧の中の文字列がチームIDとなっている。
追加の Info.plist を作る
<plist version="1.0">
<dict>
<key>ElectronTeamID</key>
<string>$TEAM_ID$</string>
</dict>
</plist>
こんな感じで Info.plist を作っておく、不完全なファイルに見えるが、残りは electron-packager が埋めるのでこれで良い。
こうした上で electron-packager に --extend-info=dev/Info.plist をつけて実行する。
entitlements ファイルの更新
parent.plist を以下のようにする。com.apple.security.network.client は今回の件とは関係なく、Chemr に必要なのでつけているだけで、必須ではない。
<?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.application-groups</key>
<string>$TEAM_ID$.net.lowreal.Chemr</string>
</dict>
</plist>
child.plist は以下のようにする
<?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>
codesign
electron-packager にも codesign のオプションはあるが、使ってない。electron-osx-sign を直接呼びだしている。
./node_modules/.bin/electron-osx-sign --no-pre-auto-entitlements --version=1.2.0 "$APP_PATH" --entitlements=dev/parent.plist --entitlements-inherit=dev/child.plist --identity="$APP_KEY"
こんな感じで、上記 entitlements ファイルを指定して codesign させる。
なお electron-osx-sign の 0.4.0-beta4 以上だとこの entitlements の処理を自動でやってくれるみたいだが、なんとなく自動的にやるのが信用ならないのでこれはつかってない。
備考
使ったツールのバージョン
- "electron-osx-sign": "^0.4.0-beta4"
- "electron-prebuilt": "1.2.1"
- "electron-packager": "^7.0.3"
- electron-packager に渡す --version の値: 1.2.1 (新しいものじゃないと ElectronTeamID に対応してないので注意)
証明書なしでサンドボックスアプリとして実行したい
デバッグのため、とりあえず証明書なしでサンドボックスを有効にしたい場合、ad-hoc signing でも動かすことができた。これは identity に - を指定することでできる。
すなわち
./node_modules/.bin/electron-osx-sign --no-pre-auto-entitlements --platform=mas --version=1.2.0 "$APP_PATH" --entitlements=dev/parent.plist --entitlements-inherit=dev/child.plist --identity="-"
のようにする。おそらく Team ID は一致さえしていればなんでもいい(と思うが試してはいない)
備考 electron-osx-sign を verbose にする
環境変数 DEBUG を設定すると詳細なログがでるようになる。DEBUG='electron-osx-sign' これは debug という npm パッケージを使っているため。