Публикация десктоп-приложения в Mac App Store
Mac App Store предъявляет более строгие требования, чем прямое распространение: приложение должно работать в App Sandbox, использовать только разрешённые entitlements и пройти ревью Apple. Electron-приложения поддерживаются, но требуют специальной настройки.
Отличие MAS от прямого распространения
| Параметр | Mac App Store | Direct Distribution |
|---|---|---|
| Подпись | Mac App Distribution Certificate | Developer ID Certificate |
| Sandbox | Обязателен | Опционально |
| Нотаризация | Не нужна (ревью Apple) | Обязательна |
| Автообновления | App Store механизм | Squirrel/Sparkle |
| Ограничения API | Строже | Меньше |
Настройка electron-builder для MAS
# electron-builder.yml
mac:
target:
- target: mas # Mac App Store
- target: mas-dev # Для тестирования sandbox
provisioningProfile: build/embedded.provisionprofile
entitlements: build/entitlements.mas.plist
entitlementsInherit: build/entitlements.mas.inherit.plist
hardenedRuntime: false # MAS не требует hardened runtime
identity: "3rd Party Mac Developer Application: Company (TEAM_ID)"
Entitlements для MAS
<!-- build/entitlements.mas.plist -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<!-- App Sandbox — обязателен для MAS -->
<key>com.apple.security.app-sandbox</key><true/>
<!-- Сеть -->
<key>com.apple.security.network.client</key><true/>
<!-- Если нужен доступ к файлам -->
<key>com.apple.security.files.user-selected.read-write</key><true/>
<!-- Для Electron: JIT нужен в отдельном entitlement child -->
</dict>
</plist>
<!-- build/entitlements.mas.inherit.plist — для child процессов Electron -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key><true/>
<key>com.apple.security.inherit</key><true/>
</dict>
</plist>
Provisioning Profile
Нужен Mac App Store Distribution Profile:
- Зайти в developer.apple.com → Certificates, Identifiers & Profiles
- Создать App ID с нужными capabilities
- Создать Distribution Certificate (3rd Party Mac Developer)
- Создать Provisioning Profile типа Mac App Store
- Скачать
.provisionprofileи положить вbuild/
Сборка и валидация
# Сборка MAS-пакета
npx electron-builder --mac mas
# Валидация перед отправкой
xcrun altool --validate-app \
--file dist/mas/AppName.pkg \
--type osx \
--apiKey "YOUR_API_KEY" \
--apiIssuer "YOUR_ISSUER_UUID"
# Отправка в App Store Connect
xcrun altool --upload-app \
--file dist/mas/AppName.pkg \
--type osx \
--apiKey "YOUR_API_KEY" \
--apiIssuer "YOUR_ISSUER_UUID"
Современная альтернатива — xcrun notarytool и Transporter.app.
Ограничения App Sandbox
Sandbox запрещает ряд операций, к которым привыкли Electron-разработчики:
-
Нет прямого запуска shell-команд через
child_process.exec - Нет доступа к произвольным путям файловой системы
- Нет авто-запуска при старте системы (без LaunchAgent entitlement)
- Межпроцессное взаимодействие — только через XPC или App Groups
Для обхода части ограничений используют XPC Services — отдельные процессы с расширенными правами, которые вызываются из основного приложения.
GitHub Actions
- name: Build MAS
run: npx electron-builder --mac mas
env:
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
CSC_LINK: ${{ secrets.MAS_CERTIFICATE }}
CSC_KEY_PASSWORD: ${{ secrets.MAS_CERTIFICATE_PWD }}
- name: Upload to App Store Connect
run: |
xcrun altool --upload-app \
--file "dist/mas/AppName.pkg" \
--type osx \
--apiKey "${{ secrets.ASC_API_KEY }}" \
--apiIssuer "${{ secrets.ASC_ISSUER_ID }}"
Ревью Apple занимает от 1 до 7 дней. Обновления обычно проходят быстрее первой публикации.
Сроки
Настройка sandbox-совместимости, provisioning profiles и первая публикация в Mac App Store: 4–6 рабочих дней.







