Mac App Store への公開ガイド
このガイドでは以下の情報を提供しています。
- macOS で Electron アプリを署名する方法;
- Mac App Store (MAS) に Electron アプリを提出する方法;
- MAS ビルドの制限。
要件
Electron アプリを署名するには、まず以下のツールをインストールする必要があります。
- Xcode 11 以降。
- @electron/osx-sign npm モジュール。
また、Apple Developer アカウントを登録し Apple Developer Program に参加する必要があります。
Electron アプリを署名する
Electron アプリは Mac App Store や外部サイトで頒布できます。 それぞれの方法ごとに、署名やテストの方法が異なります。 このガイドでは Mac App Store での頒布を中心に説明します。
以下の手順で、Apple から証明書を取得する方法、Electron アプリに署名する方法、テストする方法を説明します。
証明書の取得
最も簡単に署名証明書を取得するには、Xcode を使用して以下のようします。
- Xcode を開いて設定の "Accounts" を開きます。
- Apple アカウントでサインインします。
- チームを選択して "Manage Certificates" をクリックします。
- 署名証明書シートの左下にある追加ボタン (+) をクリックし、以下の証明書を追加します。
- "Apple Development"
- "Apple Distribution"
"Apple Development" 証明書は、Apple Developer ウェブサイトで登録したマシン上で、開発およびテスト用のアプリに署名するために使用します。 登録方法については、プロビジョニングプロファイルの準備 で説明します。
"Apple Development" 証明書で署名したアプリは Mac App Store に提出できません。 このためには、代わりに "Apple Distribution" 証明書でアプリに署名する必要があります。 ただし注意として、"Apple Distribution" 証明書で署名したアプリはそのまま実行できません。実行できるようにするには Apple が再署名する必要がありますが、これは Mac App Store からダウンロードした後でのみ可能になります。
その他の証明書
証明書の種類が他にもあることにお気づきでしょう。
"Developer ID Application" 証明書は、アプリを Mac App Store 以外で頒布する前の署名に使用します。
"Developer ID Installer" および "Mac Installer Distribution" の証明書は、アプリ自体ではなく "Mac Installer Package" の署名に使用します。 ほとんどの Electron アプリは Mac Installer Package を使用しないので、通常は必要ありません。
証明書の種類の完全なリストは こちら で見られます。
"Apple Development" および "Apple Distribution" 証明書で署名されたアプリは App Sandbox 下でしか実行できないため、Electron の MAS ビルドを使用する必要があります。 しかし、"Developer ID Application" 証明書にはこの制限がないため、この証明書で署名されたアプリは Electron の通常ビルドと MAS ビルドのどちらでも使用できます。
従来の証明書の名称
Apple は過去数年の間に証明書の名称を変更しており、古いドキュメントを読んでいると古い名称が出てくるかもしれません。一部のユーティリティも未だに古い名称を使用していることがあります。
- "Apple Distribution" 証明書は、"3rd Party Mac Developer Application" や "Mac App Distribution" という名称でもありました。
- "Apple Development" 証明書は、"Mac Developer" や "Development" という名称でもありました。
プロビジョニングプロファイルの準備
Mac App Store へアプリを提出する前にローカルマシンでアプリをテストしたい場合は、アプリバンドルに埋め込まれたプロビジョニングプロファイル付きの "Apple Development" 証明書でアプリを署名する必要があります。
プロビジョニングプロファイルの作成 は、以下の手順を踏むとできます。
- Apple Developer のウェブサイトで "Certificates, Identifiers & Profiles" のページを開きます。
- "Identifiers" のページ内でアプリの App ID を新規追加します。
- "Devices" のページでローカルのマシンを登録します。 お使いのマシンの "デバイス ID" は、"システム情報" アプリの "ハードウェア" のページで確認できます。
- "Profiles" のページで新しいプロビジョニングプロファイルを登録し、
/path/to/yourapp.provisionprofile
へダウンロードします。
Apple のアプリサンドボックスを有効にする
Mac App Store に提出したアプリは Apple の App Sandbox 下で実行する必要があり、Electron の MAS ビルドだけが App Sandbox で実行できます。 Electron の標準の darwin ビルドでは、App Sandbox で実行すると起動に失敗します。
@electron/osx-sign
でアプリを署名すると、必要なエンタイトルメントが自動追加されます。
electron-osx-sign
を使わない場合のさらなる手順
@electron/osx-sign
を使わずにアプリを署名する場合、アプリバンドルのエンタイトルメントが少なくとも以下のキーを持っていることを確認する必要があります。
<?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.application-groups</key>
<array>
<string>TEAM_ID.your.bundle.id</string>
</array>
</dict>
</plist>
TEAM_ID
は Apple Developer アカウントの Team ID に、your.bundle.id
はアプリの App ID に置き換えてください。
また、アプリのバンドル内のバイナリやヘルパーに以下のエンタイトルメントを追加する必要があります。
<?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>
そしてアプリバンドルの Info.plist
には、ElectronTeamID
キーに Apple Developer アカウントの Team ID を値として含める必要があります。
<plist version="1.0">
<dict>
...
<key>ElectronTeamID</key>
<string>TEAM_ID</string>
</dict>
</plist>
@electron/osx-sign
を使用する場合は、証明書の名前から Team ID を抽出することで ElectronTeamID
キーが自動追加されます。 @electron/osx-sign
が正しい Team ID を見つけられなかった場合は、このキーを手動で追加する必要があるでしょう。
開発用にアプリを署名する
開発マシン上で実行できるようにアプリを署名するには、"Apple Development" 証明書で署名し、そのプロビジョニングプロファイルを @electron/osx-sign
に渡す必要があります。
const { signAsync } = require('@electron/osx-sign')
signAsync({
app: '/path/to/your.app',
identity: 'Apple Development',
provisioningProfile: '/path/to/your.provisionprofile'
})
@electron/osx-sign
を使わずに署名する場合は、プロビジョニングプロファイルを YourApp.app/Contents/embedded.provisionprofile
に配置する必要があります。
署名したアプリはプロビジョニングプロファイルによって登録されたマシン上でのみ実行可能です。これが Mac App Store に提出する前に署名したアプリをテストする唯一の方法です。
Mac App Store へ提出するためにアプリを署名する
Mac App Store へ提出するアプリを署名するには、"Apple Distribution" 証明書で署名する必要があります。 注意として、この証明書で署名されたアプリは、Mac App Store からダウンロードしない限りどのマシンでも実行できません。
const { signAsync } = require('@electron/osx-sign')
signAsync({
app: 'path/to/your.app',
identity: 'Apple Distribution'
})
アプリを Mac App Store に提出する
"Apple Distribution" 証明書でアプリを署名すれば、Mac App Store に提出できます。
このガイドは、Apple がアプリを承認することを保証していません。Mac App Store の登録要件を満たすには、Apple の アプリの提出 のガイドも読んでおくべきでしょう。
アップロードする
手続きのために、Apple Transporter を使用して署名したアプリを App Store Connect にアップロードする必要があります。アップロードする前に レコードを作成した ことを確認するようにしてください。
非公開 API の利用といったエラーが出る場合は、アプリが Electron の MAS ビルドを使用しているかどうかを確認するとよいでしょう。
審査に提出する
アップロード後、アプリを審査に提出 する必要があります。
MAS ビルドの制限
アプリのサンドボックスですべての要件を満たすために、MASビルドで次のモジュールを無効にしてください。
crashReporter
autoUpdater
次の挙動を変更してください。
- ビデオキャプチャーはいくつかのマシンで動作しないかもしれません。
- 一部のアクセシビリティ機能が動作しないことがあります。
- アプリはDNSの変更を認識しません。
サンドボックスが使用されるため、アプリがアクセスできるリソースは厳密に制限されています。詳細は、 App Sandboxing を参照してください。
追加のエンタイトルメント
App Sandbox で実行されるすべてのアプリは、制限された権限セットの下で実行されるため、悪意のあるコードによる潜在的な損害を制限します。 アプリが使用する Electron API に応じて、アプリの entitlements ファイルに追加のエンタイトルメントが必要です。 さもなくば、App Sandbox がその使用を阻害することがあります。
エンタイトルメントは、プロパティリスト (.plist
) や XML などの形式のファイルで指定されます。 アプリケーションバンドル自体のエンタイトルメントファイルと、基本的にバイナリ、フレームワーク (.framework
)、動的リンクのライブラリ (.dylib
) などの他すべての包含する実行形式に対して、指定されたプロパティの継承を記述する子のエンタイトルメントファイルを提供する必要があります。
権限の完全なリストは App Sandbox のドキュメントに記載されていますが、以下に MAS アプリに必要な権限をいくつか示します。
@electron/osx-sign
を使用すると、ファイルごとのエンタイトルメントを以下のように設定できます。
const { signAsync } = require('@electron/osx-sign')
function getEntitlementsForFile (filePath) {
if (filePath.startsWith('my-path-1')) {
return './my-path-1.plist'
} else {
return './alternate.plist'
}
}
signAsync({
optionsForFile: (filePath) => ({
// 署名するファイルに基づいた正しいエンタイトルメントのパスをここで返すようにしてください。
entitlements: getEntitlementsForFile(filePath)
})
})
ネットワークアクセス
アプリがサーバーに接続できるように、以下のように発信ネットワーク接続を有効にします。
<key>com.apple.security.network.client</key>
<true/>
アプリがネットワーク待機ソケットを開くことを許可するために、以下のように着信ネットワーク接続を有効にします。
<key>com.apple.security.network.server</key>
<true/>
詳細は ネットワークアクセスの有効化のドキュメント をご参照ください。
dialog.showOpenDialog
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
詳細は ユーザが選択したファイルアクセスの有効化のドキュメント をご参照ください。
dialog.showSaveDialog
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
詳細は ユーザが選択したファイルアクセスの有効化のドキュメント をご参照ください。
Electron が使用する暗号化アルゴリズム
アプリをリリースする国によっては、ソフトウェアで使用されている暗号化アルゴリズムに関する情報を提供する必要があります。 より詳しくは、暗号輸出コンプライアンスのドキュメント を参照してください。
Electron は次の暗号アルゴリズムを使用しています:
- AES - NIST SP 800-38A, NIST SP 800-38D, RFC 3394
- HMAC - FIPS 198-1
- ECDSA - ANS X9.62–2005
- ECDH - ANS X9.63–2001
- HKDF - NIST SP 800-56C
- PBKDF2 - RFC 2898
- RSA - RFC 3447
- SHA - FIPS 180-4
- Blowfish - https://www.schneier.com/cryptography/blowfish/
- CAST - RFC 2144, RFC 2612
- DES - FIPS 46-3
- DH - RFC 2631
- DSA - ANSI X9.30
- EC - SEC 1
- IDEA - "On the Design and Security of Block Ciphers" book by X. Lai
- MD2 - RFC 1319
- MD4 - RFC 6150
- MD5 - RFC 1321
- MDC2 - ISO/IEC 10118-2
- RC2 - RFC 2268
- RC4 - RFC 4345
- RC5 - https://people.csail.mit.edu/rivest/Rivest-rc5rev.pdf
- RIPEMD - ISO/IEC 10118-3