ElectronアプリケーションのmacOS版を配布するためには、次の2つの方法があります。
- Mac App Store
- インターネット上で直接配布(例えば、GitHub releaseにファイルをアップロードする)
2)の方法で配布する場合、署名(code signing)および公証(notarization)が必要になります。この記事では、実際にElectronアプリケーションをリリースした経験をもとに、必要な設定について解説します。
前提
私が開発したElectronアプリケーション(Photo Location Map)では、次の状態・条件から、リリースに向けて署名・公証に必要な設定をしました。
- electron-builderを使ってdmgを生成する
- dmgを直接インターネット上で配布する。(Mac App Storeではない。)
- GitHub Releasesにpublishする設定にしています。
署名・公証なしの場合
署名・公証なしの場合、インターネット上からダウンロードしたアプリケーションを起動しようとすると、次のメッセージが出て、起動できません。
また、署名の設定をしていない場合、electron-builderでビルド時(electron-builder build
)に、skipped macOS application code signing
とメッセージが出ます。
• electron-builder version=21.2.0 os=19.0.0
• loaded configuration file=/Users/Tomoyuki/Documents/GitRepo/GitHub/photo-location-map/electron-builder.json
• writing effective config file=release/builder-effective-config.yaml
• packaging platform=darwin arch=x64 electron=7.0.0 appOutDir=release/mac
• skipped macOS application code signing reason=cannot find valid "Developer ID Application" identity or custom non-Apple code signing certificate, see https://electron.build/code-signing
署名の設定をする
まずは署名が必要です。署名のためには次の2つが必要です。
- Apple Developer Programに登録する。
- XcodeでDeveloper ID Applicationを作成する。
Developer ID Applicationは、Xcodeを起動し、Preferencesから、次の画像の通りにすると作成できます。途中、Apple IDのユーザ名・パスワードを入力するポップアップが出てきますので、Apple Developer Program登録の際に紐つけたApple IDを使います。
Developer ID Applicationを作成後は、electron-builderでビルド時に「Developer ID Applicationを使ってsignした」というメッセージが出るようになります。
• electron-builder version=21.2.0 os=19.0.0
• loaded configuration file=/Users/Tomoyuki/Documents/GitRepo/GitHub/photo-location-map/electron-builder.json
• writing effective config file=release/builder-effective-config.yaml
• packaging platform=darwin arch=x64 electron=7.0.0 appOutDir=release/mac
• signing file=release/mac/Photo Location Map.app identityName=Developer ID Application: Tomoyuki Aota
署名済みかつ公証なしの場合
署名済みかつ公証なしの場合、インターネット上からダウンロードしたアプリケーションを起動しようとすると、次のメッセージが出て、起動できません。
公証の設定をする
公証の方法については、次のページを参考にしました。
Notarizing your Electron application | Kilian Valkhof
私が開発中のアプリケーションでは、次の変更が必要でした。
https://github.com/TomoyukiAota/photo-location-map/pull/192/files
Apple IDやApp Specific Passwordを指定する必要がありますが、これらは、環境変数に格納するようにしました。
https://github.com/TomoyukiAota/photo-location-map/pull/192/files#diff-55db2099c7a0eff7f93007cafce6c7ebR24-R25
appleId: process.env.APPLE_ID,
appleIdPassword: process.env.APPLE_APP_SPECIFIC_PASSWORD,
公証は5−10分程度かかります。公証が終わるとアップルからメールが来ます。
ついでに、公証の結果を確認するスクリプトを入れておくと便利です。公証に時間がかかっている場合などの調査に役に立ちます。(Notary Serviceが落ちていることがあったりします。) ターミナル上では、xcrun altool --notarization-history 0 -u ${appleId} -p ${appSpecificPassword}
(${appleId}
と${appSpecificPassword}
はそれぞれ置き換える)なので、それをラップしたスクリプトを用意すればいいと思います。私の場合は先程の変更の中で、script/notarize/get-notarization-history.js
というスクリプトを用意しました。
署名済みかつ公証済みの場合
インターネット上からダウンロードしたアプリケーションを起動すると、次のポップアップが出ます。アプリケーションが起動できるようになりました。
おわりに
公証はmacOS 10.14.5やmacOS 10.15で必須とされたので、2019年11月現在、必要な作業やライブラリ(electron-notarize)関連の設定など、まだ流動的な面があります。ですので、この記事に書かれていることに加えて、最新の情報を追うように心がけると良いと思います。