Mac App Store Submission Guide

    • How to sign Electron apps on macOS;
    • How to submit Electron apps to Mac App Store (MAS);
    • The limitations of the MAS build.

    To sign Electron apps, the following tools must be installed first:

    • Xcode 11 or above.
    • The npm module.

    You also have to register an Apple Developer account and join the Apple Developer Program.

    Electron apps can be distributed through Mac App Store or outside it. Each way requires different ways of signing and testing. This guide focuses on distribution via Mac App Store, but will also mention other methods.

    The following steps describe how to get the certificates from Apple, how to sign Electron apps, and how to test them.

    The simplest way to get signing certificates is to use Xcode:

    1. Open Xcode and open “Accounts” preferences;
    2. Sign in with your Apple account;
    3. Select a team and click “Manage Certificates”;
    4. In the lower-left corner of the signing certificates sheet, click the Add button (+), and add following certificates:
      • “Apple Development”
      • “Apple Distribution”

    The “Apple Development” certificate is used to sign apps for development and testing, on machines that have been registered on Apple Developer website. The method of registration will be described in .

    Apps signed with the “Apple Development” certificate cannot be submitted to Mac App Store. For that purpose, apps must be signed with the “Apple Distribution” certificate instead. But note that apps signed with the “Apple Distribution” certificate cannot run directly, they must be re-signed by Apple to be able to run, which will only be possible after being downloaded from the Mac App Store.

    Other certificates

    You may notice that there are also other kinds of certificates.

    The “Developer ID Application” certificate is used to sign apps before distributing them outside the Mac App Store.

    The “Developer ID Installer” and “Mac Installer Distribution” certificates are used to sign the Mac Installer Package instead of the app itself. Most Electron apps do not use Mac Installer Package so they are generally not needed.

    The full list of certificate types can be found .

    Apps signed with “Apple Development” and “Apple Distribution” certificates can only run under App Sandbox, so they must use the MAS build of Electron. However, the “Developer ID Application” certificate does not have this restrictions, so apps signed with it can use either the normal build or the MAS build of Electron.

    Legacy certificate names

    Apple has been changing the names of certificates during past years, you might encounter them when reading old documentations, and some utilities are still using one of the old names.

    • The “Apple Development” certificate was also named as “Mac Developer” and “Development”.

    Prepare provisioning profile

    If you want to test your app on your local machine before submitting your app to the Mac App Store, you have to sign the app with the “Apple Development” certificate with the provisioning profile embedded in the app bundle.

    1. Open the “Certificates, Identifiers & Profiles” page on the website.
    2. Add a new App ID for your app in the “Identifiers” page.
    3. Register your local machine in the “Devices” page. You can find your machine’s “Device ID” in the “Hardware” page of the “System Information” app.
    4. Register a new Provisioning Profile in the “Profiles” page, and download it to /path/to/yourapp.provisionprofile.

    Enable Apple’s App Sandbox

    Apps submitted to the Mac App Store must run under Apple’s , and only the MAS build of Electron can run with the App Sandbox. The standard darwin build of Electron will fail to launch when run under App Sandbox.

    When signing the app with @electron/osx-sign, it will automatically add the necessary entitlements to your app’s entitlements, but if you are using custom entitlements, you must ensure App Sandbox capacity is added:

    Extra steps without electron-osx-sign

    If you are signing your app without using @electron/osx-sign, you must ensure the app bundle’s entitlements have at least following keys:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    3. <plist version="1.0">
    4. <dict>
    5. <key>com.apple.security.app-sandbox</key>
    6. <true/>
    7. <key>com.apple.security.application-groups</key>
    8. <array>
    9. <string>TEAM_ID.your.bundle.id</string>
    10. </array>
    11. </dict>

    The TEAM_ID should be replaced with your Apple Developer account’s Team ID, and the your.bundle.id should be replaced with the App ID of the app.

    And the following entitlements must be added to the binaries and helpers in the app’s bundle:

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    3. <plist version="1.0">
    4. <dict>
    5. <key>com.apple.security.app-sandbox</key>
    6. <true/>
    7. <key>com.apple.security.inherit</key>
    8. <true/>
    9. </dict>
    10. </plist>

    And the app bundle’s Info.plist must include ElectronTeamID key, which has your Apple Developer account’s Team ID as its value:

    When using @electron/osx-sign the key will be added automatically by extracting the Team ID from the certificate’s name. You may need to manually add this key if @electron/osx-sign could not find the correct Team ID.

    To sign an app that can run on your development machine, you must sign it with the “Apple Development” certificate and pass the provisioning profile to @electron/osx-sign.

    1. electron-osx-sign YourApp.app --identity='Apple Development' --provisioning-profile=/path/to/yourapp.provisionprofile

    If you are signing without @electron/osx-sign, you must place the provisioning profile to YourApp.app/Contents/embedded.provisionprofile.

    The signed app can only run on the machines that registered by the provisioning profile, and this is the only way to test the signed app before submitting to Mac App Store.

    Sign apps for submitting to the Mac App Store

    To sign an app that will be submitted to Mac App Store, you must sign it with the “Apple Distribution” certificate. Note that apps signed with this certificate will not run anywhere, unless it is downloaded from Mac App Store.

    1. electron-osx-sign YourApp.app --identity='Apple Distribution'

    Sign apps for distribution outside the Mac App Store

    If you don’t plan to submit the app to Mac App Store, you can sign it the “Developer ID Application” certificate. In this way there is no requirement on App Sandbox, and you should use the normal darwin build of Electron if you don’t use App Sandbox.

    By passing --no-gatekeeper-assess, @electron/osx-sign will skip the macOS GateKeeper check as your app usually has not been notarized yet by this step.

    This guide does not cover App Notarization, but you might want to do it otherwise Apple may prevent users from using your app outside Mac App Store.

    However, this guide do not ensure your app will be approved by Apple; you still need to read Apple’s Submitting Your App guide on how to meet the Mac App Store requirements.

    Apple Transporter should be used to upload the signed app to App Store Connect for processing, making sure you have before uploading.

    If you are seeing errors like private APIs uses, you should check if the app is using the MAS build of Electron.

    Submit for review

    After uploading, you should .

    In order to satisfy all requirements for app sandboxing, the following modules have been disabled in the MAS build:

    • crashReporter
    • autoUpdater

    and the following behaviors have been changed:

    • Certain accessibility features may not work.
    • Apps will not be aware of DNS changes.

    Also, due to the usage of app sandboxing, the resources which can be accessed by the app are strictly limited; you can read for more information.

    Additional entitlements

    Depending on which Electron APIs your app uses, you may need to add additional entitlements to your app’s entitlements file. Otherwise, the App Sandbox may prevent you from using them.

    Network access

    Enable outgoing network connections to allow your app to connect to a server:

    1. <key>com.apple.security.network.client</key>
    2. <true/>

    Enable incoming network connections to allow your app to open a network listening socket:

    1. <key>com.apple.security.network.server</key>
    2. <true/>

    See the Enabling Network Access documentation for more details.

    dialog.showOpenDialog

    See the Enabling User-Selected File Access documentation for more details.

    dialog.showSaveDialog

    1. <key>com.apple.security.files.user-selected.read-write</key>

    See the Enabling User-Selected File Access documentation for more details.

    Depending on the countries in which you are releasing your app, you may be required to provide information on the cryptographic algorithms used in your software. See the encryption export compliance docs for more information.