メインコンテンツにスキップ

Mac App Store 提出ガイド

このガイドでは、以下について説明します。

  • macOS で Electron アプリに署名する方法
  • Electron アプリを Mac App Store (MAS) に提出する方法
  • MAS ビルドの制限事項

要件

Electron アプリに署名するには、まず以下のツールをインストールする必要があります。

また、Apple Developer アカウントを登録し、Apple Developer Program に参加する必要があります。

Electron アプリへの署名

Electron アプリは、Mac App Store またはその外部を通じて配布できます。それぞれの方法では、署名とテストの方法が異なります。このガイドでは、Mac App Store を介した配布に焦点を当てます。

以下の手順では、Apple から証明書を取得する方法、Electron アプリに署名する方法、およびそれらをテストする方法について説明します。

証明書の取得

署名証明書を取得する最も簡単な方法は、Xcode を使用することです。

  1. Xcode を開き、「アカウント」環境設定を開きます。
  2. Apple アカウントでサインインします。
  3. チームを選択し、「証明書の管理」をクリックします。
  4. 署名証明書シートの左下隅にある追加ボタン(+)をクリックし、以下の証明書を追加します。
    • 「Apple Development」
    • 「Apple Distribution」

「Apple Development」証明書は、Apple Developer Web サイトに登録されているマシンで、開発およびテスト用にアプリに署名するために使用されます。登録方法は、プロビジョニングプロファイルの準備で説明します。

「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 インストーラーパッケージに署名するために使用されます。ほとんどの Electron アプリは Mac インストーラーパッケージを使用しないため、通常は必要ありません。

証明書タイプの完全なリストはこちらにあります。

「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」証明書でアプリに署名する必要があります。

プロビジョニングプロファイルを作成するには、以下の手順に従うことができます。

  1. Apple Developer Web サイトの「証明書、識別子とプロファイル」ページを開きます。
  2. 「識別子」ページでアプリの新しい App ID を追加します。
  3. 「デバイス」ページでローカルマシンを登録します。「システム情報」アプリの「ハードウェア」ページで、マシンの「デバイス ID」を見つけることができます。
  4. 「プロファイル」ページで新しいプロビジョニングプロファイルを登録し、/path/to/yourapp.provisionprofile にダウンロードします。

Apple の App Sandbox を有効にする

Mac App Store に提出されたアプリは、Apple のApp Sandbox の下で実行する必要があり、App Sandbox で実行できるのは Electron の MAS ビルドのみです。Electron の標準 darwin ビルドは、App Sandbox 下で実行すると起動に失敗します。

@electron/osx-sign でアプリに署名すると、アプリの権利に自動的に必要な権利が追加されます。

electron-osx-sign を使用しない場合の手順

@electron/osx-sign を使用せずにアプリに署名する場合は、アプリバンドルの権利に少なくとも次のキーがあることを確認する必要があります。

entitlements.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.application-groups</key>
<array>
<string>TEAM_ID.your.bundle.id</string>
</array>
</dict>
</plist>

TEAM_ID は Apple Developer アカウントのチーム 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 には、Apple Developer アカウントのチーム ID を値とする ElectronTeamID キーが含まれている必要があります。

<plist version="1.0">
<dict>
...
<key>ElectronTeamID</key>
<string>TEAM_ID</string>
</dict>
</plist>

@electron/osx-sign を使用すると、ElectronTeamID キーは証明書の名前からチーム ID を抽出することにより自動的に追加されます。@electron/osx-sign が正しいチーム 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 にアップロードする必要があります。アップロードする前に、レコードを作成したことを確認してください。

「private APIs uses」のようなエラーが表示される場合は、アプリがElectronのMASビルドを使用しているかどうかを確認する必要があります。

審査のために提出

アップロード後、アプリを審査に提出する必要があります。

MASビルドの制限事項

アプリのサンドボックスのすべての要件を満たすために、MASビルドでは次のモジュールが無効になっています。

  • crashReporter
  • autoUpdater

また、次の動作が変更されています。

  • 一部の環境では、ビデオキャプチャが機能しない場合があります。
  • 特定のアクシビリティ機能が機能しない場合があります。
  • アプリはDNSの変更を認識しません。

また、アプリのサンドボックスを使用しているため、アプリがアクセスできるリソースは厳しく制限されています。詳細については、App Sandboxingを参照してください。

追加のエンタイトルメント

App Sandbox下で実行されるすべてのアプリは、悪意のあるコードによる潜在的な損害を制限する、限られた権限セットの下で実行されます。アプリが使用するElectron APIに応じて、アプリのエンタイトルメントファイルに追加のエンタイトルメントを追加する必要がある場合があります。そうしないと、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) => ({
// Ensure you return the right entitlements path here based on the file being signed.
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は、次の暗号化アルゴリズムを使用します。