Ir al contenido

Compilar en macOS

En macOS, pyzed build crea un paquete de app, dist/Shop.app: una carpeta que Finder muestra como una sola app, con Python, Pyzed y tu código dentro.

  1. Instala uv si no lo tienes:

    Ventana de terminal
    curl -LsSf https://astral.sh/uv/install.sh | sh
  2. En la carpeta del proyecto, compila:

    Ventana de terminal
    uv run pyzed build
  3. Pruébala:

    Ventana de terminal
    open dist/Shop.app

macOS usa un icono .icns. Cada app de Mac tiene además un identificador de paquete, un dominio invertido como com.acme.shop que macOS usa para guardar sus ajustes y permisos. Fija ambos en pyproject.toml; el identificador llega a PyInstaller con args:

pyproject.toml
[tool.pyzed.build]
icon = "assets/icon.icns"
args = ["--osx-bundle-identifier", "com.acme.shop"]

Mira Iconos y metadatos para crear un .icns a partir de un PNG.

Gatekeeper revisa las apps descargadas de internet. Una app sin firmar ni notarizar queda bloqueada (“No se puede abrir Shop porque Apple no puede comprobar si contiene software malicioso”). La gente puede abrirla igual con clic derecho → Abrir, o en Ajustes del Sistema → Privacidad y seguridad → Abrir igualmente, pero para una versión real, fírmala y notarízala.

Necesitas una membresía del Apple Developer Program, un certificado Developer ID Application en tu llavero y una contraseña específica de app para tu Apple ID.

  1. Firma el paquete con el runtime reforzado y una marca de tiempo:

    Ventana de terminal
    codesign --force --deep --options runtime --timestamp \
    --sign "Developer ID Application: Tu Nombre (TEAMID)" dist/Shop.app
  2. Comprímelo con ditto (conserva los enlaces simbólicos y la firma del paquete) y envíalo al servicio de notarización de Apple:

    Ventana de terminal
    ditto -c -k --keepParent dist/Shop.app Shop.zip
    xcrun notarytool submit Shop.zip --wait \
    --apple-id tu@ejemplo.com --team-id TEAMID --password "$APPLE_APP_PASSWORD"
  3. Grapa el ticket a la app, para que abra incluso sin conexión:

    Ventana de terminal
    xcrun stapler staple dist/Shop.app

Comprueba el resultado con spctl --assess --verbose dist/Shop.app (“accepted, source=Notarized Developer ID”).

Los usuarios de Mac esperan un .dmg con la app y un acceso directo a Aplicaciones para arrastrarla.

Ventana de terminal
mkdir -p build/dmg
ditto dist/Shop.app build/dmg/Shop.app
ln -s /Applications build/dmg/Applications
hdiutil create -volname Shop -srcfolder build/dmg -fs HFS+ -format UDZO -ov Shop-macos-arm64.dmg
codesign --force --timestamp --sign "Developer ID Application: Tu Nombre (TEAMID)" Shop-macos-arm64.dmg

Notariza y grapa el .dmg igual que el zip de arriba. Así se crea el .dmg de Pyzed Design (mira macos_dmg en scripts/build_designer.py).

  • Dónde vive: la gente arrastra la app a /Applications, donde pueden escribir los usuarios administradores, así que la app puede actualizarse sola ahí.
  • Cuarentena: una app descargada lleva una marca de cuarentena hasta que el primer arranque pasa Gatekeeper. Para tus propias pruebas puedes quitarla con xattr -dr com.apple.quarantine dist/Shop.app; no se lo pidas a tus usuarios.
  • Permisos: si la app necesita la cámara, el micrófono u otros recursos protegidos, macOS pregunta al usuario. Añade las descripciones de uso al Info.plist del paquete con las opciones del archivo spec de PyInstaller; pyzed build no las fija por ti.