Shipping a Mac app without a $99 Apple Developer account
Описание и применение
Kopi, бесплатный менеджер буфера обмена, использует самоподписанный сертификат, чтобы обойти ежегодную плату Apple за разработку, сохраняя разрешения пользователя между обновлениями, но требуя однократного подтверждения Gatekeeper.
Задача
How to ship a macOS app without paying the $99 annual Apple Developer Program fee while maintaining a good user experience.
Результат
Kopi can be distributed to macOS users without paying Apple’s $99 fee, preserving permission continuity across updates while accepting a single Gatekeeper warning on first launch.
Рабочий процесс
- Create a self‑signed code‑signing certificate and store its private key in the repo’s secrets.
- Sign every release with that certificate, producing a stable designated requirement based on bundle identifier and certificate leaf.
- Import the certificate into the keychain during the release workflow so Tauri can sign the app.
- Provide users with an install guide, a .dmg background, and a one‑line terminal script to bypass quarantine.
- After the first launch, users grant permissions once; subsequent updates are signed with the same certificate and install without quarantine, so Gatekeeper does not block them.
- Users can disable automatic updates in the app settings if desired.
Доказательства
On macOS, an app downloaded from the internet opens without a Gatekeeper warning only if it is signed with an Apple Developer ID certificate and notarized by Apple.
For an ad‑hoc signature, that requirement includes the build's own hash. Every new build has a new hash, so every new build looks like a different app to macOS.
I created a self‑signed code‑signing certificate and stored it in the repository's secrets. Every release is signed with it.
The workaround is to have the release workflow import the certificate into the keychain itself, then let the build sign with that identity.
The script doesn't quarantine the app, so Gatekeeper doesn't block the first launch.
- Дата записи: 2026-10-21T20:11:18.315Z